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 = 0num1 = 1for i in range(10):num2 = num0 + num1yield num2num0 = num1num1 = num2for 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 = Falsebreak
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 掉,完整的执行过如下:

  1. 调用 open('pythonic.py'),返回的一个对象 obj,
  2. 调用 obj.__enter__() 方法,返回的值赋给 fp
  3. 执行 with 中的代码块
  4. 执行 obj.__exit__()
  5. 如果这个过程发生异常,将异常传给 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.r...
  • 《编写高质量代码:改善 Python 程序的91个建议》

转载请注明出处
本文链接:http://hatlonely.github.io/20...

几种实用的 pythonic 语法相关推荐

  1. Python五种实用的小技巧

    本文经"机器之心"授权,禁止二次转载. 作者:Peter Nistru 机器之心编译 参与:思 最开始学 Python 时,如果我能掌握这些方法,那么代码看起来会更加优美. 在本文 ...

  2. ipa解包打包工具_ios打包ipa的四种实用方法(.app转.ipa)

    总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Archive->三选 ...

  3. ios打包ipa的四种实用方法(.app转.ipa)

    [原]ios打包ipa的四种实用方法(.app转.ipa) 总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏- ...

  4. mysql replace 效率,MySQL replace实用场景 MySQL实现replace函数的几种实用场景

    想了解MySQL实现replace函数的几种实用场景的相关内容吗,_陈哈哈在本文为您仔细讲解MySQL replace实用场景的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:MySQL,r ...

  5. 【原】ios打包ipa的四种实用方法(.app转.ipa)

    原文地址为: [原]ios打包ipa的四种实用方法(.app转.ipa) 总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xc ...

  6. mysql哪个皮肤好用_MySQL实现replace函数的几种实用场景

    MySQL实现replace函数的几种实用场景,语句,安娜,场景,无极,至高 MySQL实现replace函数的几种实用场景 易采站长站,站长之家为您整理了MySQL实现replace函数的几种实用场 ...

  7. mysql函数使用场景_MySQL实现replace函数的几种实用场景

    REPLACE语法 REPLACE(String,from_str,to_str) 即:将String中所有出现的from_str替换为to_str,这里的from_str不支持正则匹配. 操作实例 ...

  8. macbook oracle 工具,Navicat for Oracle Mac 四种实用工具

    Navicat for Oracle Mac 凭借精心设计的用户界面,可以简便快捷地以安全且简单的方法创建.组织.访问和共享信息,优化 Oracle 管理.除了 Oracle 的核心功能外,Navic ...

  9. html怎么设置毛笔字体,三种实用的毛笔书法字体设计制作教程

    三种实用的毛笔书法字体设计制作教程 书法字体2015.09.08书法字体 毛笔字.书法字都非常漂亮,但现在除了少数书法家,书法爱好者能写的一手漂亮的书法外,很少有人能写好书法字了!作为设计师(特别是网 ...

最新文章

  1. request.getParameterMap()的坑
  2. SpringBoot 上传文件报错记录
  3. 从上往下 流式布局_揭秘做好网站结构优化的4步(下)
  4. idea设置自动清除不需要的import包,自动清除导包
  5. 百度云搜索引擎森林战士_重磅!天翼云联手百度智能云推出“天翼云百度智能建站”...
  6. 如何设计学术海报(翻译)
  7. vue如何获取tree当前选中的节点_vue Treeselect树形下拉框之获取选中节点的ids和lables操作...
  8. 190611每日一句
  9. 百度网盘——下载限速问题解决方案(油猴(Tampermonkey)+PanDownload网页版+IDM)
  10. Jquery 使用niceScroll.js 插件
  11. MicroSIP软电话安装配置说明
  12. 魔改010Editor Template 识别伪加密
  13. 如何使用SPSS判断数据的正态分布
  14. 处理机和CPU的区别
  15. word行首空格下划线_行首空格和下划线问题的解决
  16. 软件、宇宙、人生、扯淡
  17. 如何提高计算机网络速度,如何提高电脑网速方法
  18. 双相不锈钢S32750(2507)机械性能
  19. LTE模块连接网络调试助手(花生壳映射公网ip)
  20. 手把手教系列之梳状滤波器设计实现

热门文章

  1. 一个 冒泡排序 和 选择排序 的简单c程序
  2. golang 的 tag
  3. 关于laravel模板中生成URL的几种模式总结
  4. 上传文件的加密和下载文件解密
  5. 解决方案:Nginx高可用方案
  6. Node.js之------模块篇
  7. MongoDB的可视化工具之Navicat
  8. ConcurrentHashMap深度分析(JDK 1.8版本)
  9. 基于centos6.5搭建redis伪分布式主备节点
  10. 甘肃陇西雪后现雾凇 田野树林披“银装”