几种实用的pythonic语法实例代码


Posted in Python onFebruary 24, 2018

前言

python 是一门简单而优雅的语言,可能是过于简单了,不用花太多时间学习就能使用,其实 python 里面还有一些很好的特性,能大大简化你代码的逻辑,提高代码的可读性。

所谓Pythonic,就是极具Python特色的Python代码(明显区别于其它语言的写法的代码)

关于 pythonic,你可以在终端打开 python,然后输入 import this,看看输出什么,这就是 Tim Peters 的 《The Zen of Python》,这首充满诗意的诗篇里概况了 python 的设计哲学,而这些思想,其实在所有语言也基本上是通用的

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one? and preferably only one ?obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea ? let's do more of those!

使用生成器 yield

生成器是 python 里面一个非常有用的语法特性,却也是最容易被忽视的一个,可能是因为大部分能用生成器的地方也能用列表吧。

生成器可以简单理解成一个函数,每次执行到 yield 语句就返回一个值,通过不停地调用这个函数,就能获取到所有的值,这些值就能构成了一个等效的列表,但是与列表不同的是,这些值是不断计算得出,而列表是在一开始就计算好了,这就是 lazy evaluation 的思想。这个特性在数据量特别大的场景非常有用,比如大数据处理,一次无法加载所有的文件,使用生成器就能做到一行一行处理,而不用担心内存溢出

def fibonacci():
 num0 = 0
 num1 = 1
 for i in range(10):
  num2 = num0 + num1
  yield num2
  num0 = num1
  num1 = num2
for i in fibonacci():
 print(i)

用 else 子句简化循环和异常

if / else 大家都用过,但是在 python 里面,else 还可以用在循环和异常里面

# pythonic 写法
for cc in ['UK', 'ID', 'JP', 'US']:
 if cc == 'CN':
  break
else:
 print('no CN')
# 一般写法
no_cn = True
for cc in ['UK', 'ID', 'JP', 'US']:
 if cc == 'CN':
  no_cn = False
  break
if no_cn:
 print('no CN')

else 放在循环里面的含义是,如果循环全部遍历完成,没有执行 break,则执行 else 子句

# pythonic 写法
try:
 db.execute('UPDATE table SET xx=xx WHERE yy=yy')
except DBError:
 db.rollback()
else:
 db.commit()
# 一般写法
has_error = False
try:
 db.execute('UPDATE table SET xx=xx WHERE yy=yy')
except DBError:
 db.rollback()
 has_error = True
if not has_error:
 db.commit()

else 放到异常里面可以表示,如果没有异常发生需要执行的操作

用 with 子句自动管理资源

我们都知道,打开的文件需要在用完之后关闭,要不就会造成资源泄露,但是实际编程的时候经常会忘记关闭,特别是在一些逻辑复杂的场景中,更是如此,python 有一个优雅地解决方案,那就是 with 子句

# pythonic 写法
with open('pythonic.py') as fp:
 for line in fp:
  print(line[:-1])
# 一般写法
fp = open('pythonic.py')
for line in fp:
 print(line[:-1])
fp.close()

使用 with as 语句后,无需手动调用 fp.close() , 在作用域结束后,文件会被自动 close 掉,完整的执行过如下:

  • 调用 open('pythonic.py') ,返回的一个对象 obj,
  • 调用 obj.__enter__() 方法,返回的值赋给 fp
  • 执行 with 中的代码块
  • 执行 obj.__exit__()
  • 如果这个过程发生异常,将异常传给 obj.__exit__() ,如果 obj.__exit__() 返回 False, 异常将被继续抛出,如果返回 True,异常被挂起,程序继续运行

列表推导与生成器表达式

列表推导

[expr for iter_var in iterable if cond_expr]

生成器表达式

(expr for iter_var in iterable if cond_expr)

列表推导和生成器表达式提供了一种非常简洁高效的方式来创建列表或者迭代器

# pythonic 写法
squares = [x * x for x in range(10)]
# 一般写法
squares = []
for x in range(10):
 squares.append(x * x)

用 items 遍历 map

python 里面 map 的遍历有很多种方式,在需要同事使用 key 和 value 的场合,建议使用 items() 函数

m = {'one': 1, 'two': 2, 'three': 3}
for k, v in m.items():
 print(k, v)
for k, v in sorted(m.items()):
 print(k, v)

参考链接

Google python 语言规范: http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules/

《编写高质量代码:改善 Python 程序的91个建议》

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python 时间操作例子和时间格式化参数小结
Apr 24 Python
Python及PyCharm下载与安装教程
Nov 18 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python 执行终端/控制台命令的例子
Jul 12 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
详解BeautifulSoup获取特定标签下内容的方法
Dec 07 Python
使用Python爬取最好大学网大学排名
Feb 24 #Python
python opencv 直方图反向投影的方法
Feb 24 #Python
python爬虫爬取淘宝商品信息
Feb 23 #Python
python爬取淘宝商品详情页数据
Feb 23 #Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 #Python
python列表生成式与列表生成器的使用
Feb 23 #Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 #Python
You might like
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
javascript事件问题
2009/09/05 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python PO设计模式的具体使用
2019/08/16 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python数据正态性检验实现过程
2020/04/18 Python
深入了解python列表(LIST)
2020/06/08 Python
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
三好学生个人先进事迹材料
2014/05/17 职场文书
好人好事演讲稿
2014/09/01 职场文书
2014年团委工作总结
2014/11/13 职场文书
超市店长竞聘书
2015/09/15 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL