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. 链状比较操作符

比较操作符的聚合是另一个有时很方便的技巧:

n= 10result= 1< n< 20print(result)# Trueresult= 1> n<= 9print(result)# False

3. 使用三元操作符来进行条件赋值

# 三元操作符是 if-else 语句也就是条件操作符的一个快捷方式:[表达式为真的返回值] if [表达式] else [表达式为假的返回值]# 这里给出几个你可以用来使代码紧凑简洁的例子。下面的语句是说“如果 y 是 9,给 x 赋值 10,不然赋值为 20”。如果需要的话我们也可以延长这条操作链。x = 10 if (y == 9) else 20# 同样地,我们可以对类做这种操作:x = (classA if y == 1 else classB)(param1, param2)

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] = 0navs[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, itemi += 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 &amp;amp; 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 = 0result = []while i &amp;lt; n:result.append(fn(i))i += 1return result  #  返回列表##推荐
def my_range(n):i = 0result = []while i &amp;lt; 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 = Truebreak
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 = 1def setHour(self, hour):if 25 &amp;gt; hour &amp;gt; 0: self.__hour = hourelse: raise BadHourExceptiondef getHour(self):return self.__hour##推荐
class Clock(object):def __init__(self):self.__hour = 1def __setHour(self, hour):if 25 &amp;gt; hour &amp;gt; 0: self.__hour = hourelse: raise BadHourExceptiondef __getHour(self):return self.__hourhour = 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 onlywith 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面试常见题目相关推荐

  1. Python面试常见题目,反转英文句子

    定义一个反转函数 def reverse(str_list,start,end):while start<end:str_list[start],str_list[end]=str_list[e ...

  2. 软件面试常见题目(转帖)

    软件面试常见题目(转帖)   1.什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台.软件平台上是否可以正常的运行,即是通常说的软件的可移植性. 兼容的类型 ...

  3. MySQL面试常见题目(六)

    原文地址:MySQL面试常见题目(六) 1.字段为何需定义NOT NULL? NULL会占用更多字节,且NULL有很多坑. 2.如需存储用户密码散列,应使用什么字段? 应使用char,可节省空间且提高 ...

  4. Python面试常见的30个问题及答案

    Python面试问题 问题1. Python的主要功能是什么? python特性如下: 解释型 动态类型 面向对象 简洁明了 免费自由 有一个庞大的社区 Q.2.区分深层和浅层拷贝. 深拷贝将对象复制 ...

  5. C++面试常见题目问与答(汇总一)

    此次整理来自QQ群186588041,所有资料来自谭校长.张教主.H神.Robort.fight for dream.刀刀.二货 主要是总结了一些经常被问道的面试题 欢迎加入群182374342(原来 ...

  6. AI面试常见题目整理

    首先介绍一下AI面的形式,和普通的真人即时面试不同,AI面是播放提前录制好的题目,在题目念完以后,给被试者30秒至1分钟的思考时间,然后开始记录被试者的回答,一般每个问题限制为三分钟内作答. 我目前体 ...

  7. python面试常见问题-Python面试常见的8个问题及答案总结

    达内北京Python培训机构为大家总结下python面试题汇总,送给有需要的人! 第一家公司问的题目 1 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能 ...

  8. python面试常见知识点收集,长期更新

    问题 Python 1 python的数据类型 字典,字符串,列表,元组,集合 元组和列表的区别 元组和列表都属于序列. 列表属于可变序列,它的元素可以随时修改或者删除,而元组属于不可变序列,其中的元 ...

  9. 10道Python面试常见的问题

    1.类继承 有如下的一段代码: class A(object):def show(self):print 'base show'class B(A):def show(self):print 'der ...

最新文章

  1. OpenCV(二十)模板匹配
  2. axios的this指向_vue使用axios中 this 指向问题
  3. ThreadLocal究竟存不存在内存泄漏?
  4. go 变量在其中一个函数中赋值 另一个函数_go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包...
  5. python 福利彩票_使用Python买福彩,5个数字,20选5,有没买过
  6. 大数据时代的电信运营商的机遇
  7. android 5.0新增 ui 控件,android3.0新增ui控件示例说明.doc
  8. oracle大于条件,oracle中sql语句中的in的条件数量大于1000有问题
  9. python如何把一张图像的所有像素点的值都显示出来_情人节,教你用 Python 向女神表白...
  10. InputStreamReader和OutputStreamWriter
  11. python包管理工具pip的使用
  12. Linux从入门到精通——数据库
  13. 自学elastic search
  14. webpack5配置dev-server在控制台打印信息
  15. 前端页面调试、抓包工具——spy-debugger
  16. 测试无线电频率的软件叫什么,软件无线电到底是什么
  17. MySQL自动化巡检报告-v1.0
  18. 亚美柏科笔试题——java
  19. 5G注册流程分级详解Step4-8
  20. 【python爬虫笔记】验证码

热门文章

  1. js+css立体旋转
  2. asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
  3. 如何编写nopCommerce插件
  4. 雷死人不偿命-----六年级小学生的字条
  5. 微信小程序手机预览不正常,打开手机调试后预览正常
  6. hdu 6386 Age of Moyu (重边判断)
  7. 剑指Offer--数值的整数次方
  8. Linux各个文件夹的作用~~~非常实用!!
  9. dubbo超时重试和异常处理
  10. Class类 获取Class对象