文章目录
- 前言
- 0\. 程序必须先让人读懂,然后才能让计算机执行。
- 1\. 交换赋值
- 2\. Unpacking
- 3\. 使用操作符in
- 4\. 字符串操作
- 5\. 字典键值列表
- 6\. 字典键值判断
- 7\. 字典 get 和 setdefault 方法
- 8\. 判断真伪
- 9\. 遍历列表以及索引
- 10\. 列表推导
- 11\. 列表推导-嵌套
- 12\. 循环嵌套
- 13\. 尽量使用生成器代替列表
- 14\. 中间结果尽量使用imap/ifilter代替map/filter
- 15\. 使用any/all函数
- 16\. 属性(property)
- 17\. 使用 with 处理文件打开
- 18\. 使用 with 忽视异常(仅限Python 3)
- 19\. 使用 with 处理加锁
前言
Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests、flask、tornado,下面列举一些常见的Pythonic写法。
0. 程序必须先让人读懂,然后才能让计算机执行。
“Programs must be written for people to read, and only incidentally for machines to execute.”
1. 交换赋值
##不推荐
temp = a
a = b
b = a
##推荐
a, b = b, a # 先生成一个元组(tuple)对象,然后unpack
2. Unpacking
##不推荐
l = \['David', 'Pythonista', '+1-514-555-1234'\]
first\_name = l\[0\]
last\_name = l\[1\]
phone\_number = l\[2\]
##推荐
l = \['David', 'Pythonista', '+1-514-555-1234'\]
first\_name, last\_name, phone\_number = l
# Python 3 Only
first, \*middle, last = another\_list
3. 使用操作符in
##不推荐
if fruit == "apple" or fruit == "orange" or fruit == "berry":
# 多次判断
##推荐
if fruit in \["apple", "orange", "berry"\]:
# 使用 in 更加简洁
4. 字符串操作
##不推荐
colors = \['red', 'blue', 'green', 'yellow'\]
result = ''
for s in colors:
result += s # 每次赋值都丢弃以前的字符串对象, 生成一个新对象
##推荐
colors = \['red', 'blue', 'green', 'yellow'\]
result = ''.join(colors) # 没有额外的内存分配
5. 字典键值列表
##不推荐
for key in my\_dict.keys():
# my\_dict\[key\] ...
##推荐
for key in my\_dict:
# my\_dict\[key\] ...
# 只有当循环中需要更改key值的情况下,我们需要使用 my\_dict.keys()
# 生成静态的键值列表。
6. 字典键值判断
##不推荐
if my\_dict.has\_key(key):
# ...do something with d\[key\]
##推荐
if key in my\_dict:
# ...do something with d\[key\]
7. 字典 get 和 setdefault 方法
##不推荐
navs = {}
for (portfolio, equity, position) in data:
if portfolio not in navs:
navs\[portfolio\] = 0
navs\[portfolio\] += position \* prices\[equity\]
##推荐
navs = {}
for (portfolio, equity, position) in data:
# 使用 get 方法
navs\[portfolio\] = navs.get(portfolio, 0) + position \* prices\[equity\]
# 或者使用 setdefault 方法
navs.setdefault(portfolio, 0)
navs\[portfolio\] += position \* prices\[equity\]
8. 判断真伪
##不推荐
if x == True:
# ....
if len(items) != 0:
# ...
if items != \[\]:
# ...
##推荐
if x:
# ....
if items:
# ...
9. 遍历列表以及索引
##不推荐
items = 'zero one two three'.split()
# method 1
i = 0
for item in items:
print i, item
i += 1
# method 2
for i in range(len(items)):
print i, items\[i\]
##推荐
items = 'zero one two three'.split()
for i, item in enumerate(items):
print i, item
10. 列表推导
##不推荐
new\_list = \[\]
for item in a\_list:
if condition(item):
new\_list.append(fn(item))
##推荐
new\_list = \[fn(item) for item in a\_list if condition(item)\]
11. 列表推导-嵌套
##不推荐
for sub\_list in nested\_list:
if list\_condition(sub\_list):
for item in sub\_list:
if item\_condition(item):
# do something...
##推荐
gen = (item for sl in nested\_list if list\_condition(sl) \\
for item in sl if item\_condition(item))
for item in gen:
# do something...
12. 循环嵌套
##不推荐
for x in x\_list:
for y in y\_list:
for z in z\_list:
# do something for x & y
##推荐
from itertools import product
for x, y, z in product(x\_list, y\_list, z\_list):
# do something for x, y, z
13. 尽量使用生成器代替列表
##不推荐
def my\_range(n):
i = 0
result = \[\]
while i < n:
result.append(fn(i))
i += 1
return result # 返回列表
##推荐
def my\_range(n):
i = 0
result = \[\]
while i < n:
yield fn(i) # 使用生成器代替列表
i += 1
\*尽量用生成器代替列表,除非必须用到列表特有的函数。
14. 中间结果尽量使用imap/ifilter代替map/filter
##不推荐
reduce(rf, filter(ff, map(mf, a\_list)))
##推荐
from itertools import ifilter, imap
reduce(rf, ifilter(ff, imap(mf, a\_list)))
\*lazy evaluation 会带来更高的内存使用效率,特别是当处理大数据操作的时候。
15. 使用any/all函数
##不推荐
found = False
for item in a\_list:
if condition(item):
found = True
break
if found:
# do something if found...
##推荐
if any(condition(item) for item in a\_list):
# do something if found...
16. 属性(property)
##不推荐
class Clock(object):
def \_\_init\_\_(self):
self.\_\_hour = 1
def setHour(self, hour):
if 25 > hour > 0: self.\_\_hour = hour
else: raise BadHourException
def getHour(self):
return self.\_\_hour
##推荐
class Clock(object):
def \_\_init\_\_(self):
self.\_\_hour = 1
def \_\_setHour(self, hour):
if 25 > hour > 0: self.\_\_hour = hour
else: raise BadHourException
def \_\_getHour(self):
return self.\_\_hour
hour = property(\_\_getHour, \_\_setHour)
17. 使用 with 处理文件打开
##不推荐
f = open("some\_file.txt")
try:
data = f.read()
# 其他文件操作..
finally:
f.close()
##推荐
with open("some\_file.txt") as f:
data = f.read()
# 其他文件操作...
18. 使用 with 忽视异常(仅限Python 3)
##不推荐
try:
os.remove("somefile.txt")
except OSError:
pass
##推荐
from contextlib import ignored # Python 3 only
with ignored(OSError):
os.remove("somefile.txt")
19. 使用 with 处理加锁
##不推荐
import threading
lock = threading.Lock()
lock.acquire()
try:
# 互斥操作...
finally:
lock.release()
##推荐
import threading
lock = threading.Lock()
with lock:
# 互斥操作...
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,希望提供给想学习 Python 的小伙伴们一点帮助!
保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】

一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python基础学习视频
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
因篇幅有限,仅展示部分资料
三、精品Python学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
六、Python兼职渠道
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
