python之pythonic

python小知识2026年6月7日2

python之pythonic

实验背景

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 = None
if anone:
    print('have a None') 
    
abool = False
if 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_list
print(first) # a
print(rest) # ['c', 'd']

使用any/all函数

##不推荐
found = False
for item in a_list:
  if condition(item):
    found = True
    break
if found:
  # do something if found... 
 
##推荐
if any(condition(item) for item in a_list):
  # do something if found...

尽量使用生成器代替列表

这个沿用python进阶-迭代器和生成器的例子

# bad
def normal_iter():
    ret = []
    for i in range(10):
        ret.append(i**2)
    return ret
# good
def 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的宗旨是在不影响可读性的情况下,写尽可能少的代码。能写一行绝不写良好。希望对大家有帮助!