美文网首页python从入门到放弃
python-11-函数之生成器和生成式

python-11-函数之生成器和生成式

作者: 楠木cral | 来源:发表于2018-10-22 20:29 被阅读0次

一、生成式与生成器
可以把迭代器看成一种容器,类似列表。生成器就是来生成迭代器。

if __name__ == '__main__':
    # 1.生成式 ---- 产生一个迭代器的表达式
    # a是生成器,能够生成0-9中的所有的数字
    a = (x for x in range(10))
    print(a, type(a))

    a0 = (x*2 for x in range(10))

    a1 = (char for char in 'hello world')

    a2 = (char for char in 'h0el761lo p2yt3ho4n902' if '0'<=char<='9')

    #2.生成器和迭代器都是通过next来获取里面的数据
    print(next(a))
    print(next(a))
    print(next(a))
    print(next(a))

    print('=======')
    for x in a:
        print(x)

    # 3.将生成器转换成列表
    # 通过将生成式产生的迭代器转换成了一个列表
    list1 = [x for x in range(10)]
    print(list1)

    # 4.将生成器转换成字典
    # 注意:容器类型的元素是元祖,并且元素中有且只有两个元素的,才能转换成字典
    dict1 = dict((x, x*2) for x in range(5))  # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
    print(dict1)

    # 练习:一句代码实现交换一个字典中的key和value的值. {'a':1, 'b':2} --> {1:'a', 2:'b'}
    dict2 = dict((value, key) for key,value in {'a': 1, 'b': 2, 'c': 3}.items())

    old = {'a': 1, 'b': 2, 'c': 3}
    dict3 = dict((old[key], key) for key in old)
    print(dict3)

二、生成器

if __name__ == '__main__':
    def func1():
        for x in range(10):
            return x

    # 0 <class 'int'> < class 'function' >
    print(func1(), type(func1()), type(func1))

1.yield关键字
只要函数中有yield关键字,那么这个函数就会变成一个生成器。
a.有yield的函数,在调用函数的时候不再是获取返回值,
而是产生一个生成器对象,生成器对象中保留的是函数体。
b.当通过next获取生成器中的数据的时候,才会去执行函数体,执行到yield为止,
并且将yield后面的结果作为生成的数据返回。同时记录结束的位置,下次再调用next的时候,
从上次结束的位置接着往后执行。

    def func2():
        print('abc')
        for x in range(10):
            yield x
            print('aaa')
    # 注意:函数中只要有yield,不管yield会不会执行到,函数的调用结果都是生成器
    def func3(x):
        print('abc')
        if x > 10:
            yield 100
        return 20

    # print(func2(), type(func2()), type(func2))
    # 这儿的func2()是一个生成器
    gen = func2()
    print(next(gen))
    print(next(gen))
    print(next(gen))

    gen2 = func3(1)
    print(gen2)

练习:写一个生成器,可以产生斐波那契数列(可以无限生成)

    # 1,1,2,3,5,8,13,21,34....
    def sequence():
        yield 1
        yield 1
        x = 1
        y = 1
        while True:
            yield x + y
            x, y = y, x+y

    se = sequence()
    print(next(se))
    print(next(se))
    print(next(se))
    print(next(se))
    print(next(se))
    print(next(se))
    print(next(se))
    print(next(se))
    print(next(se))
    print(next(se))
2.生成器和生成式产生的对象就是迭代器
将列表转换成迭代器对象
迭代器(iter)
    iter1 = iter([1, 2, 3, 4])
    print(iter1)
    print(next(iter1))
    print(next(iter1))
    for item in iter1:
        print(item)

三、迭代器
1.什么是迭代器(iter)
迭代器是python中一种容器类的数据类型。属于序列。没有具体的字面量,可以将其他的序列转换成迭代器:iter(序列)

2.迭代器的特点
只能通过next方法去一个一个按顺序获取迭代器中的元素,取出后迭代器中就不存在这个元素了

iter1 = iter('abcd')
print(iter1)

print(next(iter1))
print(next(iter1))

for x in range(5):
    print(x)

print(next(iter1))
print(next(iter1))
# print(next(iter1))  # StopIteration

3.遍历迭代器

iter1 = iter(['abc', 10, 'name'])
print('=====')
for x in iter1:
    print(x)

print('====')

# print(next(iter1))

next(迭代器)
迭代器.next()

iter2 = iter((1, 2, 3))
a = iter2.__next__()
print(a)  # 1

list1 = list(iter2)
print(list1)  # [2, 3]

相关文章

  • python-11-函数之生成器和生成式

    一、生成式与生成器可以把迭代器看成一种容器,类似列表。生成器就是来生成迭代器。 二、生成器 1.yield关键字只...

  • 函数(四)生成器和promise

    1 生成器函数 定义和使用生成器 生成器函数能生成一组值的序列。显式地向生成器请求一个新的值,随后生成器响应一个新...

  • 迭代器&生成器

    列表推导式: 列表生成式: 相当于: 以上就是用for语句的迭代器。 生成器表达式: 生成器函数: 调用: 生成器...

  • 4.1.列表推导式和生成器的使用 4.22迭代器和可迭代.

    函数生成器1. 函数生成器2. 函数生成器任务同时进行 定义生成器方式 迭代器和可迭代的区别

  • 2018-07-16

    ## 1\. 生成器和生成器函数 ``` 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 ...

  • 5-7 列表,字典集合推导式

    列表推导式用途 1 生成一个列表2 借助函数完成复杂逻辑运算 生成器 生成器是用推导式生成一个可以迭代的对象生成器...

  • Python学习(2)

    本系列内容来源于 廖雪峰的Python教程 点击查看原文 迭代 列表生成式 生成器 列表生成器 生成器函数 高级函...

  • ES6:生成器(Generators)

    生成器 先看下面的例子 上面的函数就是生成器函数,和普通函数的不同在于: 使用function*定义生成器函数,而...

  • 生成器(2)函数

    需求:有的时候逻辑比较复杂,生成器推导式for循环无法实现的时候可以选择函数生成器 改为生成器:把return 改...

  • python高级特性-生成器

    生成器和列表生成式的区别列表生成式:[expr for iter_var in iterable]列表生成器:(e...

网友评论

    本文标题:python-11-函数之生成器和生成式

    本文链接:https://www.haomeiwen.com/subject/ceknzftx.html