列表推导式&生成器&迭代器

格式1:

[i for i in ‘可迭代值’]

举例

list1 = [i for i in range(1, 11)]
print(list1)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

格式2:

[i for i in ‘可迭代值’ if 条件判断]

步骤:

1. for i in ‘可迭代值’

2.if 条件判断

3.输出i

举例

list1 = [i for i in range(0, 11) if i % 2 == 0]
print(list1)
list2 = ['ads', '31', 'sada', '44']
list3 = [i for i in list2 if i.isalpha()]
print(list3)

[0, 2, 4, 6, 8, 10]
['ads', 'sada']

格式3:

[结果1 if 条件判断 else 结果2 for i in ‘可迭代值’]

步骤:

1.for i in ‘可迭代值’

2.if 条件判断

3.结果1 or 结果2

举例

list1 = ['das', 'hdadsa', '312', 'ojiqwe']
list2 = [word.title() if word.startswith('h') and word.isalpha() else word.upper() for word in list1]
# 开头为h的元素首字母大写,其余元素全部大写
print(list2)

['DAS', 'Hdadsa', '312', 'OJIQWE']

格式4:

[(x,y) for x in ‘可迭代值’ for y in ‘可迭代值’]

举例

list1 = [(x, y) for x in range(2) for y in range(3)]
print(list1)

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

生成器

1.通过列表推导式方式生成

2.函数+yield

产生元素

1.next(generator)       每次产生一个元素

2.生成器自己的方法  g.__next__()      g.send(valus)

***应用:协程

将列表推导式改成()

g = (x * 3 for x in range(20))
print(type(g))

print(g.__next__()) #产生元素
print(next(g))

<class 'generator'>
0
3

生成器生成元素结束,继续调用next或者生成器.__next__,会抛出报错StopIteration

yield关键字会使函数变为生成器

def func():
    n = 0
    while True:
        n += 1
        yield n  # 相当于return n并且暂停当前状态


g = func()
print(next(g))
print(next(g))
print(next(g))
print(next(g))

1
2
3
4

通过生成器生成斐波那契数列

def fib(lenth):
    n = 1
    a, b = 1, 1
    while n <= lenth:
        if n == 1 or n == 2:
            yield 1
            n += 1
        elif n > 2:
            yield a + b
            a, b = b, (a + b)
            n += 1
        return '没有更多元素了'  # 通过return返回错误消息

g = fib(10)
print(next(g))
print(next(g))
print(next(g))
print(next(g))

1
1
2
3

生成器send的用法

首次执行生成器如果用send的话需要传入None,每次执行send会给函数传入一个值

举例,使用send实现求移动平均值(案例摘自生成器send的用法案例 - aikell - 博客园

def avg_creater():
    num = 0
    count = 0
    avg = 0
    while True:
        num1 = yield avg
        num += num1
        count += 1
        avg = num/count

g = avg_creater()
g.__next__()
avg = g.send(10)
avg = g.send(20)
avg = g.send(30)
avg = g.send(40)
avg = g.send(50)
print(avg)

迭代器

可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator

1.只能向前不能后退

2.从第一个元素开始访问,指导所有元素被遍历完成

可以使用iter将列表转换为迭代器

list1 = [1, 2, 3, 4, 5]
list2 = iter(list1)
print(next(list2))
print(type(list2))

1
<class 'list_iterator'>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值