当前位置:主页 > 查看内容

Pythonic风格代码有什么好处?附12个代码实例

发布时间:2021-05-26 00:00| 位朋友查看

简介:pythonic是开发者们在写python代码过程中总结的编程习惯,崇尚优雅、明确、简单。就好比中文笔画,有先后顺序,最符合文字书写的习惯。 因为是习惯,不是江湖规则,所以你大可不必遵守pythonic,但如果你想成为python高手,最好是养成这个习惯。 对比其他语……

pythonic是开发者们在写python代码过程中总结的编程习惯,崇尚优雅、明确、简单。就好比中文笔画,有先后顺序,最符合文字书写的习惯。

因为是习惯,不是江湖规则,所以你大可不必遵守pythonic,但如果你想成为python高手,最好是养成这个习惯。

对比其他语言我们能直观看出pythonic风格的特点,比如写一个简单循环。

在Java里这样的:

  1. for index in (indexindex < items.length ; index++) 
  2.  { 
  3.   item = items[index]; 
  4.  ... now do something 
  5.  } 

尝试用python来写循环,则非常简洁易懂:

  1. for item in items: 
  2.   item.perform_action() 

想要更加pythonic,用生成器表达式来写循环:

  1. (item.some_attribute for item in items) 

这样的写法其实已经接近自然语言,一眼能看出代码意思。

如果你在Python IDE中输入import python,则会看到下面一首诗:

美胜于丑,简胜于繁,这就是Python哲学。

有一本书《effctive python》里面讲到蛮多pythonic的写法,下面列出一些常见的代码。

1、用列表推导式来取代map、filter

map、filter需要编写额外的lambda函数,用起来比较复杂,而且效率也不高。

列表推导式则非常简洁,通过循环创建列表。

  1. # 任务:找到列表中可以被2整除的数,并作二次方运算。 
  2.  
  3. # 非pythonic方法 
  4. a = [1,2,3,4,5,6,7,8,9,10] 
  5. result = map(lambda x: x**2 ,filter(lambda x: x%2==0,a)) 
  6.  
  7. # pythonic方法 
  8. a = [1,2,3,4,5,6,7,8,9,10] 
  9. result = [x**2 for x in a if x%2==0] 

2、用生成器表达式来代替数据量较大的列表推导

列表推导式虽然简洁,但是不适合大数据量的生成,因为可能会把内存占满。这时就要用到生成器表达式,它返回生成器,基本不占用内存。

  1. # 任务:对十亿条数据进行求平方根操作 
  2.  
  3. # 非pythonic方法 
  4. a = [1,2,3,4,5,6,7,8,9,10] # 假装这里有十亿个数字 
  5. result = [x**0.5 for x in a] 
  6.  
  7. # pythonic方法 
  8. a = [1,2,3,4,5,6,7,8,9,10]# 假装这里有十亿个数字 
  9. result = (x**0.5 for x in a) 

3、尽量使用enumerate

