Python中的可迭代对象(iterable)是指可以被迭代的对象,例如列表、元组、字符串等。可迭代对象可以通过循环来访问其元素。
迭代器(iterator)是一种能够逐个访问元素的对象,它实现了__iter__()
和__next__()
方法。__iter__()
方法返回迭代器对象自身,__next__()
方法返回下一个元素。当没有元素可以返回时,__next__()
方法抛出StopIteration
异常。
from collections.abc import Iterable, Iterator
class MyDatas:
def __init__(self, n):
self.datas = [i for i in range(1, n + 1)]
self.current_index = 0
def __iter__(self):
return self
def __next__(self):
if self.current_index >= len(self.datas):
raise IndexError
else:
current = self.datas[self.current_index]
self.current_index += 1
return current
md = MyDatas(5)
print(isinstance(md, Iterable), isinstance(md, Iterator))
输出:
True True
生成器(generator)是一种特殊的迭代器,它使用yield
语句来返回一个值并暂停执行。生成器可以通过遍历来逐个获取元素,每次获取时都会从上次暂停的位置继续执行。
from collections.abc import Generator
def my_datas():
yield 1
yield 1
yield 1
yield 3
yield 2
return 100
r = my_datas()
print(type(r))
# for i in my_datas():
# print(i)
# 使用try结合next异常捕获StopIteration 获取函数真实返回值
while True:
try:
print(next(r))
except StopIteration as e:
print(f"取完了")
break
输出:
1
1
1
3
2
取完了
装饰器(decorator)是一种用于修改或增强函数或类的功能的语法结构。装饰器可以将一个函数或类作为参数,并返回一个新的函数或类。装饰器常用于添加额外的功能,例如日志记录、性能分析等。
1.外部函数嵌套内部函数 2.外部函数将内部函数返回 3.内部函数可以访问外部函数局部变量。
def cost_time(f):
def calc():
start = time.time()
f()
print(f"{f.__name__}消耗时间{time.time()-start}")
return calc
# cost_time(lambda: print("你是一个一个"))()
datas = [random.randint(0, 10000) for i in range(10000)]
datas2 = datas.copy()
@cost_time
def my_sort1():
datas.sort(reverse=True)
print(datas)
@cost_time
def my_sort2():
datas3 = sorted(datas2, reverse=True)
print(datas3)
my_sort1()
my_sort2()
输出:
my_sort1消耗时间0.007985115051269531
my_sort2消耗时间0.003493070602416992