Pythonic

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)]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值