写地道的Python
为什么80%的码农都做不了架构师?>>>
格式化
Python有一个语言定义的一组标准格式的规则,被称为PEP8。如果您正在浏览Python项目的提交信息,您可能会发现它们充满了PEP8清理信息。原因很简单:如果大家都同意一个共同的的命名和格式化公约,Python代码作为一个整体瞬间变得更容易被新手和经验丰富的开发人员接受。阅读PEP,在编辑器中安装一个PEP8的风格检查插件,并开始编写代码以其他的Python开发人员将共同遵循的方式。下面列出了几个例子。
交换两个变量时避免使用临时变量
在python中交换变量没有任何理由需要使用临时变量。我们可以使用元组,使我们的意图更加清晰。
#不好的写法
temp = foo
foo = bar
bar = temp
#惯用的
(foo, bar) = (bar, foo)
使用元组来分配参数
在python中,能够实现多个元素同时赋值。那些熟悉LISP可能知道这是'desctructuring bind’。
#不好的写法
list_from_comma_separated_value_file = ['dog', 'Fido', 10]
animal = list_from_comma_separated_value_file[0]
name = list_from_comma_separated_value_file[1]
age = list_from_comma_separated_value_file[2]
#惯用的
list_from_comma_separated_value_file = ['dog', 'Fido', 10]
(animal, name, age) = list_from_comma_separated_value_file
使用“.join”来连接一个单独的字符串列表中的元素
它的速度更快,使用更少的内存,你会看到它无处不反正。需要注意的是两个单引号表示我们创建的字符串列表元素之间的分隔符。
#不好的写法
result_list = ['True', 'False', 'File not found']
result_string = ''
for result in result_list:result_string += result
#惯用的
result_list = ['True', 'False', 'File not found']
result_string = ''.join(result_list)
在dict.get()中使用默认值
经常被忽视的get()的定义是默认的参数。如果不使用默认值(或collections.defaultdict类),你的代码将充斥着混乱。请记住,争取清晰。
#不好的写法
log_severity = None
if 'severity' in configuration:log_severity = configuration['severity']
else:log_severity = log.Info
#惯用的
log_severity = configuration.get('severity', log.Info)
使用上下文管理,以确保资源得到妥善管理
类似的语言的RAII的原则,如C++等(意味着要使用对象的语句),可以使资源管理更安全和更明确的。典型的例子是文件IO。
#不好的写法
file_handle = open(path_to_file, 'r')
for line in file_handle.readlines():if some_function_that_throws_exceptions(line):pass #do something
file_handle.close()
#惯用的
with open(path_to_file, 'r') as file_handle:for line in file_handle:if some_function_that_throws_exceptions(line):pass #do something
# No need to explicitly call 'close'. Handled by the File context manager
了解itertools模块的内容
如果你经常逛StackOverflow,您可能会注意到,形式的问题的答案:“为什么Python不能有以下明显有用的库函数吗?” 几乎总是引用itertools模块。itertools提供的函数式编程的中坚分子,应被视为基本构建块。更重要的是,itertools的文档中有一个“食谱”一节,提供使用itertools模块地道的实现常见的功能性编程结构。出于某种原因,似乎知道的“食谱”一节的Python开发人员的数量微乎其微。事实上,使用惯用语法的编写代码的开发者必须要知道的一部分是itertools,尤其当你重新造轮子。
条件分支应避免被放置在同一行上
使用缩进来表示范围(如果在Python你已经这样做了),可以很容易地确定将被执行的条件语句的一部分。
#不好的写法
if name: print (name)
print address
#惯用的
if name:print (name)
print address
避免在一行中有多个语句
虽然语言的定义允许使用分号来让一行有多个语句,但是这样做没有道理的,因为代码更难阅读。通常情况下违背以前的规则。
#不好的写法
if this_is_bad_code: rewrite_code(); make_it_more_readable();
#惯用的
if this_is_bad_code: rewrite_code()make_it_more_readable()
在复合的if语句中避免重复的变量名
当一个人想要检查的一些值,反复列出正在检查的变量,它的值是不必要的冗长。使用临时集合的意图明显。
#不好的写法if name == 'Tom' or name == 'Dick' or name == 'Harry':is_generic_name = True
#惯用的if name in ('Tom', 'Dick', 'Harry'):is_generic_name = True
使用列表解析创建现有数据的子集列表
#不好的写法some_other_list = range(1, 100)my_weird_list_of_numbers = list()for element in some_other_list:if is_prime(element):my_weird_list_of_numbers.append(element+5)
#惯用的some_other_list = range(1, 100)my_weird_list_of_numbers = [element + 5 for element in some_other_list if is_prime(element)]
使用“in”关键字来遍历一个可迭代的对象
#不好的写法my_list = ['Larry', 'Moe', 'Curly']index = 0while index < len(my_list):print (my_list[index])index+=1
#惯用的
my_list = ['Larry', 'Moe', 'Curly']
for element in my_list:print element
在循环中使用枚举函数,而不是创建一个“索引”变量
使用来自其他语言的程序员显式地声明一个变量来跟踪一个循环容器中的索引。例如,在C++
for (int i=0; i < container.size(); ++i)
{// Do stuff
}
在Python中,内建的函数 enumerate 能够实现
#不好的写法
index = 0
for element in my_container:print (index, element)index+=1
#惯用的
for index, element in enumerate(my_container):print (index, element)
转载于:https://my.oschina.net/xlplbo/blog/378074
写地道的Python相关推荐
- python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路
原标题:你所不知道的Python|函数参数的演进之路 函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的 ...
- python学完那部分能写爬虫_[Python]新手写爬虫全过程(已完成)
今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在tx ...
- 如何写新的Python OP
如何写新的Python OP Paddle 通过 py_func 接口支持在Python端自定义OP. py_func的设计原理在于Paddle中的Tensor可以与numpy数组可以方便的互相转换, ...
- 写了个Python脚本监控nginx进程
写了个Python脚本监控nginx进程 « Xiaoxia[PG] 写了个Python脚本监控nginx进程 接上一文用iptables让SSH服务对陌生人说不.还是有点担心这个学期内,nginx可 ...
- python编程可视化小程序_人人都可以写的可视化Python小程序第二篇:旋转的烟花...
兴趣是最好的老师 枯燥的编程容易让人放弃,兴趣才是最好的老师.无论孩子还是大人,只有发现这件事情真的有趣,我们才会非常执着的去做这件事,比如打游戏.如果编程能像玩游戏一样变得有趣,我相信很多人就特别愿 ...
- python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...
原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...
- 使用python完成的一个烟花小程序-人人都可以写的可视化Python小程序第二篇:旋转的烟花...
兴趣是最好的老师 枯燥的编程容易让人放弃,兴趣才是最好的老师.无论孩子还是大人,只有发现这件事情真的有趣,我们才会非常执着的去做这件事,比如打游戏.如果编程能像玩游戏一样变得有趣,我相信很多人就特别愿 ...
- 你可能不知道的Python面试秘籍 干货满满(附带参考答案)上篇
Q1.Python中的列表和元组有什么区别? 你可能不知道的Python面试秘籍 干货满满(附带参考答案)上篇 Q2.Python的主要功能是什么? Python是一种解释型语言.与C语言等语言不同, ...
- python的for语句写新的字符串_python写for循环python字符串排序方法
一般情况下,python中对一个字符串排序相当麻烦: 一.python中的字符串类型是不允许直接改变元素的.必须先把要排序的字符串放在容器里,如list. 二.python中的list容器的sort( ...
最新文章
- ssd2828测试进入测试模式_LOL卡牌推出“远征”轮抽模式 本周再度开启线上测试...
- php获取date前1分钟hour,php时间轴函数,刚、1分钟前、1小时前、一天前
- STC89C52单片机 数码管静态显示
- 分布式、高并发、多线程,到底有什么区别?
- Apple 预计于内华达州雷诺市再盖一个数据中心
- mongodb如何快速进行版本升级
- 如何使div像星星一样,简易demo,授人以鱼,自行更改完善
- 学生电脑哪个牌子好_常亮补光灯哪个牌子好服务至上
- Java 数组常用操作一(排序、元素位置查找、添加元素、获取长度、数组反向、最大值最小值、合并、范围填充)
- java静态注解处理器_深入理解Java:注解(Annotation)--注解处理器
- Linux中级之lvs三个模式的图像补充(nat,dr,tun)
- Mybatis中取循环获取 Oracle自增序列 重复值问题
- Blender建模练习:人物模型多边形建模流程图解(二形体调整篇)
- 手机酒店预订的革命之作——全新艺龙无线手机客户端测评
- Clouda安装和使用过程详解
- PO与VO之间的相互转换
- 一语道破本质——哪有什么35岁的砍?能力才是这个时代的铁饭碗!
- java获取三个月之前时间与当前时间
- pytorch优化器详解:SGD
- 解决jupyter notebook无法跳转浏览器
热门文章
- 标题栏透明android,android改变标题栏的透明度
- android屏幕共享实现方式,基于WebRtc在Android端实现屏幕共享
- 在python中、如果异常并未被处理或捕捉_Python异常处理总结
- oracle往游标中存数据,Oracle数据库:ORACLE11G在存储过程里面遍历游标
- mysql操作数据库的步骤,Golang操作MySql数据库的完整步骤记录
- linux 自启动脚本顺序,(linux开机启动脚本的顺序.doc
- android6变化,一次尝鲜体验 关于一加6升级Android P后的变化
- 单机上搭建Node集群
- Android添加拍照功能,Android自定义相机,添加水印
- rocketmq linux环境下载地址,Linux下RocketMQ下载安装教程