Python编程惯用法

1,数据交换值的时候不推荐使用中间变量

一般交换两个值是借助中间变量来实现,不过Python有更简单的实现方式:
X, Y = Y, X
这种方式耗时少,代码也更加简洁。
之所以能这样,因为一般情况下Python的表达式的计算顺序是从左到右,但是遇到表达式赋值的时候,表达式右边的操作会先于左边的操作数计算,因此表达式 exp3, exp4 = exp1, exp2 的计算顺序是exp1,exp2–>exp3,exp4;计算完右边的表达式,通过Python的packing机制创建一个元组,元组的值依次分配给左边的标识符,通过解包机制(unpacking),exp1,exp2依次得到分配值。

2,充分利用lazy evaluation (延迟计算)的特性

lazy evaluation是指仅仅在真正需要执行的时候才计算表达式的值。其特性主要带来两个方面的好处:
A, 避免不必要的计算,带来性能上的提升。
对于表达式 if x and y, 在x为false的情况下,y表达式的值将不再计算。而对于if x or y,当x的值为true的时候将直接返回,不再计算y 的值。因此,在编程过程中,如果对于or表达式应该将值为真的可能性较高的变量写在or的前面,而and则应该推后。
B, 节省空间,使得无限循环的数据结构成为可能。
最典型的例子就是生成器表达式,它仅在每次需要计算的时候才通过yield产生所需要的元素,例如斐波那契数列:

def fib():
	a, b = 0, 1
	while True:
	yiled a
	a, b = b, a+b
from itertools import islice
print(list(islice(fib(),6)))
# [0,1,1,2,3,5]

3 获取序列迭代的索引和值

对序列进行迭代获取序列中的元素是一个普遍简单的需求,实现方式也很多;
方法一:在每次循环中对索引变量自增

list_raw = ['a', 'b','c']
index = 0
for i in list_a :
	print("index:", index, "element:", i)
	index += 1

方法二: 使用range和len函数
计算序列长度,然后迭代。

方法三: 使用while循环

list_raw = ['a', 'b','c']
index = 0
while index < len(list_raw):
	print(index, list_raw[index])
	index += 1

方法四:使用zip方法

list_raw = ['a', 'b','c']
for ind, elem in zip(range(len(list_raw)), list_raw):
	print(ind, elem)

方法五: 使用enumerate()获取序列的索引和值

list_raw = ['a', 'b','c']
for i, e in enumerate(list_raw):
	print(i, e)

推荐使用方法五,代码清晰简洁,可读性好。它具有一定的惰性,每次仅在需要的时候才会产生一个(index,item)对。

对于字典的迭代循环,enumerate函数并不合适,字典会被转换成了序列进行处理。
要获取字典的key和value,应该适用iteritems函数:

dict_data = {'a':value1, 'b':value2}
for k, v in dict_data.iteritems():
	print(k,v)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值