写这篇随笔,主要是因为自己是从c/c++开始的,写python的时候,难免有浓重的c++味道,为了让自己的python更加额pythonic,特写下这边随笔,记录自己遇到的pythonic的写法
让自己的代码更加的pythonic。
1、for循环
实现对一个序列里的每个元素执行一个操作的 C 语言实现:
1 for (i=0; i < mylist_length; i++) { 2 3 do_something(mylist[i]); 4 5 }
等价于python中这样的语法:
i = 0 while i < mylist_length: do_something(mylist[i]) i += 1
这段代码能够完成工作,但并不 Pythonic。典型的 Python 惯用法是用内置的 range() 函数生成所有的序列下标:
for i in range(mylist_length): do_something(mylist[i])
语言推荐的实现方式,真正 Pythonic 实现:
for element in mylist: do_something(element)
2、置换
通用的语法:
1 temp = a 2 a = b 3 b = temp
pythonic语法:
a,b = b,a
3、多返回值问题
c语言的写法通常使用指针或者引用:
1 void foo(int* a, float* b) { 2 3 *a = 3; 4 5 *b = 5.5; 6 7 }
pythonic用法:
def foo(): return 3, 5.5 alpha, beta = foo()
4、真假值问题
判断是否都不为null
name = 'Tim' langs = ['AS3', 'Lua', 'C'] info = {'name': 'Tim', 'sex': 'Male', 'age':23 }
通用的语法:
if name != '' and len(langs) > 0 and info != {}: print('All True!') #All True!
pythonic语法:
if name and langs and info: print('All True!') #All True!
附上真假值表:
真 | 假 |
---|---|
True | False |
任意非空字符串 | 空的字符串 '' |
任意非0数字 | 数字0 |
任意非空容器 | 空的容器 [] () {} set() |
其他任意非False | None |
5、链式
a = 3 b = 1
通用:
b >= 1 and b <= a and a < 10 #True
pythonic语法:
1 <= b <= a < 10 #True
6、字符串翻转
通用:
1 def reverse_str( s ): 2 t = '' 3 for x in xrange(len(s)-1,-1,-1): 4 t += s[x] 5 return t
pythonic:
def reverse_str( s ): return s[::-1]
如果用于检测回文,就是一句话input == input[::-1],多么的优雅!
7、string.join()
strList = ["Python", "is", "good"]
通用:
res = '' for s in strList: res += s + ' '
pythonic:
res = ' '.join(strList)
8、列表的求和、求最大值、最小值、乘积
numList = [1,2,3,4,5]
通用:
sum = 0 maxNum = -float('inf') minNum = float('inf') prod = 1 for num in numList: if num > maxNum: maxNum = num if num < minNum: minNum = num sum += num prod *= num
pythonic:
sum = sum(numList) #sum = 15 maxNum = max(numList) #maxNum = 5 minNum = min(numList) #minNum = 1 from operator import mul prod = reduce(mul, numList) #prod = 120
9、列表推导式
通用:
l = [] for x in range(10): if x % 3 == 0: l.append(x*x)
pythonic:
l = [x*x for x in range(10) if x % 3 == 0]
10、字典默认值
dic = {'name':'Tim', 'age':23}
通用:
if 'workage' in dic: dic['workage'] += 1 else: dic['workage'] = 1 #dic = {'age': 23, 'workage': 1, 'name': 'Tim'}
pythonic:
dic['workage'] = dic.get('workage',0) + 1 #dic = {'age': 23, 'workage': 1, 'name': 'Tim'}
11、for循环中断情况
通用:
find = False for x in xrange(1,5): if x == 5: find = True print 'find 5' break if not find: print 'can not find 5!' #can not find 5!
pythonic:
for x in xrange(1,5): if x == 5: print 'find 5' break else: print 'can not find 5!' #can not find 5!
for...else...的else部分用来处理没有从for循环中断的情况。有了它,我们不用设置状态变量来检查是否for循环有break出来,简单方便。
12、键与值
通用:
for i in xrange(len(array)): print i, array[i]
pythonic:
for i, e in enumerate(array,0): print i, e
13、dict
keys = ['Name', 'Sex', 'Age'] values = ['Tim', 'Male', 23]
通用:
dic = {} for i,e in enumerate(keys): dic[e] = values[i] #{'Age': 23, 'Name': 'Tim', 'Sex': 'Male'}
pythonic:
dic = dict(zip(keys, values)) #{'Age': 23, 'Name': 'Tim', 'Sex': 'Male'}
14、数组合并
L=[ [1,2,3],[4,5,6],[7,8,9]] 这样的列表,如何把合并成[1,2,3,4,5,6,7,8,9]
通用:
ret = [] for x in L: ret += x print(x)
使用标准库中的itertools模块:
from itertools import chain lst = list(chain(*L))
pythonic:
myList = [x for j in L for x in j]