第十三天:迭代器、生成器、装饰器

1 迭代器(iter)

1)迭代器是容器型数据类型

2)如何创建迭代器:a.将其他序列转化成迭代器;b.创建生成器

3)特点:打印时不能查看元素;无法获取元素个数;获取元素的时候必须将元素从迭代器中取出,取出后元素会从迭代器中消失,并且无法再添加

#创建迭代器
i1=iter('abc')
print(i1)         #<str_iterator object at 0x00000195F695C128>
print(len(i1))    #报错!

1.1 迭代器获取元素

注释:迭代器不管以什么方式获取到了它的元素,那么被获取到的元素就会从迭代器中消失

1)获取单个元素

next(迭代器) ——获取迭代器最前面那个元素

i1=iter('abc')
print(next(i1))  #'a'
print(next(i1))  #'b'
print(next(i1))  #'c'
print(next(i1))  #报错!

2)遍历

for 变量 in 迭代器

​ pass

i2=iter([1,2,'s',5])
next(i2)
for x in i2:
    print(f'x:{x}')    # x:2 x:s x:5
    
i3=iter('abc123')
result=list(i3)
print(result)       #['a', 'b', 'c', '1', '2', '3']
print(next(i3))     #报错! StopIteration

2 生成器

2.1 定义

1)生成器是容器型数据类型,但是生成器中存储的并不是数据,而是产生数据的算法

2)生成器就是(从获取数据的角度来看还是)迭代器

2.2 创建生成器

1)调用一个带有yield关键字的函数就可以得到一个生成器对象

注意:如果被调用的函数中有yield,那么调用函数的时候就不会执行函数体,也不会获取函数返回值,而是得到一个生成器

def func1():
    print('+++')
    print('---')
    yield
    return 100
print(func1())  #<generator object func1 at 0x000001EE07144138>

2)控制生成器元素的个数和值

执行创建生成器函数的函数体时,会遇到几次yield,那么对应的生成器就可以创建几个数据;每次遇到yield,yield后面的值就是创建的具体的数据

def num_gender():
    yield 10
    yield 20
    yield 30
    ------------------
    for x in range(10,31,10)
gen1=num_gender()
print(list(gen1))  #[10, 20, 30]
print(next(gen1))  #报错! StopIteration

# 练习:写一个函数可以创建一个生成器,产生这些数据:stu001, stu002, ... stu099
def get_nums():
    for i in range(1,100):
        yield 'stu'+f'{i:0>3}'
nums1=get_nums()
print(list(nums1))      #['stu001', 'stu002', 'stu003', 'stu004', 'stu005',...]

3 装饰器

3.1 定义

1)装饰器=实参高阶函数+返回值高阶函数+糖语法

2)装饰器是用来给已经定义好的函数添加功能的

import time
def func1():
    #获取时间
    start=time.time()
    print('hello world')
    end=time.time()
    print(f'执行时间:{end-start}')
func1()

3.2 无参装饰器

def 装饰器名称(原函数对应的形参):

​ def 新函数名(*args,**kwargs):

​ 原函数返回值=原函数(*args,**kwargs)

​ 新增功能

​ return 原函数返回值

​ return 新函数名


def 装饰器名称(f):
    def new_f(*args,**kwargs):
        result=f(*args,**kwargs)
        新增功能
        return result
    return new_f
#原数据乘于100
def add_logp(f):
    def new_f(*args,**kwargs):
        result=f(*args,**kwargs)
        if type(result) in(int,float):
            return result*100
        return result
    return new_f

@ add_logp
def func1(n):
    print (n+1)
    return (n+1)
r=func1(2)
print(r)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值