一、迭代器(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()