enumerate可以把迭代器包装成生成器,每次遍历时,会同时列出数据和数据下标。

  1. # 任务:打印列表中每个元素的索引 
  2.  
  3. # 非pythonic方法 
  4. a = ['apple','banana','orange'
  5. for i in range(len(a)): 
  6.     print(a[i],':',i) 
  7.  
  8. # pythonic方法 
  9. a = ['apple','banana','orange'
  10. for i,j in enumerate(a): 
  11.     print(i,':',j) 

4、使用with方法处理文件

with语句提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

  1. # 任务:读取一个txt文件 
  2.  
  3. # 非pythonic方法 
  4. f = open("some_file.txt"
  5. try: 
  6.   data = f.read() 
  7.   # 其他文件操作.. 
  8. finally: 
  9.   f.close() 
  10.  
  11. # pythonic方法 
  12. with open("some_file.txt"as f: 
  13.   data = f.read() 
  14.   # 其他文件操作... 

5、使用map函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的可迭代对象。

  1. # 任务:对比两个列表相同索引位置元素的大小,输出较大值 
  2.  
  3. # 非pythonic方法 
  4. a = [1,5,7] 
  5. b = [2,4,6] 
  6. for i in range(len(a)): 
  7.     if a[i] > b[i]: 
  8.         print(a[i]) 
  9.     else
  10.         print(b[i]) 
  11.  
  12. # pythonic方法 
  13. a = [1,5,7] 
  14. b = [2,4,6] 
  15. for i,j in zip(a,b): 
  16.     if i > j: 
  17.         print(i) 
  18.     else
  19.         print(j) 

6、每行只写一段语句

  1. # 非pythonic方法 
  2. print ('one'); print ('two'
  3.  
  4. if x == 1: print ('one'
  5.  
  6. # pythonic方法 
  7. print ('one'); 
  8. print ('two'
  9.  
  10. if x == 1: 
  11.     print ('one'

7、缩进

续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐3。

当使用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行。

  1. # 非pythonic方法 
  2. # 没有使用垂直对齐时,禁止把参数放在第一行 
  3. foo = long_function_name(var_one, var_two, 
  4.     var_three, var_four) 
  5.  
  6. # 当缩进没有与其他行区分时,要增加缩进 
  7. def long_function_name( 
  8.     var_one, var_two, var_three, 
  9.     var_four): 
  10.     print(var_one) 
  11.  
  12. # pythonic方法 
  13. # 与左括号对齐 
  14. foo = long_function_name(var_one, var_two, 
  15.                          var_three, var_four) 
  16.  
  17. # 用更多的缩进来与其他行区分 
  18. def long_function_name( 
  19.         var_one, var_two, var_three, 
  20.         var_four): 
  21.     print(var_one) 
  22.  
  23. # 挂行缩进应该再换一行 
  24. foo = long_function_name( 
  25.     var_one, var_two, 
  26.     var_three, var_four) 

8、 import 导入要分行

  1. # 非pythonic方法 
  2. import sys, os 
  3.  
  4. # pythonic方法 
  5. import os 
  6. import sys 
  7. from subprocess import Popen, PIPE 

9、交换两个变量的值

  1. # 非pythonic方法 
  2. a = 'hello' 
  3. b = 'world' 
  4. temp = a 
  5. a = b 
  6. b = temp 
  7. print(a, b) 
  8.  
  9.  
  10. # pythonic方法 
  11. a = 'hello' 
  12. b = 'world' 
  13. a, b = b, a 
  14. print(a, b) 

10、使用join方法拼接字符串

  1. # 非pythonic方法 
  2. a = ['w','o','r','l','d'
  3. b = '' 
  4. for i in a: 
  5.     b+=i 
  6. print(b) 
  7.  
  8.  
  9. # pythonic方法 
  10. a = ['w','o','r','l','d'
  11. b = ''.join(a) 
  12. print(b) 

11、判断一个值是否为True、空列表、None

  1. # 非pythonic方法 
  2. if x == True
  3.     pass 
  4. if len(y) == 0: 
  5.     pass 
  6. if z == None: 
  7.     pass 
  8.  
  9.  
  10. # pythonic方法 
  11. if x: 
  12.     pass 
  13. if not y: 
  14.     pass 
  15. if z is None: 
  16.     pass 

12、pythonic风格函数

  • 命名合理
  • 具有单一功能
  • 包含文档注释
  • 返回一个值
  • 函数和类应该用两个空行隔开
  • 尽量使用内置函数

补充

最后说下PEP8规范,PEP8是Python的编码规范,其目的在于提高代码的可读性。

写python代码时,在保证准确的前提下,要尽可能遵守PEP8。

PEP8含义:

常见规则:



本文转载自网络,原文链接:https://mp.weixin.qq.com/s?__biz=MzA3ODYwNDkzOQ==&mid=2659063881&idx=1&sn=9b3fd5ce76c16380462df2edad2e5643&chksm=84ca87adb3bd0ebbee45cda9dadcda5f962de94b149890c4ae9cde70fac3ad62086d85d095bd&mpshare=1&
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:Libtask源码解析之锁 下一篇:没有了

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