第十二天 迭代器生成器

1. 什么是迭代器(iter)

1)迭代器是容器型数据类型
2)怎么创建迭代器:a.将其他序列转换成迭代器 b.创建生成器
3)特点:打印的时候不能查看元素;无法获取元素个数;
获取元素的时候必须将元素从迭代器中取出,取出后元素会从迭代器中消失,并且无法再添加。

# 创建迭代器
i1 = iter('abc')

print(i1)       # <str_iterator object at 0x10653ebe0>



# print(len(i1))        # 报错!

i2 = iter([10, 20, 'abc', 30])
print(i2)       # <list_iterator object at 0x10705ed60>

2. 迭代器获取元素

“”"
迭代器不管以什么样的方式获取到了它的元素,那么被获取到的元素就会从迭代器中消失。

1)获取单个元素
next(迭代器) - 获取迭代器最前面那个元素

2)遍历
for 变量 in 迭代器:
pass
“”"

i1 = iter('abc')
print(next(i1))     # 'a'
print(next(i1))     # 'b'


# print(next(i1))     # 报错!StopIteration

i2 = iter([10, 20, 'abc', 30])
next(i2)
for x in i2:
    print(f'x:{x}')


i3 = iter('abc123')
result = list(i3)
print(result)       # ['a', 'b', 'c', '1', '2', '3']
# print(next(i3))     # 报错! StopIteration

1. 什么是生成器

“”"
1)生成器是容器型数据类型,但是生成器中存储的并不是数据,而是产生数据的算法
2)生成器就是迭代器

2. 怎么创建生成器

调用一个带有yield关键字的函数就可以得到一个生成器对象。
(如果被调用的函数中有yield,那么调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器)

def func1():
    print('++++')
    print('----')
    if False:
        yield
    return 100


result = func1()
print(f'result:{result}')

3. 怎么控制生成器元素的个数和值

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

def number_gender():
    # yield 100
    # yield 200
    # yield 300
    for x in range(100, 301, 100):
        yield x


gen1 = number_gender()
print(list(gen1))       # [100, 200, 300]
# print(next(gen1))       # 报错! StopIteration


# 练习:写一个函数可以创建一个生成器,产生这些数据:stu001, stu002, ... stu999
def study_num():
    for x in range(1, 1000):
        yield f'stu{x:0>3}'


gen2 = study_num()
print(next(gen2))
print(next(gen2))
for _ in range(5):
    print(next(gen2))

print(next(gen2))


def func2():
    print('-----------1-------------')
    yield 100
    print('-----------2-------------')
    yield 200
    print('-----------3-------------')
    yield 300


gen3 = func2()
print(next(gen3))
print(next(gen3))

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

1. 装饰器

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

2. 添加功能 - 统计函数执行时间


import time
# 方案一:直接将新增的功能对应代码添加到函数中
# 存在的问题:如果多个函数都要添加相同的时候,需要将新增功能的代码写多遍
def func1():
    # 获取当前时间
    start = time.time()
    print('hello world!')
    end = time.time()
    print(f'执行时间:{end - start}')


func1()


def func2(a=1, b=2):
    start = time.time()
    print(a + b)
    end = time.time()
    print(f'执行时间:{end - start}')


func2(10, 20)


# 方案二:直接使用实参高阶函数
print('-------------------------------------------------------')


def func1():
    print('hello world!')


def func2(a=1, b=2):
    print(a + b)


def func3():
    sum1 = 0
    for x in range(101):
        sum1 += x
    print(sum1)


def count_time(f):
    start = time.time()
    f()
    end = time.time()
    print(f'执行时间:{end - start}')


count_time(func1)
count_time(func2)
count_time(func3)


# 方案三:使用装饰器
def total_time(f):
    def new_f(*args, **kwargs):
        start = time.time()
        result = f(*args, **kwargs)
        end = time.time()
        print(f'执行时间:{end - start}')
        return result
    return new_f


print('-------------------------------------------------------')


@total_time
def func1():
    print('hello world!')


@total_time
def func2(a=1, b=2):
    return a + b


# @total_time
def func3():
    sum1 = 0
    for x in range(101):
        sum1 += x
    print(sum1)


func1()

result = func2(10, 20)
print(f'result:{result}')

func3()


1. 无参装饰器语法

“”"
def 装饰器名称(原函数对应的形参):
def 新函数名(*args, **kwargs):
原函数返回值 = 原函数(*args, **kwargs)
新增功能
return 原函数返回值
return 新函数名

def 装饰器名称(f):
def new_f(*args, **kwargs):
result = f(*args, **kwargs)
新增功能
return result
return new_f
“”"

# 练习:写一个装饰器在函数调用结束后打印'千锋教育'
def add_logo(f):
    # f = func2
    def new_f(*args, **kwargs):
        result = f(*args, **kwargs)
        print('千锋教育')
        return result
    print(new_f)
    return new_f


@add_logo
def func1():
    print('hello world~')


func1()

@add_logo
def func2(n, m=2):
    print(n * 2 + m)


func2(10, 20)

# 练习:写一个装饰器将函数返回值乘以100
# 20  -> 2000


def ride100(f):
    def new_f(*args, **kwargs):
        result = f(*args, **kwargs)
        if type(result) in (int, float):
            return result * 100
        return result
    return new_f


@ride100
def func1():
    return 12.3


result = func1()
print(f'result:{result}')


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值