day12-装饰器、迭代器以及生成器

装饰器、迭代器以及生成器

1.有参装饰器的功能

在给函数添加功能的时候可以通过参数控制具体的操作(操作不固定)

2.怎么写有参装饰器

def 函数名0(装饰器的参数列表):
    def 函数名1(func):
        def 函数名2(*args, **kwargs):
            result = func(*args, **kwargs)
            新功能
            return result
        return 函数名2
    return 函数名1
    
def 函数名(装饰器的参数列表):
    无参装饰器
    return 无参装饰器的函数名

有参装饰器的用法:
@函数名0(装饰器实参列表)
# 写一个装饰器可以在函数结束后打印指定的任意提示信息
def add_message(msg):
    def test(func):
        def new_test(*args, **kwargs):
            result = func(*args, **kwargs)
            print(msg)
            return result
        return new_test
    return test


@add_message('------------')
def func1(x, y):
    print(x + y)
    return x + y


print(func1(10, 20))

迭代器

1.什么是迭代器(iter)

迭代器是容器型数据类型(序列)
特点:
a.不能同时查看所有元素(打印看不到里面的元素)
b.不能统计个数
c.获取元素的时候只能一个一个的取(每次去最上层的那个),每次获取元素该元素就会从迭代器中消失
(取一个少一个)

2.创建迭代器

迭代器不能统计个数
a.通过iter把其他序列转换成迭代器
b.创建生成器

iter1 = iter([10, 20, 30, 40])
print(iter1)

3.获取元素

不管通过什么样的方式获取到了迭代器中的元素, 对应的元素都会从迭代器中消失

1) 取单个元素
next(迭代器)   -   获取迭代器中最上层的元素
2) 遍历
for 变量 in 迭代器:
    pass
迭代器中元素被取过,不会再返回去
print(next(iter1))  # 10
print(next(iter1))  # 20
next(iter1)
print(next(iter1))  # 40
# print(next(iter1))  # 抛出异常 StopIteration
iter3 = iter('python!')
list1 = list(iter3)
print(list1)
# print(next(iter3))  # 抛出异常 StopIteration

iter4 = iter('python123')
next(iter4)
for x in iter4:
    print('x:',x)   # 从y开始取

生成器

1.什么是生成器

生成器的本质就是迭代器(迭代器的特点和获取元素的方式生成器都适用)

2.怎么创建生成器

调用带有关键字yield的函数就可以创建一个生成器对象
(如果被调用的函数中有yield,不会执行函数体,也不会获取函数返回值)

3.怎么确定生成器中产生的数据

产生数据的个数:看执行完生成器对应的函数的函数体会遇到几次yield
产生的数据的值:就看每次遇到的yield后面的数据是什么,没有数据就是None

def func():
    yield
    yield
    for _ in range(10):
        yield _


gen1 = func()
print(gen1)
print(list(gen1))   # [None, None, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

4.生成器产生数据的原理

调用函数创建生成器对象的时候不会执行函数体, 每次获取生成器中的元素的时候才会执行第一次获取元素
会从函数体开始位置开始执行,执行到第一次yield结束,并且将yield后的数据作为这次获取到的元素,
后面每次获取元素的时候都是从上次结束的位置往后执行,执行到下一次yield又会结束。如果从当前位置
开始执行到函数结束没有遇到yield,如果是next就会抛出异常StopIteration

# 练习:写一个产生学号的生成器,能够产生指定学科001~999的学生学号
# python学生: python001 ~ python999
# java学生:java001 ~ java999


def class_student(str1, num):
    for z in range(1, num + 1):
        yield f'{str1}{str(z).zfill(3)}'


gen2 = class_student('java', 20)
print(list(gen2))
# 练习: 写一个偶数生成器,能够产生所有的正的偶数


def nums():
    num = 2
    while True:
        yield num
        num += 2


gen3 = nums()
print(next(gen3))

for x in range(9):
    print(next(gen3))

4.生成式 - 生成器的推导式

将列表推导式的[]变成()就是生成器的推导式即生成式

gen4 = (x*2 for x in range(10))
print(gen4)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值