美文网首页
第014篇:三大神器之生成器

第014篇:三大神器之生成器

作者: yydafx | 来源:发表于2019-11-19 19:02 被阅读0次

Python的三大神器:装饰器、迭代器、生成器

1、生成器

1.1、什么是生成器
  • 生成器就是迭代器的一种;生成器作为容器保存的不是数据,而是产生数据的算法。
1.2、怎么创建生成器
  • 调用带有yield关键字的函数,就可以得到一个生成器。
    注意:函数中只要有yield,不管遇不遇到,调用这个函数都不会执行函数体,并且得到的是一个生成器对象
def func1():
    print('=====')
    print('+++++')
    if False:
        yield

re = func1()
print(re)   # <generator object func1 at 0x00A94DF0> 得到生成器的对象
1.3、生成器怎么产生数据(怎么确定生成器中的元素)
  • 一个生成器能够产生多少个数据和那些数据,看执行完生成器关联的函数的函数体会遇到几次yield。遇到几次yield生成器就可以产生多少个数据;每次遇到yield,yield后面的数据就是对应的元素
def func2():
    print('===')
    yield 10
    yield 100

gen1 = func2()
for x in gen1:
    print('x:',x)
1.4、生成器产生数据的规律

生成器怎么获取元素:
获取第一个元素的时候从函数的第一条语句开始执行,执行到第一个yield停下来,并且将yield后面的值作为当前获取到的元素;获取下一个元素的时候,接着上次结束的位置往后执行,直到遇到下一个yield为之。并且将yield的后面的值作为当前的元素,以此类推。
 如果从执行位置开始到函数结束没有遇到yield就会报StopIteration错误。

def func3():
    print('+++++')
    yield 1
    print('+++++')
    yield 2
    print('======')

gen2 = func3()
print(next(gen2))
print(gen2.__next__())
# print(gen2.__next__())  # StopIteration


def func4(n):
    for _ in range(n):
        yield 100

gen3 = func4(4)
print(next(gen3))
for x in gen3:
    print('x:', x)

写一个生成器,能够产生一个班所有学生的学号,班级人数自己定,前缀自己定

  • eg:121 --> 002 032 --> 01 23
def cls_gen(stu_num, char):
    length = len(str(stu_num))
    for i in range(1, stu_num+1):
        yield char + str(i).zfill(length)


cls_stu = cls_gen(23, 'st')
for stu in cls_stu:
    print(stu)

2、生成式

2.1、什么是生成式
  • 生成式就是生成器;写法简洁,只有一行代码。

1)语法一:

    生成器 = (表达式 for 变量 in 序列)

    展开如下:
        def 函数名:
         for 变量 in 序列:
gen2 = (i for i in range(1, 11))
print(next(gen2))

def great_num():
    for num in range(1, 11):
        yield num

gen1 = great_num()

gen3 = ('str%d' % i for i in range(5))
print(next(gen3))

2)语法二:

    生成器 = (表达式 for 变量 in 序列 if 条件语句)
    
    展开如下:
        def 函数名():
            for 变量 in 序列:
                if 条件语句:
                    yield 表达式
gen3 = ('str%d' % i for i in range(1, 5) if i & 1)
for i in gen3:
    print(i, end=', ')  # str1, str3,

print()

3)语法三:

    生成器 = (表达式 for 变量1 in 序列1 for 变量2 in 序列2)
    
    展开如下:
        for 变量1 in 序列1:
            for 变量2 in 序列2:
                yield 表达式
gen4 = (x for x in range(0, 10) if x % 2)
for x in gen4:
    print(x, end=', ')  # 1, 3, 5, 7, 9,

4)列表生成式

  • 将上面语法中的所有的小括号变成中括号,结果就会由原来的生成器变成列表
1)语法一:
    生成器 = [表达式 for 变量 in 序列)]

    展开如下:
        def 函数名:
         for 变量 in 序列:
            yield 表达式

相关文章

网友评论

      本文标题:第014篇:三大神器之生成器

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