2022年1月份,寒假在家,从市图书馆借了Brett Slatkin的《Effective Python》(机械工业出版社,2016),记录下我认为有用的方法。
第1章 用Pythonic方式来思考
第7条 用列表推导来取代 map 和 filter
列表推导可以根据一份列表来制作另外一份。例如,要用列表中每个元素的平方值构建另一份列表。
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares = [x**2 for x in a]
print(squares)
>>>
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
字典和集合也支持推导表达式。
chile_ranks ={'ghost': 1, 'habanero': 2, 'cayenne': 3}
rank_dict = {rank : name for name, rank in chile_ranks.items()}
chile_len_set = {len(name) for name in rank_dict.values()}
print(rank_dict)
print(chile_len_set)
>>>
{1: 'ghost', 2: 'habanero', 3: 'cayenne'}
{8, 5, 7}
第10条 尽量用 enumerate 取代 range
当迭代列表的时候,通常还想知道当前元素在列表中的索引。例如,要按照喜好程度打印出自己爱吃的冰淇淋口味。enumerate
的第二个参数指定开始计数时所用的值,默认为0。
flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']
for i, flavor in enumerate(flavor_list, 1):
print('%d: %s' % (i, flavor))
>>>
1: vanilla
2: chocolate
3: pecan
4: strawberry
第11条 用 zip 函数同时遍历两个迭代器
通过列表推导,很容易就能根据某个表达式从源列表推算出一份派生列表。如果想平行地迭代两份列表,可以使用zip
函数,把两个或两个以上的迭代器封装成生成器,以便稍后求值。
names = ['Cecilia', 'Lise', 'Marie']
letters = [len(n) for n in names]
for name, count in zip(names, letters):
if count > max_letters:
longest_name = name
max_letters = count
第2章 函数
读了本章和后续章节后,发现难度较大,看不太懂,就不做记录了。
Python支持面向对象,也有类和继承的概念。对并行计算的支持似乎不好。