effective python目录_《Effective Python》笔记——第1章 用Pythonic方式来思考

一. 遵循PEP8风格指南。

个人觉得不一定完全按照PEP8写python代码,但有些规范的格式建议还是应该遵守,方便后期维护代码。

空白(whitespace)

每个缩进层级使用4个空格,不要使用tab制表符;

每行最多79个字符;

文件中的函数与类之间应该用两个空行隔开;

在同一个类中,各方法之间应该用一个空行隔开。

在使用下标来获取列表元素、调用函数或给关键字参数赋值的时候,不要在两旁添加空格;

为变量赋值的时候,赋值符号的左侧和右侧应该各加一个空格。

命名

类名与异常采用驼峰法,如CamelCase;

函数名、变量及属性用小写字母加下划线,如foo_test;

定义私有属性或方法用下划线开头,如_private;

模块级别的常量,应该全部采用大写字母来拼写,单词之间下划线,如ALL_CAPS;

表达式和语句

import语句放在文件开头

每行import语句只导入一个模块,按照标准库、第三方库、本地库的导入顺序;

不要通过if len(list) == 0 来判断list是否为空,而应采用if not list这种写法,空值将返回False;

判断list是否为非空,使用if list,返回True;

不要写单行的if、for、while及except语句,应分多行以示清晰;

其他

采用ASCII或UTF-8编码文件;

逗号之前没有额外空格;

小括号、中括号、大括号之间没有额外空格;

二、了解bytes、str与unicode的区别

Python3有两种表示字符序列的类型:bytes和str。

bytes包含二进制数据(原始的8位值);

str包含Unicode字符。

想要把Unicode字符转换成二进制数据,必须使用encode方法;

把二进制数据转换成Unicode字符,则必须使用decode方法。

defto_str(bytes_or_str):#输入str和bytes,返回str

ifisinstance(bytes_or_str, bytes):

value= bytes_or_str.decode('utf-8')else:

value=bytes_or_strreturnvaluedefto_bytes(bytes_or_str):#输入str和bytes,返回bytes

ifisinstance(bytes_or_str, str):

value= bytes_or_str.encode('utf-8')else:

value=bytes_or_strreturn value

编写Python程序的时候,一定要把编码和解码操作放在界面最外围来做。程序的核心部分应该使用Unicode字符类型(Python3的str、Python2的Unicolde)。

注意:python3通过open打开文件的时候,默认是str格式。写入二进制格式,需要'wb'方式打开文件,不能用'w'。

三、用辅助函数来取代复杂的表达式

pass

四、切片

对list、str、bytes进行切割

list[start:end]

list[start:end:stride]

stride为步值,stride为-1时可以反转字节串,不能反转已经编码成UTF-8的Unicode

切割还可以使用内置itertools模块的islide方法。

五、用列表推导来取代map和filter

#filter() 用函数对元素进行筛选,filter(函数,可迭代的对象)

#map() 对每个元素进行函数处理,map(函数,可迭代的对象)

#列表推导

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

squares= [x**2 for x inli]print(squares)#结果

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]#map()

squares = list(map(lambda x: x ** 2, li))

#计算可以被2整除的数的平方

even_squares = [x**2 for x in li if x % 2 ==0]#map和filter

alt = map(lambda x: x**2, filter(lambda x: x % 2 ==0, li))

even_squares= list(alt)

字典与元组也有类似的推导机制。

六、用生成器表达式来改写数据量较大的列表推导

列表推导如果输入数据太多,可能大量消耗内存。为了解决这个问题python提供了生成器表达式,

把列表推导的[]改为()即返回一个迭代器。

li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]#squares = [x**2 for x in li]

squares = (x**2 for x inli)print(squares)whileTrue:print(next(squares))

七、尽量用enumerate取代range

内置函数enumerate可以把各种迭代器包装为生成器,输出两个值,前者表示下标,后者是迭代器中获取的元素

f_list = ['a', 'b', 'c']for i, f in enumerate(f_list, 1):#表示下标从1开始,默认从0开始

print('%d:%s' % (i, f))

八、用zip函数同时遍历两个迭代器

python3中的zip函数可以把两个或两个以上的迭代器封装成生成器。

#找出字母数最多的名字

names = ['Cecilia', 'Lise', 'Marie']

letters= [len(i) for i innames]

max_letters=0

longest_name= ''

for name, count inzip(names, letters):if count >max_letters:

longest_name=name

max_letters=countprint(longest_name)

九、合理利用try/except/else/finally结构中的每个代码块

执行完try语句,无论是否异常,一定会执行finally。一般用于关闭文件句柄,也可用with语法替代。

执行完try语句,发生异常执行except,未发生异常执行else。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Python提督道(Pythonic)地解决bug时,我们遵循一些原则和实践来提高代码的可读性、可维护性和可扩展性。 首先,我们应尽可能使用Python的内置函数和库来解决问题,而不是重复造轮子。Python提供了许多功能强大的内置函数和模块,如`os`、`sys`、`re`等,它们提供了许多用于处理文件、系统、正则表达式等常见任务的函数。同时,Python还提供了许多标准库,如`datetime`、`json`等,它们提供了处理日期时间、JSON等常见任务的函数和类。因此,在解决bug时,我们应首先查看Python官方文档,探索是否有现成的解决方案可用。 其次,我们应充分利用Python的异常处理机制来捕获和处理bug。Python提供了`try-except`结构,它能够捕获代码中可能出现的错误并进行相应的处理。在处理bug时,我们应该使用`try-except`块来尽量捕获并处理异常,以避免程序崩溃或产生不可预测的结果。同时,我们还可以使用`finally`关键字来确保无论是否发生异常,都能执行必要的清理工作。 此外,Python还支持面向对象编程(OOP),我们可以使用类和对象来组织和封装代码,以提高代码的可重用性和可维护性。在解决bug时,我们可以使用OOP的思想来设计和实现自定义的异常类、封装复杂逻辑的类等,以提高代码的可读性和扩展性。 最后,为了尽量避免和减少bug的产生,我们应遵循一些良好的编码风格和规范,如PEP 8,它提供了Python编码的指导原则。良好的编码风格和规范能够使我们的代码更加整洁、易读,并减少潜在的bug。同时,我们还可以使用一些静态代码分析工具来检测常见的错误和潜在的问题,如PyLint、Flake8等。 总之,使用Python提禅道bug意味着我们要充分利用Python的内置函数和模块、异常处理机制、面向对象编程等特性,同时遵循良好的编码风格和规范,以提高代码的质量和可维护性,从而高效地解决bug。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值