如何写出更加pythonic的代码(二)

2019-01-07  本文已影响2人  不存在的一角

前言


上回说到,如何从格式入手让我们写的代码看的更加舒服,更加优雅,也给大家推荐了 Google开源项目Python风格指南

https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/

这次我们来从代码入手,看看有哪些点可以让你的代码更加pythonic

正文

1、交换两个变量


一般的情况下我们会用到一个临时变量

t = a
a = b
b = t

但在更加pythonic的方法是

a, b = b, a

2、列表推导式


列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表
它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if和for语句为上下文的表达式运行完成之后产生

来看几个例子

test = [i for i in range(15) if i % 3 is 0]
print(test)
# [0, 3, 6, 9, 12]

特别是当你需要使用for循环来生成一个新列表,你通常会这样做:

test= []
for x in range(10):
    test.append(x**2)

但可以使用列表推导式来简化它:

test = [x**2 for x in range(10)]

3、上下文管理器


上下文管理器的常用于一些资源的操作,需要在资源的获取与释放相关的操作,一个典型的例子就是数据库的连接,查询,关闭处理

我们在打开文件进行处理,过程中也可能会出错,但是,我们希望在出错的情况下,也能顺利关闭文件

file = open('xxx', 'w')
try:
    file.write('zzz')
finally:
    file.close()

这时候就推荐大家使用with语句,它确保我们的文件会被关闭,而不用关注嵌套代码如何退出

with open('xxx', 'w') as f:
    f.write('zzz!')

4、Enumerate


enumerate()是python的内置函数,在字典上是枚举、列举的意思
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值,多用于在for循环中得到计数

对于一个列表要遍历其索引及元素是通常会

list = ["one", "two", "three", "four"]
for i in range (len(list)):
    print i ,list[i]

而利用 enumerate 就显得更加优美一点

list = ["one", "two", "three", "four"]
for index, item in enumerate(list):
    print index, item

5、链式比较


比如要你判断一个数是否在10 到 20之间,是的话就是出 ok

age = 12
if age > 10 and age < 20:
    print("ok")

事实上可以写的更简单一点

if 10 < age < 20:
    print("ok")

6、真值判断


if a == True:
    run()

# 判断列表是否为空
if len(list1) != 0: 
    run()

还显示地与 True 和 False 做比较就显得多此一举

if a:
    run()
 
if list1:
    run()

7、字符串反转


普通的方法要反转字符串可以这样从字符串的最后一个索引按步长为 -1 倒着取,再添加给新的字符串,但是这样显得过于复杂

s = 'string'
def reverse(s):
    t = ''
    for x in range(len(s)-1,-1,-1):
        t += s[x]
    return t

pythonic 的写法则是:

s = 'string'
def reverse(s):
    return s[::-1] 

是不是简洁的一匹,用于检测回文的话,就是一句话input == input[::-1]的事!

注意:Python3 中取消了 xrange,Python3 中的 range 就等价于 Python2 中的 xrange

8、字符串连接


现在有个字符串列表,要求以空格连接起来 输出为yuan shi de dan shen ri chang

strList = ["yuan", "shi", "de", "dan", "shen", "ri", "chang"]  

不 pythonic 的方式是这样的

res = ''
for s in strList:
    res += s + ' '

# yuan shi de dan shen ri chang 最后还有个多余空格

事实上你可以一行代码搞定这个

res =  ' '.join(strList)
# yuan shi de dan shen ri chang

9、三元符替代


让你判断一下 a 如果大于 6 则返回 7,否则返回 5

你可能会用 if...else... 或者联想到别的语言中的 a ? b : c

a = 4
if a > 6:
    b = 7
else:
    b = 5
print(b) # 5

pythonic 的做法则是

# 如果 a>6 的结果为真,b = 7, 如果为假,b = 5
b = 7 if a > 6 else 5
print(b) # 5

结束

"如何写出更加pythonic的代码" 部分就到这里

这里只是列了一小部分,其实还有很多的 pythonic 的语法来让代码变得更加优雅简洁,诸如装饰器,生成器等,这些还需要你去探索发现


print('微信公众号搜索 "猿狮的单身日常" ,Java技术升级、虫师修炼,我们 不见不散!')
print('也可以扫下方二维码哦~')
猿狮的单身日常
上一篇下一篇

猜你喜欢

热点阅读