python伪代码书写规范_代码这样写更优雅(Python 版)(转载)

Python 这门语言最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。但有时候我们写代码,特别是 Python 初学者,往往还是按照其它语言的思维习惯来写,那样的写法不仅运行速度慢,代码读起来也费尽,给人一种拖泥带水

的感觉,过段时间连自己也读不懂。

《计算机程序的构造和解释》的作者哈尔·阿伯尔森曾这样说:“Programs must be written for people to read, and only incidentally for machines to execute.”

要写出 Pythonic(优雅的、地道的、整洁的)代码,还要平时多观察那些大牛代码,Github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,笔者列举一些常见的 Pythonic 写法,希望能给你带来一点启迪。

1、变量交换

大部分编程语言中交换两个变量的值时,不得不引入一个临时变量:

>>> a= 1

>>> b= 2

>>> tmp= a

>>> a= b

>>> b= tmp

pythonic

>>> a, b = b, a

2、循环遍历区间元素

foriin[0,1,2,3,4,5]:

(printi)

# 或者

foriinrange(6):

(printi)

pythonic

foriinxrange(6):

(printi)

xrange 返回的是生成器对象,生成器比列表更加节省内存,不过需要注意的是 xrange 是 python2 中的写法,python3 只有 range 方法,特点和 xrange 是一样的。

3、带有索引位置的集合遍历

遍历集合时如果需要使用到集合的索引位置时,直接对集合迭代是没有索引信息的,普通的方式使用:

colors= ['red','green','blue','yellow']

foriinrange(len(colors)):

print(i,'--->',colors[i])

pythonic

fori,color inenumerate(colors):

print(i,'--->',color)

4、字符串连接

字符串连接时,普通的方式可以用 + 操作

names= ['raymond','rachel','matthew','roger',

'betty','melissa','judith','charlie']

s= names[0]

forname innames[1:]:

s+= ', '+ name

print(s)

pythonic

print (', '.join(names))

join 是一种更加高效的字符串连接方式,使用 + 操作时,每执行一次+操作就会导致在内存中生成一个新的字符串对象,遍历8次有8个字符串生成,造成无谓的内存浪费。而用 join 方法整个过程只会产生一个字符串对象。

5、打开/关闭文件

执行文件操作时,最后一定不能忘记的操作是关闭文件,即使报错了也要 close。普通的方式是在 finnally 块中显示的调用 close 方法。

f= open('data.txt')

try:

data= f.read()

finally:

f.close()

pythonic

withopen('data.txt')asf:

data= f.read()

使用 with 语句,系统会在执行完文件操作后自动关闭文件对象。

6、列表推导式

能够用一行代码简明扼要地解决问题时,绝不要用两行,比如

result= []

foriinrange(10):

s= i*2

result.append(s)

pythonic

[i*2 for i in xrange(10)]

与之类似的还有生成器表达式、字典推导式,都是很 pythonic 的写法。

7、善用装饰器

装饰器可以把与业务逻辑无关的代码抽离出来,让代码保持干净清爽,而且装饰器还能被多个地方重复利用。比如一个爬虫网页的函数,如果该 URL 曾经被爬过就直接从缓存中获取,否则爬下来之后加入到缓存,防止后续重复爬取。

defweb_lookup(url,saved={}):

ifurl insaved:

returnsaved[url]

page= urllib.urlopen(url).read()

saved[url]= page

returnpage

pythonic

importurllib#py2

#import urllib.request as urllib # py3

defcache(func):

saved= {}

defwrapper(url):

ifurl insaved:

returnsaved[url]

else:

page= func(url)

saved[url]= page

returnpage

returnwrapper

defweb_lookup(url):

returnurllib.urlopen(url).read()

用装饰器写代码表面上感觉代码量更多,但是它把缓存相关的逻辑抽离出来了,可以给更多的函数调用,这样总的代码量就会少很多,而且业务方法看起来简洁了。

8、合理使用列表

列表对象(list)是一个查询效率高于更新操作的数据结构,比如删除一个元素和插入一个元素时执行效率就非常低,因为还要对剩下的元素进行移动

