几种实用的pythonic语法实例代码
前言
python是一门简单而优雅的语言,可能是过于简单了,不用花太多时间学习就能使用,其实python里面还有一些很好的特性,能大大简化你代码的逻辑,提高代码的可读性。
所谓Pythonic,就是极具Python特色的Python代码(明显区别于其它语言的写法的代码)
关于pythonic,你可以在终端打开python,然后输入importthis,看看输出什么,这就是TimPeters的《TheZenofPython》,这首充满诗意的诗篇里概况了python的设计哲学,而这些思想,其实在所有语言也基本上是通用的
Beautifulisbetterthanugly.
Explicitisbetterthanimplicit.
Simpleisbetterthancomplex.
Complexisbetterthancomplicated.
Flatisbetterthannested.
Sparseisbetterthandense.
Readabilitycounts.
Specialcasesaren'tspecialenoughtobreaktherules.
Althoughpracticalitybeatspurity.
Errorsshouldneverpasssilently.
Unlessexplicitlysilenced.
Inthefaceofambiguity,refusethetemptationtoguess.
Thereshouldbeone–andpreferablyonlyone–obviouswaytodoit.
Althoughthatwaymaynotbeobviousatfirstunlessyou'reDutch.
Nowisbetterthannever.
Althoughneverisoftenbetterthan*right*now.
Iftheimplementationishardtoexplain,it'sabadidea.
Iftheimplementationiseasytoexplain,itmaybeagoodidea.
Namespacesareonehonkinggreatidea–let'sdomoreofthose!
使用生成器yield
生成器是python里面一个非常有用的语法特性,却也是最容易被忽视的一个,可能是因为大部分能用生成器的地方也能用列表吧。
生成器可以简单理解成一个函数,每次执行到yield语句就返回一个值,通过不停地调用这个函数,就能获取到所有的值,这些值就能构成了一个等效的列表,但是与列表不同的是,这些值是不断计算得出,而列表是在一开始就计算好了,这就是lazyevaluation的思想。这个特性在数据量特别大的场景非常有用,比如大数据处理,一次无法加载所有的文件,使用生成器就能做到一行一行处理,而不用担心内存溢出
deffibonacci(): num0=0 num1=1 foriinrange(10): num2=num0+num1 yieldnum2 num0=num1 num1=num2 foriinfibonacci(): print(i)
用else子句简化循环和异常
if/else大家都用过,但是在python里面,else还可以用在循环和异常里面
#pythonic写法 forccin['UK','ID','JP','US']: ifcc=='CN': break else: print('noCN') #一般写法 no_cn=True forccin['UK','ID','JP','US']: ifcc=='CN': no_cn=False break ifno_cn: print('noCN')
else放在循环里面的含义是,如果循环全部遍历完成,没有执行break,则执行else子句
#pythonic写法 try: db.execute('UPDATEtableSETxx=xxWHEREyy=yy') exceptDBError: db.rollback() else: db.commit() #一般写法 has_error=False try: db.execute('UPDATEtableSETxx=xxWHEREyy=yy') exceptDBError: db.rollback() has_error=True ifnothas_error: db.commit()
else放到异常里面可以表示,如果没有异常发生需要执行的操作
用with子句自动管理资源
我们都知道,打开的文件需要在用完之后关闭,要不就会造成资源泄露,但是实际编程的时候经常会忘记关闭,特别是在一些逻辑复杂的场景中,更是如此,python有一个优雅地解决方案,那就是with子句
#pythonic写法 withopen('pythonic.py')asfp: forlineinfp: print(line[:-1]) #一般写法 fp=open('pythonic.py') forlineinfp: print(line[:-1]) fp.close()
使用withas语句后,无需手动调用fp.close(),在作用域结束后,文件会被自动close掉,完整的执行过如下:
- 调用open('pythonic.py'),返回的一个对象obj,
- 调用obj.__enter__()方法,返回的值赋给fp
- 执行with中的代码块
- 执行obj.__exit__()
- 如果这个过程发生异常,将异常传给obj.__exit__(),如果obj.__exit__()返回False,异常将被继续抛出,如果返回True,异常被挂起,程序继续运行
列表推导与生成器表达式
列表推导
[exprforiter_variniterableifcond_expr]
生成器表达式
(exprforiter_variniterableifcond_expr)
列表推导和生成器表达式提供了一种非常简洁高效的方式来创建列表或者迭代器
#pythonic写法 squares=[x*xforxinrange(10)] #一般写法 squares=[] forxinrange(10): squares.append(x*x)
用items遍历map
python里面map的遍历有很多种方式,在需要同事使用key和value的场合,建议使用items()函数
m={'one':1,'two':2,'three':3} fork,vinm.items(): print(k,v) fork,vinsorted(m.items()): print(k,v)
参考链接
Googlepython语言规范:http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_language_rules/
《编写高质量代码:改善Python程序的91个建议》
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。