effective python读书笔记——列表的推导式
列表推导式来代替map函数来在原来列表基础上构造新列表更加简洁:
a=[1,2,2,2,3,4,5]
#运用map函数构造列表
map_method=list(map(lambda x:x**2,a))
#列表推导法
list_method=[x**2 for x in a]
#列表推导法可过滤原列表
even_number_list=[x**2 for x in a if x%2==0]#只要偶数
#map函数也可以通过filter方法来实现,略难
map_even_number=list(map(lambda x:x**2,filter(lambda x:x%2==0,a)))
#字典推导
dictionary_method={x:x**2 for x in a if x%2==0}#{:}
#集合推导
set_method={x**2 for x in a if x%2==0}#{}
#而用map方法来实现,就更加复杂了
map_dictionary=dict(map(lambda x:(x,x**2),filter(lambda x:x%2==0,a)))
map_set=set(map(lambda x:(x,x**2),filter(lambda x:x%2==0,a)))
print(f'map_method :{map_method}')
print(f'list_method :{list_method}')
print(f'even_number_list :{even_number_list}')
print(f'map_even_number :{map_even_number}')
print(f'dictionary_method :{dictionary_method}')
print(f'set_method :{set_method}')#集合中的元素是无序的,同样的元素只出现一次
print(f'map_set :{map_set}')
print(f'map_dictionary :{map_dictionary}')

关于表达式的嵌套:
matrix=[[1,2,3],[4,5,6],[7,8,9]]#一个矩阵
#用列表表达式转化成列表
turn_to_list=[x for row in matrix for x in row]
#也可以对原二维矩阵进行数值转化
square_list=[[x**2 for x in row ] for row in matrix]#对每个数进行平方
#但如果是三维矩阵的话,用此方法就显得比较复杂
matrix_3=[[[1,2],[3,4]],[[5,6],[7,8]]]
turn_to_list3=[x for sublist1 in matrix_3 for sublist2 in sublist1 for x in sublist2]
#用正常的for循环就比较清晰
for_method=[]
for sublist1 in matrix_3:
for sublist2 in sublist1:
for_method.extend(sublist2)
'''
for i in sublist2:
for_method.append(i)
'''
print(f'turn_to_list :{turn_to_list}')
print(f'square_list :{square_list}')
print(f'turn_to_list3 :{turn_to_list3}')
print(f'for_method :{for_method}')

关于if条件的使用:
#同一层循环内的if语句默认为and关系
a=[1,2,3,4,5]
b=[x for x in a if x<4 if x%2!=0]
c=[x for x in a if x<4 and x%2!=0]
#b,c两写法等价
print(f'b : {b}')
print(f'c : {c}')
#每一层的子表达式也都可以有if条件
matrix=[[1,2,3],[4,5,6],[7,8,9]]
#筛选出各行元素和大于10的,并只保留整除3的项
selected=[[x for x in row if x%3==0]\
for row in matrix if sum(row)>10]
print(f'selected :{selected}')
