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)]  

11.整数除法

取两个整数相除的整数部分时,有两种方法:

int(a/b)  
a // b  

不过发现a/b容易丢失精度,建议使用a//b

>>> 450832044983301273600 // 5  
90166408996660254720  
>>> int(450832044983301273600 / 5)  
90166408996660248576  

评论

还没有登陆?评论请先登陆注册

还没有评论,抢个沙发吧!

 联系方式 contact me

Github
Email
QQ
Weibo