一,python迭代
所谓迭代就是循环,python里的虚幻不同于c,java里的循环,需要依靠下标,它和java里列表的迭代差不多。
for x in arr:
print(x)
只要arr是Itreable 可迭代对象 那么就可以用这种方式迭代。
二,列表生成式
要生成list[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1,11))
那么生成list[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]怎么办?
当然可以去迭代上面的list,不过太麻烦了,所以有了列表生成式,来看写法:
[x*x for x in list(range(1,11))]
需要注意:
- 可以写两重for循环 直接在第一层后面接着写即可
- 迭代对象后面可以加if条件语句
列表生成式就是为了简化书写,太复杂的生成式,用列表生成式是写不出来的。
三,生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
有两种方法创建生成器:
使用()创建generator:
g = (x*x for x in list(range(1,11)))
print(g)
Output:
<generator object <genexpr> at 0x0000018E57732138>
可以看到,返回的不再是一个列表,而是一个generator,可以用next(g)去获取下一个值
print(next(g))
print(next(g))
Output:
1
4
因为generator是可迭代对象,所以用for去遍历才是正确做法
for x in g:
print(x, end=' ')
Output:
1 4 9 16 25 36 49 64 81 100
使用函数+yeild创建generator:
就像上面说得,列表生成式毕竟只有一行,比较复杂的代码是写不出来的,比如说按行生成杨辉三角。这时候就需要用函数去实现generator了。
def yanghui(max):
t = [1]
i = 1
while i<=max:
yield t
t.append(0)
t = [t[i-1]+t[i] for i in range(len(t))]
i = i + 1
for t in yanghui(5):
print(t)
Output:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
要把函数变成generator,只需要把使用yield
就可以了。generator和函数的执行流程不一样。函数是顺序执行,遇到return
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行。
其实yield+函数实现生成器的并不难,难的是用python写杨辉三角,对从静态语言转过来的人来说,这么写有些太随意的感觉。
首先举个例子:
a, b = b, a+b #表示把b的值赋给a, a+b的值赋给b
#对,就和你看到的一样,不需要想静态语言搞个临时变量去存然后再去赋值
#这句代码可以这样理解
t = (b, a+b)
a = t[0]
b = t[1]
要看懂上面的杨辉三角,还需要清楚,当只用一维数组的时候,怎么去逐行输出杨辉三角。
就是从后往前a[i] = a[i] + a[i-1]即可,因为int[]初始化未0所以,我们在python代码里手动append(0)