第1条:确认自己的python版本

第2条:遵循PEP8的风格

  1.空格

  • 对于 占据多行的长表达式来说, 除了首行之外的其余各行都应该在通常的缩进级别上再加4个空格。
  • 每行字符数不应该超过79。

  2.命名

  • 受保护的实例属性命名, 应该以单个下划线开头, 例如:_leading_underscore。
  • 私有属性的命名, 应该以双下划线开头,例如: __leading_underscore。
  • 模块级别的常量,应该全部采用大写字母来拼写,各单词之间以下划线相连,例如:ALL_CAPS。

3.表达式和语句

  • 采用内联形式的否定词,而不是要把否定词放在整个表达式的前面,例如,应该写if a is not b 而不是 if not a is b。
  • 不要通过检测长度的办法(如 if len(somelist) == 0) 来判断 somelist 是否为 [] 或 " 等空值, 而是应该采用 if not somelist 这种写法来判断, 它会假定:空值将自动评估为False。
  • 检测 somelist 是否为[1]或'hi'等非空值时,也应该如此,if somelist 语句默认会把非空的值判断为True。
  • 不要编写单行的 if 语句、for 循环、while 循环及 except 复合语句,而是应该把这些语句分成多行来书写,以示清晰。
  • import 语句应该总是放在文件开头。
  • 引入模块的时候,总是应该使用绝对名称,而不应该根据当前模块的路径来使用相对名称。例如,引入bar包中的foo模块时,应该完整地写出from bar import foo,而不应该简写为import foo。
  • 如果一定要以相对名称来编写import语句,那就采用明确的写法:from.import foo。
  • 文件中那些import语句应该按顺序划分为三个部分,分别表示标准库模块、第三方模块以及自用模块。在每一部分之中,各import语句应该按模块的字母顺序来排列

第3条:了解bytes、str与unicode的区别

    1.python3中解码和转码方法的使用:

      

# bytes解码为str
def to_str(bytes_to_str):
if isinstance(bytes_to_str, bytes):
value = bytes_to_str.decode('utf-8')
else:
value = bytes_to_str
return value # str转码为bytes
def to_bytes(str_to_bytes):
if isinstance(str_to_bytes, str):
value = str_to_bytes.encode()
else:
value = str_to_bytes
return value print(to_str(b'/34ea/2323/udfe'))
print(to_bytes('dkfjdkj'))

    2.从二进制读取或写入二进制文件时,应该总是以'rb'或者'wb'的方式来操作文件

第4条:用辅助函数来取代复杂的表达式(用if/else最简写的方式来取代or和and等)

第5条: 切片的操作细节

    1. 不要写多余的代码,当start的索引为0时,end的索引为序列的长度时,可以将其省略

    2. start和end的索引可以越界, 例如:列表a长度为10    a[:20]  , a[-20:]照样会运行得到所需要的值

    3.赋值表达式的左边是一个列表的拷贝,而右边是一个新列表时,则新列表将会覆盖拷贝的列表。例如:a[:]  =  [101, 23, 34]

第6条: 在单次切片操作内,不要同时指定start、end和stride

    1.尽量少使用start、end和stride共同存在的切片

    2.如果非要使用,则start和end为空,stride为整数。尽量避免用负数做stride

    3.根据上面两点,如果完成比较复杂的切片,可以先做步进切割,然后范围切割,或者先做范围切割,然后进步切割。

    4.根据第三点,如果要求不影响程序速度,使用内置itertools模块中的islice

第7条: 用推导式代替map和filter函数

第8条: 不要使用有含有两个以上表达式的列表推导

    1.超过两个表达式的列表推导是很难理解的,应该尽量避免

第9条: 用生成器表达式来改写数据量较大的列表推导

    1.当输入的数据量较大时,列表推导可能会因为占用太多内存而出现问题

    2.由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免了内存用量问题

    3.把某个生成器表达式所返回的迭代器,放在另一个生成器表达式的for子表达式中,即可将二者组合起来

    4.串在一起的生成器表达式执行速度很快

 # 列表推导
length = [len(x) for x in open('C:\\Users\\凌汪洪\\Desktop\\sql.txt', 'r')]
print(length) # 当数据很多的时候,用生成器表达式
length = (len(x) for x in open('C:\\Users\\凌汪洪\\Desktop\\sql.txt', 'r'))
print(list(length))

第10条: 尽量用enumerate取代range

    1.enumerate函数提供了一种精简的写法,可以在遍历迭代器时获知每个元素的索引

    2.可以给enumerate提供第二个参数,以指定开始计数时使用的值(默认为0)

第11条:  用zip函数同时遍历两个迭代器

    1.内置的zip函数可以平行地遍历多个迭代器

    2.如果提供的迭代器长度不等,那个zip就会自动提前终止

    3.itertools内置模块中的zip_longest函数可以平行地遍历多个迭代器,而不用在乎他们的长度是否相等

第12条: 不要在for和while循环后面写else块

    1.因为这种写法既不直观,又容易引人误解

第13条:  合理利用try/except/else/finally结构中的每个代码块

    1.无论try块中的代码是否异常,都可以利用try/finally复合语句中的finally来做清理操作

    2.else块可以用来缩减try块中代码量,并把没有发生异常时所要执行的语句与try/except代码块隔开

