写点什么

python 之 pythonic

  • 2022 年 5 月 08 日
  • 本文字数:1415 字

    阅读完需:约 5 分钟

背景

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 的宗旨是在不影响可读性的情况下,写尽可能少的代码。能写一行绝不写良好。希望对大家有帮助!





发布于: 刚刚阅读数: 2
用户头像

公众号:人工智能微客(weker) 2019.11.21 加入

人工智能微客(weker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
python之pythonic_Python_AIWeker-人工智能微客_InfoQ写作社区