简述Python中的迭代器、生成器和装饰器

一、迭代器(Iterator)

1、先来了解一下可迭代对象:
可以直接作用于for循环的对象统称为可迭代对象,即Iterable

  • 集合数据类型,如list、tuple、dict、set、str等;
  • generator,包括生成器和带yield的generator function。

2、什么是迭代器
内部实现了iter()方法和next()方法的对象就是迭代器

  • iter()是返回迭代器对象本身;
  • 调用next()方法会返回下一个值(直到没有数据时抛出StopIteration错误)
总结:
- 凡是可作用于for循环的对象都是Iterable类型;
- 凡是可作用于next()函数的对象都是Iterator类型;
- list,dict,str虽然是Iterable,却不是Iterator。

二、生成器(Generator)

我们常说的生成器,就是带有 yield 的函数
生成器创建方式两种:

  • 通过列表生成式生成:
1、s = (x*2 for x in range(5))
  • 函数中只要有yield就是生成器对象
# 菲波那切数列
	def fib(n):
    print("-----start-----")
    a, b = 0, 1
    for i in range(n):
        yield b
        a, b = b, a + b
    print("-----end-------")


f = fib(8)

while True:
    try:
        x = next(f)
        print("f:", x)
    except StopIteration as e:
        print("生成器最后的返回值是:", e.value)
        break

生成器对延迟操作提供了支持,所谓延迟操作,不是立刻产生结果,是在需要时才产生结果。

三、装饰器(Decorator)

装饰器本质就是一个函数;
装饰器可以使其他函数在不改变任何代码的前提下增加额外功能。
装饰器应用场景有很多,比如验证登录、打印日志、记录程序运行时间等。

实例1:验证登录

import functools
def check_login(func):
    """
    在这里从新定义一个高阶函数,这就是decorator。
    """
    # 加入@functools.wraps(func) 可以保证装饰器不会对被装饰函数造成影响。
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        user = "admin"   # 假设这是数据库中的用户名和密码
        passwd = "123"
        username = input("输入用户名:")
        password = input("输入密码:")
        if username == user and password == passwd:
            return func(*args, **kwargs)
        else:
            print("用户名或密码错误。")
    return wrapper

# 利用python的@语法,把decorator置于home函数的定义处 相当于home = check_login(home)
@check_login
def home():
    print("欢迎来到XX首页!")

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值