refer:1.Crossing的编程教室
2.https://www.cnblogs.com/yyds/p/6281453.html
学过C/C++或Java的同学初学时可能会将列表遍历写为:
for i in range(len(list)): print(lst[i])
这样写也可以实现功能,但不够Pythonic,更好的方式为:
for i in lst: print(i)
如果想要带上索引可以写为:
for index,elem in enumerate(lst): print(index,elem)
如果需要遍历字典可以写为:
for key,value in dict.items(): print(key,value)
交换两个变量值时,普通写法会写为:
tmp = a a = b b = tmp
Pythonic写法为:
a,b = b,a
Python的函数中返回多个返回值,普通写法会用列表的形式返回:
def func(a,b): result = [b,a] return result res = func(a,b) x = res[0] y = res[1]
Pythonic写法为:
def func(a,b): return b,a x,y = func(a,b)
读写文件的普通写法需要显式的关闭文件:
f = open("file.txt") text = f.read() print(text) f.close()
Pythonic的写法使用with,不用显式关闭文件,即使出错,也会关闭文件:
with open("file.txt") as f: for line in f: print(line)
拼接字符串的普通写法为:
letters = ['h','e','l','l','o'] s = '' for l in letters: s += l print(s)
Pythonic的写法为:
print(''.join(letters))
取出列表中大于0的元素,生成新元素,普通写法为:
new_lst = [] for i in lst: if i > 0: new_lst.append(i)
Pythonic写法使用列表解析式:
new_lst = [i for i in lst if i > 0]
其基础语法格式为[exp for iter_var in iterable]
,其工作过程为:
- 迭代iterable中的每个元素
- 每次迭代先把结果赋给iter_var,然后通过exp表达式得到一个新的计算值
- 最后把所有通过exp得到的计算值以列表形式返回
其过程可以描述为:
L = [] for iter_var in iterable: L.append(exp(iter_var)) return L # 举例:生成一个新列表,将原列表中的每个元素*2 lst = [1,2,3] new_lst = [i*2 for i in lst]
带过滤功能的语法格式为:
[exp for iter_var in iterable if_exp]
其过程可以描述为:
L = [] for iter_var in iterable: if if_exp: L.append(exp(iter_var)) return L # 举例:生成一个新列表,筛选原列表中大于10的数 lst = [1,2,11,12] new_lst = [i for i in lst if i>10]
循环嵌套的语法格式为:
[exp for iter_var_a in iterable_a for iter_var_b in iterable_b]
其过程可以描述为:
L = [] for iter_var_a in iterable_a: for iter_var_b in iterable_b: L.append(exp(iter_var_a,iter_var_b)) return L #举例:生成一个新列表,其元素为两列表元素的全排列 lst1 = [1,2,3] lst2 = [7,8,9] new_lst = [(a,b) for a in lst1 for b in lst2]
说完列表解析式,还需要提一下生成器。生成器可以用与列表解析式相似的方式构造,并且可以使用循环遍历生成器对象。
# 构造生成器,与列表解析式十分相似,不过使用() grt = (2*n + 1 for n in range(3,6)) print(type(grt)) # <class 'generator'> # 遍历生成器 for x in grt: print(x) # 结果为:7 9 11
用法看起来与列表解析式很相似,不过还有其他的使用方法,这里不做介绍。说一下其与列表解析式的不同,列表解析式会直接创建一个列表,并将数据一次性放到内存中;而生成器是按照算法推算,调用时才会生成相应数据,从而可以节省大量的内存空间。
判断一个值是否为True、是否为空列表、是否是None,普通写法为:
if x == True: pass if len(y) == 0: pass if z == None: pass
Pythonic的写法为:
if x: pass if not y: pass if z is None: pass
获取字典中的普通写法为:
val = dict[key]
这种写法当key不存在时,代码就会报错,Pythonic的写法为:
val = dict.get(key,0)
使用get方法key不存在时会得到None,或者指定默认值(get方法的第二个参数,此处如果key不存在,会返回0)。
将字典按key排序:
d = {'a':1,'b':4,'c':2} sorted(d.items())
将字典按value逆序(从大到小)排序:
sorted(d.items(),key = lambda x:x[1],reverse=True) # 注意结果为列表: # [('b', 4), ('c', 2), ('a', 1)]
取两个整数相除的整数部分时,有两种方法:
int(a/b) a // b
不过发现a/b容易丢失精度,建议使用a//b
>>> 450832044983301273600 // 5 90166408996660254720 >>> int(450832044983301273600 / 5) 90166408996660248576
a
--
123456789
更改id为3
--
test
更改id为2
--
commentor
伪造名称???
--
hhh
伪造名称???
--
yayay