文档章节

写地道的Python

borey
 borey
发布于 2015/02/12 15:18
字数 1248
阅读 48
收藏 1

格式化

    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 = 0
 while 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)


本文转载自:http://www.pythonpub.com/article/1483

共有 人打赏支持
上一篇: dup和dup2函数
下一篇: Python基本语法
borey
粉丝 28
博文 55
码字总数 31182
作品 0
深圳
程序员
私信 提问
福利 | Python专场竞技,这些书给你加把力!

端午节将至,各地龙舟备战竞技,粽子部队也整装待发。小编掐指一算,这种热闹的时节,是时候展现真正的技(fu)术(li)了! (“Python号”龙舟闪亮登场!) Python作为当下最流行的编程语言...

2018/06/15
0
0
Python|19个优雅的Python编程技巧,涨姿势

Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀...

糖宝lsh
2018/12/04
0
0
Python书单(内附获取方法)

Python书单 Python 之所以这么流行得益于它适用于很多不同领域,目前 Python 使用最广泛的领域包括有 Python Web(后端)开发、数据分析挖掘、网络爬虫、机器学习人工智能、运维开发等等。不...

_小迷糊
2018/07/27
0
0
看看9种编程语言的发明者是怎么说的

从Node.js到C++,看他们的发明者是如何评价他们的语言的未来。 Ryan Dahl:Node.js 问:它的主要优势是什么? Dahl:Node与其他的语言有一点明显的区别,就是处理I/O。所以它永远不允许用户锁...

oschina
2012/06/08
17.6K
39
《趣学Python编程》习题总结

上周买了本书叫《趣学Python编程》(英文名:Python for kids),昨天看完后把书后面的题都做了下。由于第1、2章没有习题,第13章及之后都是描写实例的章节,因此这个总结性的文章中只包含了...

北风其凉
2014/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

给windows server中的“未识别的网络”或“无法识别的网络”设置网络位置类型

在windows server中,如果网络没有被正确的识别,那么就需要手工设置一下网络位置类型。 将“公用网络”指定设置为“专用网络“ 【控制面板】--【系统和安全】--【管理工具】--【本地安全策略...

gugudu
54分钟前
1
0
阿里强制要求的21条Java开发规范,可以避免很多坑

1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。 2. 【强制】所有的覆写方法,必须加@Override注解。 说明:getObject...

天王盖地虎626
今天
7
0
oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110

查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time ......

hnairdb
今天
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linux-tao
今天
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxprobe16
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部