一、迭代器(iterator)
特点:
- 迭代器是访问集合元素的一种方式,迭代器对象从集合的第一个元素开始访问,直到
所有的元素被访问完结束。 - 迭代器只能往前不会后退;
- 不要求先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,在这之前或之后元素可以不存在或者被销毁;
- 访问者不需要关心迭代器内部的结构,仅需通过 .__next__()方法不断去取下一个内容,通过 .__iter__() 返回迭代器自身
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问;
实例
>>> city = ['wuhan','shenzhen','chongqing','huanggang'] >>> city <list_iterator object at 0x101402630> >>> city .__next__() #方法一:使用next方法来使用迭代器 'wuhan' >>> city .__next__() 'shenzhen' >>> city .__next__() 'chongqing' >>> city .__next__() 'huanggang' >>> city .__next__() # 如果容器中没有更多元素了,则抛出StopIteration异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration # 方法二:使用for循环来使用迭代器 it = iter(city) for x in it: print(x)
二、生成器(generator)
定义:
一个包含了yield关键字的函数就是一个生成器,该函数也叫生成器函数。当生成器函数被调用时,在函数体中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器中代码,直到遇到一个yield表达式或return语句。yield表达式表示要生成一个值,return语句表示要停止生成器。换句话说,生成器是由两部分组成,生成器的函数和生成器的迭代器。生成器的函数是用def语句定义的,包含yield部分;生成器的迭代器是这个函数返回的部分。二者合起来叫做生成器。
实例一:
a = [i*i for i in range(1,10)] print(a) # 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81]
实例二:利用生成器自定义range
def drange(num): temp = -1 while True: temp = temp + 1 if temp >= num: return else: yield temp
三、装饰器
特点:
- 不能修改被装饰的函数的源代码
- 不能修改被装饰的函数的调用方式
- 满足上面的两种情况下给程序增添功能
实例一:一个简单装饰器实现计算函数运行的时间
# -*- coding:utf-8 -*- # @Author : Clint # @File : calculate_time.py import time def cal_time(func): def wrapper(*args, **kwargs): start_time = time.time() x = func(*args, **kwargs) end_time = time.time() print(func.__name__+"的time cost:", end_time-start_time) return x return wrapper @cal_time #语法糖 test=timer(test)
def test_func():
time.sleep(3)
print("fun_test...") # 结果 test_func的time cost:3.000171661376953
实例一:装饰有参函数
import time def timer(func): def deco(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print(stop_time-start_time) return deco @timer def test(parameter): time.sleep(3) print("test is running") test("添加参数")