refer:1.Crossing的编程教室
2.https://www.cnblogs.com/yyds/p/6281453.html
Pythonic:Python的语法糖
1.列表和字典中元素的遍历
学过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)
2.交换两个变量的值
交换两个变量值时,普通写法会写为:
tmp = a
a = b
b = tmp
Pythonic写法为:
a,b = b,a
3.实现多个返回值的函数
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)
4.读写文件
读写文件的普通写法需要显式的关闭文件:
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)
5.拼接字符串
拼接字符串的普通写法为:
letters = ['h','e','l','l','o']
s = ''
for l in letters:
s += l
print(s)
Pythonic的写法为:
print(''.join(letters))
6.列表解析式(List Comprehension)
取出列表中大于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]
7.生成器(generator)
说完列表解析式,还需要提一下生成器。生成器可以用与列表解析式相似的方式构造,并且可以使用循环遍历生成器对象。
# 构造生成器,与列表解析式十分相似,不过使用()
grt = (2*n + 1 for n in range(3,6))
print(type(grt)) # <class 'generator'>
# 遍历生成器
for x in grt:
print(x)
# 结果为:7 9 11
用法看起来与列表解析式很相似,不过还有其他的使用方法,这里不做介绍。说一下其与列表解析式的不同,列表解析式会直接创建一个列表,并将数据一次性放到内存中;而生成器是按照算法推算,调用时才会生成相应数据,从而可以节省大量的内存空间。
8.判断布尔值及空值
判断一个值是否为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
9.获取字典中的值
获取字典中的普通写法为:
val = dict[key]
这种写法当key不存在时,代码就会报错,Pythonic的写法为:
val = dict.get(key,0)
使用get方法key不存在时会得到None,或者指定默认值(get方法的第二个参数,此处如果key不存在,会返回0)。
10.字典排序
将字典按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)]