迭代器
1.1、判断可迭代对象
from collections import Iterable
# 判断对象是否是可迭代对象
result = isinstance(X, Iterable)
print("X是否是可迭代对象:", result)
# >> X是否是可迭代对象: True
1.2、自定义迭代器
自定义迭代器对象: 在类里面提供__iter__和__next__方法创建的对象就是迭代器。
class StudentIterator(object):# 构造方法def __init__(self, my_list):self.my_list = my_list# 标志1def __iter__(self):return self# 标志2,获取迭代器中下一个值def __next__(self):if self.current_index < len(self.my_list):value = self.my_list[self.current_index]# 取值完成以后需要对下标加上1self.current_index += 1return valueelse:# 超出范围抛出停止迭代的异常raise StopIteration
# 迭代器被__iter__调用,返回一个迭代器
2、生成器
2.1 生成器创建方式1
把列表推导式的中括号改成小括号创建的对象就是生成器。生成器:生成器是一个特殊的迭代器,也就是说可以使用next和for循环取值
generator = (i * 2 for i in range(5))
print(generator)
#获取下一个值
value = next(generator)
print(value)
# 取所有值
for value in generator:print(value)
2.2 生成器创建方式2
在def里面看到yield关键字表示就是一个生成器
# 定义生成器def fibonacci(num):# num: 表示斐波那契数列的个数# 保存前两个值a = 0b = 1# 记录生成数列的下标current_index = 0# 循环判断条件是否成立while current_index < num:# 记录当前斐波那契数值result = a#生成下一个斐波那契数值,即b,但下一次输出aa, b = b, a + bcurrent_index += 1#代码执行到yield会暂停,把结果返回出取,再次启动生 成器的时候会在暂停的位置继续往下执行yield result
# 生成器返回类型是特殊的迭代器(生成器)需要for/next()取值
generator = fibonacci(3)
for value in generator:print(value)
3、装饰器
3.1闭包
1、在一个函数里边定义了一个函数
2、内函数可能会用到外函数的数据
3、外函数一定有返回值,而且是内函数的引用
# 外函数outer()
def outer():# 外函数局部变量,对于内函数来说相当于全局变量number = 10# 内函数 def inner():# 外函数数据的引用 nonlocal number number += 1# 返回值是内函数inner的引用return inner # 调用outer函数,用func接收inner函数的引用
func = outer()
# 调用inner函数
func()
1、装饰器定义:
闭包的延伸,外函数传入函数的引用,而且内函数返回函数的调用就是装饰器
2、作用:
在不修改函数体的前提下,在函数前面添加功能比如验证等
3、原理:
直接调用内函数,先执行内函数函数体,即验证的部分,在内函数的返回值的地方返回传入函数的调用,即不被修改的函数体。
def outer(func):def inner():return func()return inner
# 装饰器的使用 @ :相当于 func = outer(func)
# 即把func的引用替换成outer的返回值,也就是内函数的引用
# 然后在内函数中返回原本func的引用的调用,即func的函数体
@outer
def func():pass