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

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

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

[[382298]]

因为是习惯,不是江湖规则,所以你大可不必遵守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含义:

 

常见规则:


 

 

责任编辑:华轩 来源: Python大数据分析
相关推荐

2023-01-11 11:35:40

重构PythonPythonic

2023-09-26 12:04:15

重构技巧Pythonic

2023-02-06 12:00:00

重构PythonPythonic

2024-11-12 12:52:39

Python代码函数

2020-10-25 19:58:04

Pythonic代码语言

2013-06-06 10:10:59

项目项目代码代码风格

2017-07-10 14:58:23

JavaScript代码风格写作准则

2018-01-02 16:30:27

Python爬虫微博移动端

2021-08-24 13:05:25

TypeScript代码前端

2017-09-08 12:15:54

Python代码Pythonic

2024-10-08 05:00:00

PEP 8编码Python

2013-03-19 09:40:44

CookiesCookies跟踪个人隐私

2019-04-29 08:31:25

PythonPandas数据

2012-07-27 10:30:12

重构

2022-11-24 10:34:05

CSS前端

2015-11-02 09:25:07

jQuery代码片段

2010-07-28 15:42:44

Flex

2022-03-10 08:01:06

CSS技巧选择器

2020-11-20 10:22:34

代码规范设计

2022-08-19 14:24:30

forPythonpythonic
点赞
收藏

51CTO技术栈公众号