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

2019-11-19  本文已影响0人  yydafx

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

1、生成器

1.1、什么是生成器
1.2、怎么创建生成器
def func1():
    print('=====')
    print('+++++')
    if False:
        yield

re = func1()
print(re)   # <generator object func1 at 0x00A94DF0> 得到生成器的对象
1.3、生成器怎么产生数据(怎么确定生成器中的元素)
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)

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

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 表达式
上一篇下一篇

猜你喜欢

热点阅读