15个Pythonic的代码示例(值得收藏)

作者:zx 时间:2022-07-27 21:21:19 

Python由于语言的简洁性,让我们以人类思考的方式来写代码,新手更容易上手,老鸟更爱不释手。

要写出 Pythonic(优雅的、地道的、整洁的)代码,还要平时多观察那些大牛代码,Github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,这里小明收集了一些常见的 Pythonic 写法,帮助你养成写优秀代码的习惯。

01. 变量交换

Bad


tmp = a
a = b
b = tmp

Pythonic


a,b = b,a

02. 列表推导

Bad


my_list = []
for i in range(10):
 my_list.append(i*2)

Pythonic


my_list = [i*2 for i in range(10)]

03. 单行表达式

虽然列表推导式由于其简洁性及表达性,被广受推崇。

但是有许多可以写成单行的表达式,并不是好的做法。

Bad


print 'one'; print 'two'

if x == 1: print 'one'

if <complex comparison> and <other complex comparison>:
 # do something

Pythonic


print 'one'
print 'two'

if x == 1:
 print 'one'

cond1 = <complex comparison>
cond2 = <other complex comparison>
if cond1 and cond2:
 # do something

04. 带索引遍历

Bad


for i in range(len(my_list)):
 print(i, "-->", my_list[i])

Pythonic


for i,item in enumerate(my_list):
 print(i, "-->",item)

05. 序列解包

Pythonic


a, *rest = [1, 2, 3]
# a = 1, rest = [2, 3]

a, *middle, c = [1, 2, 3, 4]
# a = 1, middle = [2, 3], c = 4

06. 字符串拼接

Bad


letters = ['s', 'p', 'a', 'm']
s=""
for let in letters:
 s += let

Pythonic


letters = ['s', 'p', 'a', 'm']
word = ''.join(letters)

07. 真假判断

Bad


if attr == True:
 print 'True!'

if attr == None:
 print 'attr is None!'

Pythonic


if attr:
 print 'attr is truthy!'

if not attr:
 print 'attr is falsey!'

if attr is None:
 print 'attr is None!'

08. 访问字典元素

Bad


d = {'hello': 'world'}
if d.has_key('hello'):
 print d['hello']  # prints 'world'
else:
 print 'default_value'

Pythonic


d = {'hello': 'world'}

print d.get('hello', 'default_value') # prints 'world'
print d.get('thingy', 'default_value') # prints 'default_value'

# Or:
if 'hello' in d:
 print d['hello']

09. 操作列表

Bad


a = [3, 4, 5]
b = []
for i in a:
 if i > 4:
   b.append(i)

Pythonic


a = [3, 4, 5]
b = [i for i in a if i > 4]
# Or:
b = filter(lambda x: x > 4, a)

Bad


a = [3, 4, 5]
for i in range(len(a)):
 a[i] += 3

Pythonic


a = [3, 4, 5]
a = [i + 3 for i in a]
# Or:
a = map(lambda i: i + 3, a)

10. 文件读取

Bad


f = open('file.txt')
a = f.read()
print a
f.close()

Pythonic


with open('file.txt') as f:
 for line in f:
   print line

11. 代码续行

Bad


my_very_big_string = """For a long time I used to go to bed early. Sometimes, \
 when I had put out my candle, my eyes would close so quickly that I had not even \
 time to say “I'm going to sleep.”"""

from some.deep.module.inside.a.module import a_nice_function, another_nice_function, \
 yet_another_nice_function

Pythonic


my_very_big_string = (
 "For a long time I used to go to bed early. Sometimes, "
 "when I had put out my candle, my eyes would close so quickly "
 "that I had not even time to say “I'm going to sleep.”"
)

from some.deep.module.inside.a.module import (
 a_nice_function, another_nice_function, yet_another_nice_function)

12. 显式代码

Bad


def make_complex(*args):
 x, y = args
 return dict(**locals())

Pythonic


def make_complex(x, y):
 return {'x': x, 'y': y}

13. 使用占位符

Pythonic


filename = 'foobar.txt'
basename, _, ext = filename.rpartition('.')

14. 链式比较

Bad


if age > 18 and age < 60:
 print("young man")

Pythonic


if 18 < age < 60:
 print("young man")

理解了链式比较操作,那么你应该知道为什么下面这行代码输出的结果是 False


>>> False == False == True
False

15. 三目运算

这个保留意见。随使用习惯就好。

Bad


if a > 2:
 b = 2
else:
 b = 1
#b = 2

Pythonic


a = 3  

b = 2 if a > 2 else 1
#b = 2

参考文档
http://docs.python-guide.org/en/latest/writing/style/
https://foofish.net/idiomatic_part2.html

来源:https://blog.csdn.net/weixin_36338224/article/details/108962337

标签:Pythonic
0
投稿

猜你喜欢

  • python OpenCV实现答题卡识别判卷

    2023-12-20 17:27:57
  • python3中apply函数和lambda函数的使用详解

    2022-03-12 00:08:22
  • 一个典型的PHP分页实例代码分享

    2023-11-14 23:17:39
  • 详解Vue内部怎样处理props选项的多种写法

    2024-05-03 15:10:39
  • django_orm查询性能优化方法

    2021-03-01 20:30:19
  • VS2013连接MySQL5.6成功案例一枚

    2024-01-20 17:36:51
  • 另类读写:ACCESS中Field对象的标题属性

    2008-11-28 16:47:00
  • php正则过滤html标签、空格、换行符的代码(附说明)

    2023-07-22 07:58:01
  • Python imutils 填充图片周边为黑色的实现

    2021-04-13 04:06:32
  • Pytest+Request+Allure+Jenkins实现接口自动化

    2021-04-09 13:50:44
  • asp常用的SQL命令操作

    2007-09-29 12:21:00
  • MySQL查询字段实现字符串分割split功能的示例代码

    2024-01-22 03:18:55
  • JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome

    2024-04-16 09:37:25
  • OracleEXP和IMP用法和介绍

    2010-07-28 13:18:00
  • python嵌套字典比较值与取值的实现示例

    2023-12-25 01:28:35
  • python实现人人网登录示例分享

    2022-06-25 09:17:51
  • MySQL数据库重命名的快速且安全方法(3种)

    2024-01-27 23:33:54
  • python如何对实例属性进行类型检查

    2021-08-17 09:28:19
  • SQL使用ROW_NUMBER() OVER函数生成序列号

    2024-01-18 18:14:35
  • 用XML创建可排序、分页的数据显示页面

    2008-04-22 18:25:00
  • asp之家 网络编程 m.aspxhome.com