一. 遵循PEP8风格指南。

PEP8是对python代码格式而编订的风格指南。地址:https://www.python.org/dev/peps/pep-0008/

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

  1. 空白(whitespace)
  • 每个缩进层级使用4个空格,不要使用tab制表符;
  • 每行最多79个字符;
  • 文件中的函数与类之间应该用两个空行隔开;
  • 在同一个类中,各方法之间应该用一个空行隔开。
  • 在使用下标来获取列表元素、调用函数或给关键字参数赋值的时候,不要在两旁添加空格;
  • 为变量赋值的时候,赋值符号的左侧和右侧应该各加一个空格。
  1. 命名
  • 类名与异常采用驼峰法,如CamelCase;
  • 函数名、变量及属性用小写字母加下划线,如foo_test;
  • 定义私有属性或方法用下划线开头,如_private;
  • 模块级别的常量,应该全部采用大写字母来拼写,单词之间下划线,如ALL_CAPS;
  1. 表达式和语句
  • import语句放在文件开头
  • 每行import语句只导入一个模块,按照标准库、第三方库、本地库的导入顺序;
  • 不要通过if len(list) == 0 来判断list是否为空,而应采用if not list这种写法,空值将返回False;
  • 判断list是否为非空,使用if list,返回True;
  • 不要写单行的if、for、while及except语句,应分多行以示清晰;
  1. 其他
  • 采用ASCII或UTF-8编码文件;
  • 逗号之前没有额外空格;
  • 小括号、中括号、大括号之间没有额外空格;

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

Python3有两种表示字符序列的类型:bytes和str。
bytes包含二进制数据(原始的8位值);
str包含Unicode字符。

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

def to_str(bytes_or_str):
# 输入str和bytes,返回str
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
else:
value = bytes_or_str
return value def to_bytes(bytes_or_str):
# 输入str和bytes,返回bytes
if isinstance(bytes_or_str, str):
value = bytes_or_str.encode('utf-8')
else:
value = bytes_or_str
return 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 in li]
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 in li) print(squares)
while True:
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 in names]
max_letters = 0
longest_name = ''
for name, count in zip(names, letters):
if count > max_letters:
longest_name = name
max_letters = count
print(longest_name)

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

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

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

《Effective Python》笔记——第1章 用Pythonic方式来思考的更多相关文章

  1. [Effective Python] 用Pythonic方式来思考

    Effective Python chap.1 用Pythonic方式来思考 Pythonic: 一门语言的编程习惯是由用户来确立的. 1. 确认自己所使用的Python版本 2. 遵循PEP8风格指 ...

  2. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  3. [Python笔记][第四章Python正则表达式]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...

  4. [Effective JavaScript 笔记]第7章:并发--个人总结

    前言 这一章的内容学到了事件队列和异步的API.js只是运行在其他应用程序的脚本语言.js即依赖于应用程序,也独立与应用程序.可以使它可以在多平台,多种环境上运行.ECMAScript标准中没有关于并 ...

  5. [Effective JavaScript 笔记]第2章:变量作用域--个人总结

    前言 第二章主要讲解各种变量作用域,通过这章的学习,接触到了很多之前没有接触过的东西,比如不经常用到的eval,命名函数表达式,with语句块等,下面是一个列表,我对各节的一点点个人总结,很多都是自己 ...

  6. [Effective JavaScript 笔记]第4章:对象和原型--个人总结

    前言 对象是js中的基本数据结构.对象在js语言编码中也随处可见,比如经常会用到的函数,也是一个Function构造函数,Function.prototype原型对象.每当声明一个函数时,都会继承Fu ...

  7. [Effective JavaScript 笔记]第5章:数组和字典--个人总结

    前言 这节里其实一直都在讨论对象这个在js中的万能的数据结构.对象可以表式为多种的形式,表示为字典和数组之间的区别.更多的我觉得这章讨论多的是一些对应实现功能的相关操作,有可能出现的bug以及如何避免 ...

  8. [Effective JavaScript 笔记]第6章:库和API设计--个人总结

    前言 又到了一章的总结,这章里的内容.是把我从一个代码的使用者,如何换位成一个代码的编写者.如何让别人用自己的代码更容易,不用去注意太多的无用细节,不用记住冗长的函数名.在使用API时怎样避免使用者会 ...

  9. [Python笔记][第三章Python选择与循环]

    1月28日学习 Python选择与循环 选择结构 多分枝选择结构 if 表达式 1: 语句块 1 elif 表达式 2: 语句块 2 elif 表达式 3: 语句块 3 ... else : 语句块 ...

随机推荐

  1. iNeuOS工业互联网操作系统,增加设备驱动的自定义参数模板,适配行业个性化设备的应用场景

    目       录 1.      概述... 2 2.      平台演示... 2 3.      应用过程... 2 1.   概述 增加设备驱动的自定义参数模板,适配行业个性化设备的应用场景. ...

  2. windows 安装GCC

    1. 下载GCC执行文件  https://pan.baidu.com/s/1foOeAo29gLr_8HhTo_69pA 提取码 cs93 2. 解压文件到D:\mingw64 3. 新建系统环境变 ...

  3. nginx代理图片上传以及访问 nginx 图片上传完整版

    nginx代理图片上传 首先需要利用nginx代理图片访问参考 https://www.cnblogs.com/TJ21/p/12609017.html 编写接受文件的controller 1 @Po ...

  4. Kotlin 协程一 —— 全面了解 Kotlin 协程

    一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...

  5. 2.16图论专题PB

    超神建图技巧合集 CF1368G 每个骨牌变成让空位移动的至多两条有向边,证明图中无环,形成森林. 然后黑白染色,两类森林互不影响.转为每次标记 A 类一棵子树与 B 类一棵子树形成的所有点对. 再转 ...

  6. leetcode 51. N皇后 及 52.N皇后 II

    51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...

  7. leetcode 986. 区间列表的交集

    问题描述 给定两个由一些 闭区间 组成的列表,每个区间列表都是成对不相交的,并且已经排序. 返回这两个区间列表的交集. (形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合, ...

  8. Discuz!X V3.4后台任意文件删除

    Discuz!X V3.4后台任意文件删除 简述 该漏洞为后台任意文件删除,需要有管理员的权限,所以说危害非常小 复现环境 docker.vulhub-master 项目地址:https://gite ...

  9. Vscode不能连接应用商店

    删除这两个文件即可: 1.C:\Users\Administrator\.vscode 2.C:\Users\Administrator\AppData\Roaming\Code

  10. 阿里巴巴基于应用和变更的交付模式|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...