python列表生成式和生成器

一,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))]

需要注意:

  1. 可以写两重for循环 直接在第一层后面接着写即可
  2. 迭代对象后面可以加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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值