names= ['raymond','rachel','matthew','roger',

'betty','melissa','judith','charlie']

names.pop(0)

names.insert(0,'mark')

pythonic

fromcollectionsimportdeque

names= deque(['raymond','rachel','matthew','roger',

'betty','melissa','judith','charlie'])

names.popleft()

names.appendleft('mark')

deque 是一个双向队列的数据结构,删除元素和插入元素会很快

9、序列解包

p= 'vttalk','female',30,'python@qq.com'

name= p[0]

gender= p[1]

age= p[2]

email= p[3]

pythonic

name, gender, age, email = p

10、遍历字典的 key 和 value

方法一速度没那么快,因为每次迭代的时候还要重新进行hash查找 key 对应的 value。

方法二遇到字典非常大的时候,会导致内存的消耗增加一倍以上

# 方法一

forkind:

print(k,'--->',d[k])

# 方法二

fork,vind.items():

print(k,'--->',v)

pythonic

fork,vind.iteritems():

print(k,'--->',v)

iteritems 返回迭代器对象,可节省更多的内存,不过在 python3 中没有该方法了,只有 items 方法,等值于 iteritems。

当然还有很多 pythonic 写法,在此不再一一列举,说不定有第二期,欢迎留言。觉得不错就zan一个吧 (^o^)/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php处理ajax post请求超时,php – 如何处理AJAX请求中的会话超时

