python内置的enumerate函数可以将list变成索引-元素对。这样可以在for中迭代索引和对象本身:
>>> l = ['a','b','c','d'] >>> for i,value in enumerate(l): ... print(i, value) ... 0 a 1 b 2 c 3 d
python内置了简单而强大的生成list的方式,通过使用列表生成式可以写出非常简洁的代码。
此外,还可以在for...in...后面加上if进行判断。例如:生成3-10中偶数的平方的list:
等价于
>>> L=[] >>> for x in range(3,11): ... if x % 2 == 0: ... L.append(x * x) ... >>> L [16, 36, 64, 100]
列表生成式也可以使用两个变量来生成list:
通过列表,可以直接创建一个列表。但是,假如创建一个包含100万个元素的列表,需要占用大量的内存空间,而我们只需要前几个元素,那么大多数元素占用的内存空间就浪费了。
对于这种情况,python提供了(generator),能一边循环一边计算,从而不需要创建完整的list,节省了内存空间。
第一种创建generator的方式:将[]改为()
>>> L = [x * x for x in range(1,10)] # 创建list >>> L # 打印list的每一个元素 [1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(1,10)) # 创建generator >>> g <generator object <genexpr> at 0x1024e0bf8> >>> next(g) # 用next()函数获取generator下一个返回值 1 >>> next(g) 4
next()会计算g的下一个元素,当没有元素时,会抛出StopIteration异常。generator是可迭代对象,可以使用for循环来代替next()
>>> g = (x * x for x in range(1,5)) >>> for n in g: ... print(n) ... 1 4 9 16
第二种创建generator的方式:函数定义中使用yield,将函数变成generator
下面是生成菲波那切数列的函数,除第一个和第二个数之外,后面每个数等于前两个数的和:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
fib(6) # 输出菲波那切数列前6个数
这种逻辑非常类似generator,可以从第一个元素开始,推算后面任意的元素。将print(b)改为yield b,该函数就就变成了generator。generator和普通函数执行流程不一样:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-70754-6.html
>我自愿为国家尊严而战
瞧你自己那点出息
打到康师傅金龙鱼