一, 迭代器(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("添加参数")
来源: http://www.bubuko.com/infodetail-3061486.html