考虑返回一个http状态为401,一个JSON对象详细说明原因.如果你正在使用jQuery,那么你将会丢失你的error()回调,然后你可以解析你的对象.$.ajax({data: {},dataType: html,success: function(data) {// do whatever here},type: POST,url: myserver.com,error: function(XMLHttpR…

python三元表达式求值_python 三元表达式的 列表推导式 生成器推导式

python中三元表达式的语法如下 if elseresult x if condition else y另外一种三元表达式,比较少见result (x, y)[condition]列表推导式 〉循环python中列表推导式用于使用其他列表创建一个新列表。其基本形式为: [表达式 for 变量 in 列表]list_1_10 …

php 同一行,php – 如何在同一行中对类方法进行多个调用?

通过“ – >”逐个调用类的功能的方式因为该函数返回同一个对象的类.见下面的例子.你会得到这个class Wke {public $type;public $errno;public $msg;public $page;public $template $this;public function notify(){return $this;}public function errorno($error){$this-…

PHP数组

//常用函数//生成随机数echo rand(1,10);//两个参数来确定随机数的范围,必须要两个参数 //日期时间函数var_dump(time());//取当前时间的UNIX时间戳echo date("Y-m-d H:i:s",time());//格式化日期时间戳echo date("Y-m-d H:i:s");//省掉第二个参数&#xf…

pycharm python部署_使用PyCharm配合部署Python的Django框架的配置纪实

安装软件安装 Python 2.7、PyCharm、pip(Python包管理工具)、Django ( pip install Django)部署PyCharm 新建Django工程完成后,其目录如下:子目录MyDjangoProject下表示工程的全局配置,分别为setttings.py、urls.py和wsgi.py,其中setttings.p…

php商品在最少购买,ECSHOP给商品设置最少购买数量的方法

ecshop后台默认没有给商品设置最小起订量或者最少购买量的功能。保哥在使用ecshop做一个商城时,要给商品设置包邮来吸引买家,但又不想买家购买一件产品也给包邮,这样很容易亏本。对于价值较高的商品有一定的利润空间设置包邮是合情合理的&…

Crawler - 如何爬取列表后进行文章的爬取

2019独角兽企业重金招聘Python工程师标准>>> 已知BUG:(version:5) 1-爬取后生成的XML默认编码是Java环境决定导入数据库可能出问题 方法修改xml编码后导入 重点CL 和 CI命令 CL 是爬取List列表 会通过file生成文件 CI 中file是CL执行后生存的File文件 CL…

程序员出差是去干什么_让我来告诉你,35岁以上的人都在干什么!

欢迎关注专栏:里面定期分享Android和Flutter架构技术知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。Android高级进阶​zhuanlan.zhihu.com让我来告诉你,35岁以上的人都在干什…

oracle v¥bh,【oracle笔记2】约束

约束*约束是添加在列上的,用来约束列的。1. 主键约束(唯一标识)***非空******唯一******被引用***(外键时引用主键)*当表的某一列被指定为主键后,该列就不能为空,不能有重复的出现。*创建表时指定主键的两种方式:>create table…

WAP端 touch事件触发顺序记录

IOS7.0 safari 滚动滚动条的时候, 最后手指放开 (scroll 总是在 touchend后面,所以要用 setTimeout)   touchstart touchmove(多个) touchend scroll(一个)IOS8.4 safari 滚动滚动条的时候   touchstart touchmove…

opencv入门_【OpenCV入门之十八】通过形态学操作提取水平与垂直线

小白导读学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更加容易理解。如果小伙伴觉…

php strstr 从尾部,PHP strstr() 和 strrchr() 详解

strstr() 和 strrchr()有一定的相似性,所以放在一起。strstrstrstr ( string $haystack , mixed $needle [, bool $before_needle FALSE ] ) : stringneedle 可以为单个字符,也可以是个字符串。返回 needle 在 haystack 在第一次出现的位置到结束&#…

python计算结果传给spark_Spark入门:流计算简介(Python版)

数据总体上可以分为静态数据和流数据。对静态数据和流数据的处理,对应着两种截然不同的计算模式:批量计算和实时计算。批量计算以“静态数据”为对象,可以在很充裕的时间内对海量数据进行批量处理,计算得到有价值的信息。Hadoop就…

【译】NoClassDefFoundError和ClassNotFoundException的不同

本文翻译自:Difference between NoClassDefFoundError vs ClassNotFoundExcepiton in Java 如果JVM或者ClassLoader在加载类时找不到对应的类,就会引发NoClassDefFoundError和ClassNotFoundException,这两种错误都非常严重。由于不同的ClassL…

oracle怎么设置出蓝色边,Oracle 数据库入门之———————-,多行函数-蓝色留心...

2,多行函数SQL> –工资总额SQL> select sum(sal) from emp;SUM(SAL)29025SQL> –人数SQL> select count(*) from emp;COUNT(*)14SQL> –平均工资SQL> select sum(sal)/count(*) 一,avg(sal) 二 from emp;一 二2073.21429 2073.21429SQL> –平均…

python绘制剖面图_用python绘制剖面图

我自己为这个功能做了一个模块。在import pandas as pdfrom pandas import Series, DataFrameimport numpy as npimport matplotlib.pyplot as pltdef Profile(x,y,nbins,xmin,xmax,ax):df DataFrame({x : x , y : y})binedges xmin ((xmax-xmin)/nbins) * np.arange(nbins1…

Ubuntu上安装Robomongo及添加到启动器

到目前为止,Robomongo仍是MongoDB最好的客户端管理工具,如需在Ubuntu上安装Robomongo,可直接从官网下载.tar.gz压缩包进行解压,然后直接运行bin目录下的robomongo文件即可启动界面。例如我将下载下来的.tar.gz压缩包解压到/usr/lo…

python打开手机网页_Python3 Windows服务器简单实现 手机访问

设备1. PC with Win102. Python 3.5.1步骤打开CMD,cd 到e盘,mkdir pythonWebserver 建立文件夹//在E盘建立文件夹,作为服务器的根目录。如:e:\pythonWebserver直接输入命令:python -m http.server 8000//以默认的地址——本地ip&a…

oracle开归档服务器,ORACLE RAC 启用归档

ORACLE RAC 启用归档1、关闭所有节点数据库实例c:\>srvctl stop database -d apts2、修改服务器配置参数sql>startup mountsql>alter system set cluster_databasefalse scopespfile;sql>shutdown immediate3、调整归档日志路径sql>startup mountsql>alter s…

pagefile.sys and heberfil.sys

dub 删除heberfil.sys大文件的方法 方法1:Windows/system32中的cmd.exe 输入 powercfg -h off,即可关闭休眠功能,同时 Hiberfil.sys 文件也会自动删除。 方法2:运行命令gpedit.msc打开策略组 依次打开Computer Configuration——Administrative Template…