0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

常见的Pythonic写法汇总

马哥Linux运维 来源:未知 作者:胡薇 2018-10-19 15:03 次阅读

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。

0. 程序必须先让人读懂,然后才能让计算机执行。

“Programs must be written for people to read, and only incidentally for machines to execute.”

1. 交换赋值

##不推荐temp=aa=bb=a##推荐a,b=b,a#先生成一个元组(tuple)对象,然后unpack

2. Unpacking

##不推荐l=['David','Pythonista','+1-514-555-1234']first_name=l[0]last_name=l[1]phone_number=l[2]##推荐l=['David','Pythonista','+1-514-555-1234']first_name,last_name,phone_number=l#Python3Onlyfirst,*middle,last=another_list

3. 使用操作符in

##不推荐iffruit=="apple"orfruit=="orange"orfruit=="berry":#多次判断##推荐iffruitin["apple","orange","berry"]:#使用in更加简洁

4. 字符串操作

##不推荐colors=['red','blue','green','yellow']result=''forsincolors:result+=s#每次赋值都丢弃以前的字符串对象,生成一个新对象##推荐colors=['red','blue','green','yellow']result=''.join(colors)#没有额外的内存分配

5. 字典键值列表

##不推荐forkeyinmy_dict.keys():#my_dict[key]...##推荐forkeyinmy_dict:#my_dict[key]...#只有当循环中需要更改key值的情况下,我们需要使用my_dict.keys()#生成静态的键值列表。

6. 字典键值判断

##不推荐ifmy_dict.has_key(key):#...dosomethingwithd[key]##推荐ifkeyinmy_dict:#...dosomethingwithd[key]

7. 字典 get 和 setdefault 方法

##不推荐navs={}for(portfolio,equity,position)indata:ifportfolionotinnavs:navs[portfolio]=0navs[portfolio]+=position*prices[equity]##推荐navs={}for(portfolio,equity,position)indata:#使用get方法navs[portfolio]=navs.get(portfolio,0)+position*prices[equity]#或者使用setdefault方法navs.setdefault(portfolio,0)navs[portfolio]+=position*prices[equity]

8. 判断真伪

##不推荐ifx==True:#....iflen(items)!=0:#...ifitems!=[]:#...##推荐ifx:#....ifitems:#...

9. 遍历列表以及索引

##不推荐items='zeroonetwothree'.split()#method1i=0foriteminitems:printi,itemi+=1#method2foriinrange(len(items)):printi,items[i]##推荐items='zeroonetwothree'.split()fori,iteminenumerate(items):printi,item

10. 列表推导

##不推荐new_list=[]foritemina_list:ifcondition(item):new_list.append(fn(item))##推荐new_list=[fn(item)foritemina_listifcondition(item)]

11. 列表推导-嵌套

##不推荐forsub_listinnested_list:iflist_condition(sub_list):foriteminsub_list:ifitem_condition(item):#dosomething...##推荐gen=(itemforslinnested_listiflist_condition(sl)\foriteminslifitem_condition(item))foritemingen:#dosomething...

12. 循环嵌套

##不推荐forxinx_list:foryiny_list:forzinz_list:#dosomethingforx&y##推荐fromitertoolsimportproductforx,y,zinproduct(x_list,y_list,z_list):#dosomethingforx,y,z

13. 尽量使用生成器代替列表

##不推荐defmy_range(n):i=0result=[]whilei

14. 中间结果尽量使用imap/ifilter代替map/filter

##不推荐reduce(rf,filter(ff,map(mf,a_list)))##推荐fromitertoolsimportifilter,imapreduce(rf,ifilter(ff,imap(mf,a_list)))*lazyevaluation会带来更高的内存使用效率,特别是当处理大数据操作的时候。

15. 使用any/all函数

##不推荐found=Falseforitemina_list:ifcondition(item):found=Truebreakiffound:#dosomethingiffound...##推荐ifany(condition(item)foritemina_list):#dosomethingiffound...

16. 属性(property)

=

##不推荐classClock(object):def__init__(self):self.__hour=1defsetHour(self,hour):if25>hour>0:self.__hour=hourelse:raiseBadHourExceptiondefgetHour(self):returnself.__hour##推荐classClock(object):def__init__(self):self.__hour=1def__setHour(self,hour):if25>hour>0:self.__hour=hourelse:raiseBadHourExceptiondef__getHour(self):returnself.__hourhour=property(__getHour,__setHour)

17. 使用 with 处理文件打开

##不推荐f=open("some_file.txt")try:data=f.read()#其他文件操作..finally:f.close()##推荐withopen("some_file.txt")asf:data=f.read()#其他文件操作...

18. 使用 with 忽视异常(仅限Python 3)

##不推荐try:os.remove("somefile.txt")exceptOSError:pass##推荐fromcontextlibimportignored#Python3onlywithignored(OSError):os.remove("somefile.txt")

19. 使用 with 处理加锁

