栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python---生成器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python---生成器

Python从入门到高手(内部资源-配学习资料)_哔哩哔哩_bilibili

# 集合推导式   {}类似列表推导式,在列表推导式的基础上添加了一个去除重复项
list1 = [1, 2, 1, 3, 5, 2, 1, 8, 9, 7]
set1 = {x + 1 for x in list1 if x > 5}
print(set1)

# 字典推导式
dict1 = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'C'}
newdict = {value: key for key, value in dict1.items()}
print(newdict)
# 生成器
'''
得到生成器方式
1.通过列表推导式得到生成器

'''

# [0,3,6,9,12,15,18,21,...,27]
newlist = [x * 3 for x in range(10)]
print(newlist)

# 得到生成器 generator
g = (x * 3 for x in range(10))
print(type(g))
print(g)
# 通过调用__next__() 方式得到元素
print(g.__next__())  # 0
print(g.__next__())  # 3
print(g.__next__())  # 6

# 方式2:next(生成器对象) builtins系统内置函数
# 每调用一次next则会产生一个元素
print(next(g))  # StopIteration 生成器本来可以产生10个,得到10个,在调用next(g),抛出异常

g = (x * 3 for x in range(10))
while True:
    try:
        e = next(g)
        print(e)
    except:
        print("没有更多元素啦!")
        break

--------------------------------------------------------------------------------

g = (x * 3 for x in range(10))
while True:
    try:
        e = next(g)
        print(e)
    except:
        print("没有更多元素啦!")
        break

# 定义生成器的方式二:借助函数完成
# 函数中出现了yield关键字,说明函数就不是函数,变成生成器
# 斐波那契数列
''':cvar
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接收调用的结果
3.得到的结果就是生成器
4.借助于next(), __next__()得到元素
'''


def func():
    n = 0
    while True:
        n += 1
        print(n)
        yield n  # return n + 暂停


g = func()
print(g)

print(next(g))
print(next(g))
print(next(g))
print(next(g))


def fib(length):
    a, b = 0, 1
    n = 0
    while n < length:
        # print(b)
        yield b  # return b + 暂停
        a, b = b, a + b
        n += 1
    return 'abc'  # return就是在得到StopIteration得到后的提示信息


g = fib(8)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

-------------------------------------------------------------------------------------

''':cvar
生成器方法
__next()__:获取下一个元素
send(value):向每次生成器调用中传值 注意:第一次调用send(None)
'''


def gen():
    i = 0
    while i < 5:
        temp = yield i  # return 0 + 暂停
        print('temp:', temp)
        for x in range(i):
            print('------------>', x)
        i += 1
    return '没有更多数据'


g = gen()
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))

# g.__next__()
print(g.send(None))  # yield结束后才能接收值
n1 = g.send('呵呵')
print('n1:', n1)
n2 = g.send('哈哈')
print('n2:', n2)

-------------------------------------------------------------

# 进程>线程>协程
def task1(n):
    for i in range(n):
        print('正在搬第{}块砖!'.format(i))
        yield None


def task2(n):
    for i in range(n):
        print('正在听第{}首歌!'.format(i))
        yield None


g1 = task1(10)
g2 = task2(5)

while True:
    try:
        g1.__next__()
        g2.__next__()
    except:
        break

''':cvar
生成器:generator
定义生成器方式:
1. 通过列表推导式方式
g=(x+1 for x in range(6))
2. 函数+yield
    def func():
        ...
        yield
    g=gunc()
产生元素:
1. next(generator) --->每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
2.生成器自己的方法:
g.__next__()
g.send(value)

应用:协程
'''

------------------------------------------------------------------------------------------------------

# 可迭代的对象:1.生成器 2.元组 列表 集合 字典 字符串
# 如何判断一个对象是否可以迭代?
from collections import Iterable

list = [1, 4, 7, 8, 8]
f = isinstance(list, Iterable)
print(f)

f = isinstance('abc', Iterable)
print(f)

f = isinstance(100, Iterable)
print(f)

g = (x + 1 for x in range(10))
f = isinstance(g, Iterable)
print(f)

''':cvar
迭代是访问集合元素的一种方式,迭代器是一个可以记住遍历位置的对象
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束
迭代器只能往前不会后退
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
生成器是可迭代的,也是迭代器
list是可迭代的,但不是迭代器
list--->迭代器

生成器与迭代器:
1)借助iter()函数的转换,变成迭代器,字典、元组、列表、集合
2)迭代器用next()调用 ---生成器
'''
list1 = [1, 2, 3, 4, 5]
list1 = iter(list1)  # 通过iter()函数将可迭代的变成一个迭代器

print(next(list1))
print(next(list1))
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530084.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号