第14条:  尽量用异常来表示特殊情况,而不要返回None

 def divice(a, b):
try:
return a / b
except ZeroDivisionError as e:
raise ValueError('输入了无意义的数字') from e x, y = 12, 0
try:
result = divice(x, y)
except ValueError:
print("输入了无意义的数字")
else:
print('result: %d' % result)

第15条:  了解如何在闭包里使用外围作用域中的变量

    1.除了那种比较简单的函数,尽量不用nonlocal(而是封装成一个类)

  

 def sort_priority(values, group):
found = False
def helper(x):
if x in group:
nonlocal found
found = True
return (0, x)
return (1, x) # 这里是根据元组的大小进行比较的
values.sort(key=helper)
return found numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
sort_priority(numbers, group)
print(numbers)
 # 尽量不用nonlocal
  numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
class SortPriority:
def __init__(self, group):
self.group = group
self.found = False def __call__(self, x):
if x in group:
self.found = True
return (0, x)
return (1, x) sort_priority = SortPriority(group)
numbers.sort(key=sort_priority)
print(numbers)

第16条:  考虑用生成器来改写直接返回列表的函数

 # 普通函数的用法
def index_text(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == ' ':
result.append(index + 1)
return result text = 'Four years old'
index = index_text(text)
print(index) # 普通函数转换为生成器函数
def index_text(text):
if text:
yield 0
for index, letter in enumerate(text):
if letter == ' ':
yield index + 1 text = 'Four years old'
index = list(index_text(text))
print(index)

编写python高质量python代码的59个有效方法的更多相关文章

  1. 编写高质量JavaScript代码的68个有效方法

    简介: <Effective JavaScript:编写高质量JavaScript代码的68个有效方法>共分为7章,分别涵盖JavaScript的不同主题.第1章主要讲述最基本的主题,如版 ...

  2. 编写高质量JS代码的68个有效方法(八)

    [20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  3. 编写高质量JS代码的68个有效方法(七)

    [20141220]编写高质量JS代码的68个有效方法(七) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  4. 编写高质量JS代码的68个有效方法(六)

    [20141213]编写高质量JS代码的68个有效方法(六) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  5. 编写高质量JS代码的68个有效方法(四)

    [20141129]编写高质量JS代码的68个有效方法(四) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  6. 编写高质量JS代码的68个有效方法(三)

    [20141030]编写高质量JS代码的68个有效方法(三) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  7. 编写高质量JS代码的68个有效方法(二)

    [20141011]编写高质量JS代码的68个有效方法(二) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...

  8. JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)

    编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  9. 编写高质量JS代码的68个有效方法(十三)

    No.61.不要阻塞I/O事件队列 Tips: 异步API使用回调函数来延缓处理代价高昂的操作以避免阻塞主应用程序 JavaScript并发的接收事件,但会使用一个事件队列按序地处理事件处理程序 在应 ...

随机推荐

  1. Python基础之可接受任意数量参数的函数

    1. 可接受任意数量位置参数的函数 为了能让一个函数接受任意数量的位置参数,可以在参数部分使用“*”. def avg(first, *rest): return (first + sum(rest) ...

  2. python 迷宫问题

    # -*- coding:utf- -*- from collections import deque # 引入队列 maze = [ [,,,,,,,,,], [,,,,,,,,,], [,,,,, ...

  3. Tkinter 之CheckButton复选框标签

    一.参数说明 语法 作用 Checkbutton(root,text='xxxx') 复选框显示的文本 Checkbutton(root,variable=id) 通过变量的值确定哪些复选框被选中 C ...

  4. Kafka 最新版配置

    当前基于kafaka最新版 kafka_2.12-2.2.1.tgz 进行配置 . 官网地址:http://kafka.apache.org/intro kafka的一些基础知识 参考:http:// ...

  5. OAuth 2.0 的四种方式

    上一篇文章介绍了 OAuth 2.0 是一种授权机制,主要用来颁发令牌(token).本文接着介绍颁发令牌的实务操作. 下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个 ...

  6. VVDocumenter-Xcode

      从Xcode 5开始,苹果要求加入UUID证书从而保证插件的稳定性.因此Xcode版本更新之后需要在VVDocumenter-Xcode的Info.plist文件中添加Xcode的UUID. 步骤 ...

  7. 知乎千万级高性能长连接网关 https://zhuanlan.zhihu.com/p/66807833

    知乎千万级高性能长连接网关揭秘 9 天前 · 来自专栏 知乎技术专栏 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背 ...

  8. C# 可扩展编程MEF学习

    http://www.cnblogs.com/yunfeifei/p/3991330.html

  9. 五句话搞定Python、JavaScript作用域

    这个银角的看家之作了吧,哈哈哈,剽窃下,原地址在这:点我点我 Python与JavaScript基本相同,但声明提前一项略有不同. JavaScript.Python中无块级作用域 在Java或C#中 ...

  10. python中 将数字转化为人民币的形式

    def fn(args): """ 将金额转化为人民币模式,带逗号分隔,保留小数点两位,四舍五入 :param args: :return: ""&q ...