背景
python是一门优雅 简洁 明确的语言。接触 python 多年,处于边学边用的程度,一般是用其他语言的思路来写 python,不优雅,不简洁。
有幸读到 Jeff Knupp 的Writing Idiomatic Python,文中列出了一些 pythonic 的写法。 本实验列出一些实验君觉得很有用的部分,完整大家可参看以下 url。
http://downloads.niceware.com/TECH-pdf/PythonStyle-Writing_idiomatic_python_3.pdf
内容
布尔型的比较
python中的None 0 [] {} ''等都是 False,所以在数据异常校验逻辑操作的,不需要再做额外的操作如: if len(list) == 0。而是把==去掉。
alist = [1, 2, 3]if alist: print('list is empty') astr = ''if astr: print('string is empty') anone = Noneif anone: print('have a None') abool = Falseif abool: # not abool == False print('have a False, ')
复制代码
遍历访问可迭代对象
在遍历可迭代对象同时又需要获取其索引值的时候,可以使用enumerate来直接获取索引和值
之前 WedO 实验君经常会按照BAD的方式来写。
BAD
alist = [1, 2, 3]anohter_list = [4, 2, 3]for i in range(len(alist)): print(alist[i], another_list[i])
复制代码
GOOD
alist = [1, 2, 3]anohter_list = [4, 2, 3]for index, value in enumerate(alist): print(index, value, anohter_list[index])
复制代码
dict 字典访问
python的字典dict简直太优秀了,特别是处理json,需要哪里 get 哪里。但是可能会出现 key 不在字典里情况,处理不当可能会报错。不建议用[key]的方式,用get(key)。get 的函数默认如果可以不存在返回的是None。其实是可以指定初始化的值的。
configuration = {}log_severity = configuration.get('severity', 'Info')log_severity # Info
复制代码
推导表达式
推导表达式WedO 实验君觉得是最 pyhonic 的方式,简化循环判断操作。典型的样式[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ] == [op for xx in xx if xxx]。 可多层嵌套
some_other_list = range(10)some_list = [element + 5 for element in some_other_list if element%2 == 0]some_list# [5, 7, 9, 11, 13]
复制代码
字符拼接
记住有join这个函数
result_list = ['True', 'False', 'File not found']'|'.join(result_list)# True|False|File not found
复制代码
unpack
unpack 意思把列表等的元素获取出来。 可以用*代替部分的元素集合,用_变量放弃一些元素。
some_list = ['a', 'b', 'c', 'd', 'e'](first, second, *rest, _) = some_listprint(first) # aprint(rest) # ['c', 'd']
复制代码
使用 any/all 函数
##不推荐found = Falsefor item in a_list: if condition(item): found = True breakif found: # do something if found... ##推荐if any(condition(item) for item in a_list): # do something if found...
复制代码
尽量使用生成器代替列表
这个沿用python进阶-迭代器和生成器的例子
# baddef normal_iter(): ret = [] for i in range(10): ret.append(i**2) return ret# gooddef generator(): for i in range(10): yield i**2
复制代码
类的 __str__
class Point(): def __init__(self, x, y): self.x = x self.y = y def __str__(self): return '{0}, {1}'.format(self.x, self.y)p = Point(1, 2)print (p)
复制代码
结语
总结一下,pythonic 的宗旨是在不影响可读性的情况下,写尽可能少的代码。能写一行绝不写良好。希望对大家有帮助!
评论