文档章节

写地道的Python

borey
 borey
发布于 2015/02/12 15:18
字数 1248
阅读 44
收藏 1
点赞 0
评论 0

格式化

    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

共有 人打赏支持
borey
粉丝 26
博文 54
码字总数 31182
作品 0
深圳
程序员
福利 | Python专场竞技,这些书给你加把力!

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

⋅ 06/15 ⋅ 0

python中#!/usr/bin/python与#!/usr/bin/env python的区别

目的是在运行python脚本的时候告诉操作系统我们要用python解释器去运行py脚本 所以我们在第一句往往会写如下两句中的其中一句: 或 就是说在没有在执行程序时指出用什么程序运行py脚本时,系统...

p柯西 ⋅ 06/15 ⋅ 0

Python程序员专栏欢迎您的投稿

1、关于投稿 关注我们Python程序员知乎专栏:https://zhuanlan.zhihu.com/pythoncxy 的小伙伴已经快2w人啦,很感谢大家对我们的支持!我们专栏现在欢迎各位写Python文章的作者投稿,只要你玩...

Python爱好者社区 ⋅ 06/12 ⋅ 0

初学者学习python2还是python3?

如果你是一个初学者,或者你以前接触过其他的编程语言,你可能不知道,在开始学习python的时候都会遇到一个比较让人很头疼的问题:版本问题!!是学习python2 还是学习 python3 ?这是非常让...

yunyingoldboy ⋅ 2017/11/09 ⋅ 0

学Python有什么用?python入门

  现下Python 可以做任何事情,无论是从入门级选手到专业级选手都在做的爬虫,还是Web 程序开发、桌面程序开发还是科学计算、图像处理,Python都可以胜任。   Python为我们提供了非常完善...

老男孩Linux培训 ⋅ 06/01 ⋅ 0

为什么现在的高校很少开设Python课程?

虽然我的学校是今年第一次开Python课,而我有幸是第一批学习的学生,但据我了解,Python语言虽然进了中小学生的课堂,But,除了把它列入学生自愿报考的计算机二级考试的自选项目之外,大部分...

QingLeiLi ⋅ 05/17 ⋅ 0

个人总结——全面的『Python编码规范』

本文目的 『动态类型一时爽,代码重构火葬场』,说的是:动态语言在初期开发比较爽,但是到后期维护起来比较困难。Python 作为动态语言之一,自然也会有这样的缺点。其实说『火葬场』,也没有...

hezhiming ⋅ 05/18 ⋅ 0

不懂Python,你将成为人工智能时代的新“文盲”

  每个阶段,大家对“文盲”的定义都是不相同的,以前不识汉字就是文盲,后来不会说英语就是文盲。在人工智能时代的今天,当然不懂Python语言,你就是“文盲”!现在你肯定在问Why?   众...

深度学习 ⋅ 06/12 ⋅ 0

Python才是人工智能AI的首选编程语言,你值得拥有……

在所有编程语言里,Python并不算萌新,从1991年发布第一个版本,至今已经快30年了。 最近几年,随着人工智能概念的火爆,Python迅速升温,成为众多AI从业者的首选语言。 根据数据平台 Kaggle...

M耀文 ⋅ 05/19 ⋅ 0

给伸手党的福利:Python 新手入门引导

这是一篇 Python 入门指南,针对那些没有任何编程经验,从零开始学习 Python 的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以此文作为一个参考。 在这个信...

crossin ⋅ 06/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 10分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 20分钟前 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 38分钟前 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 46分钟前 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部