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)