##不推荐importthreadinglock=threading.Lock()lock.acquire()try:#互斥操作...finally:lock.release()##推荐importthreadinglock=threading.Lock()withlock:#互斥操作...

20. 参考

1) Idiomatic Python:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

2) PEP 8: Style Guide for Python Code:http://www.python.org/dev/peps/pep-0008/

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92385
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83466

原文标题:符合语言习惯的 Python 优雅编程技巧

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PCB三防工艺缺陷问题汇总

    今天分享是《三防喷涂工艺缺陷问题案例汇总》 资料。
    的头像 发表于 12-29 10:10 269次阅读
    PCB三防工艺缺陷问题<b class='flag-5'>汇总</b>

    机械制图常见错误汇总

    今天分享是《机械制图常见错误》 资料。
    的头像 发表于 12-26 10:41 352次阅读
    机械制图<b class='flag-5'>常见</b>错误<b class='flag-5'>汇总</b>

    insert into 语句的三种写法

    INSERT INTO是MySQL中常用的一种SQL语句,用于将数据插入到表中。此文将详细介绍INSERT INTO语句的三种不同写法及其用途,并提供代码示例和相关解释。 正文: 一、基本插入
    的头像 发表于 11-21 14:18 2807次阅读

    insertinto语句的三种写法

    插入数据是关系数据库基本的操作之一,它允许用户将数据插入已经创建的表中。在关系数据库中,通过使用INSERT INTO语句可以将数据插入到表中的一个或多个列中。 INSERT INTO语句有三种常见
    的头像 发表于 11-17 15:12 1201次阅读

    PCB设计过程中常见问题汇总

    不注意就会在细节上出错,导致严重的后果。 针对PCB设计过程中常见的问题进行汇总和分析,希望能够对大家的设计和制作工作带来一定的帮助,避免失误! 1、图形设计不均匀。造成图形电镀时,电流分布不匀
    发表于 11-16 16:43

    串口发送的这几种写法,你用过几种?

    串口发送的这几种写法,你用过几种?
    的头像 发表于 11-02 16:20 708次阅读
    串口发送的这几种<b class='flag-5'>写法</b>,你用过几种?

    无线MCU调试技巧汇总

    无线MCU调试技巧汇总
    的头像 发表于 10-17 14:56 375次阅读
    无线MCU调试技巧<b class='flag-5'>汇总</b>

    pcb常见缺陷汇总

    pcb板作为电子元件的载体,是影响PCBA产品质量的一个重要因素,pcb电路板集成度越高越复杂,pcb在生产过程中出现缺陷的概率就好越大,那么pcb常见的缺陷有哪些?本文捷多邦小编将对此进行详细介绍。
    的头像 发表于 09-14 10:34 844次阅读

    常见电子元器件等效电路汇总

    常见电子元器件等效电路汇总 电子元器件的等效电路对电路分析非常有用,可以帮助理解该元器件在电路中的工作原理,可以深入了解该元器件的相关特性。 贴片电容器等效电路 下图所示是贴片电容器的等效电路
    的头像 发表于 09-05 21:22 863次阅读
    <b class='flag-5'>常见</b>电子元器件等效电路<b class='flag-5'>汇总</b>

    求助,求使用计数器生成内部复位的推荐写法

    使用计数器生成内部复位的推荐写法
    发表于 08-11 06:10

    西门子SMART200PLC一键启停的几种写法

    在生产中,由于安装环境,成本控制,操作便利等因素,会用到一键启停的控制,比如电机控制,阀门控制等等,今天我给大家聊聊常见的几种写法,为了直观通俗,我们用LAD(梯形图)来写。
    发表于 07-14 09:21 2226次阅读
    西门子SMART200PLC一键启停的几种<b class='flag-5'>写法</b>

    C语言main函数的正确写法

    大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言main函数的正确写法,希望能对你有所帮助
    发表于 07-11 11:51 437次阅读
    C语言main函数的正确<b class='flag-5'>写法</b>

    常见芯片类型汇总

    随着现代电子产品的繁荣,芯片已经成为了各种电子设备不可或缺的组成部分。虽然芯片听起来有些抽象,但它们实际上可以被分为不同的类型。下面我们来一起了解一些常见的芯片类型。
    的头像 发表于 06-15 10:39 3477次阅读

    光模块使用过程中常见的问题汇总

    光模块是一种较为敏感的光学器件,在使用过程中常常会出现很多问题,在本文中将光模块的一些常见问题进行了汇总
    的头像 发表于 05-23 16:08 1018次阅读
    光模块使用过程中<b class='flag-5'>常见</b>的问题<b class='flag-5'>汇总</b>

    一文汇总常见的通讯协议

    在我们日常进行硬件电路设计以及选用各种模拟IC的时候经常会遇到这些RS485, IIC, SMBus, PMBus, SPI, RS232, CAN, LIN, UART, PHY通讯协议接口,今天我们汇总了这些主要的协议。
    的头像 发表于 05-12 17:39 1.1w次阅读