1.迭代器:
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合
特点:
1.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
2.不能随机访问集合中的某个值 ,只能从头到尾依次访问
3.访问到一半时不能往回退
4.便于循环比较大的数据集合,节省内存
可被next()函数调用并不断返回下一个值(直到没有数据时抛出 StopIteration错误)的对象称为迭代器(Iterator)。
例:a = iter([1,2,3,4,5])
print(a) #结果:<list_iterator object at 0x0044ADFO>
print(a.__next__()) #结果:1
print(a.__next__()) #结果:2
2.生成器(generator):
一个函数调用时返回一个迭代器,那这个函数就叫生成器(generator),如果函数中包含yield语法,则这个函数变成生成器
带有yield的函数,而generator iterator则是generator function的返回值,即一个generator对象;
yield的主要效果就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
可以通过yield实现在单线程的情况下实现并发运算效果
例:
iter1 = iter([1,2,3,4,5])
def out_iter(iter):
for i in iter:
yield i
get_elem = out_iter(iter1)
print('取到%s'%get_elem.__next__())
print('取到%s'%get_elem.__next__())
print('取到%s'%get_elem.__next__())
print('取到%s'%get_elem.__next__())
print('取到%s'%get_elem.__next__())
# print('取到%s'%get_elem.__next__()) #当迭代器内元素都取完再进行next()时会报错 报错内容:StopIteration
结果:
取到1
取到2
取到3
取到4
取到5
3.装饰器:
是一个返回函数的高阶函数
被装饰的函数带有不同个数的参数,所以装饰器需要运用动态函数
一个函数可被多个装饰器装饰
作用:当想给一个函数func()增加某些功能,但又不希望修改func()函数的源代码是可用装饰器,在代码运行期间动态增加功能
此处例题转载:https://www.jb51.net/article/119590.htm
可前往看详解
一个简单例子引入无参装饰器
先来看简单的几行代码,代码的运行结果是先睡2秒,再打印"hello boy!":
import time
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo()
我们现在我们需要为其添加一个程序计时功能,但是不能修改原始的代码:
import time
def timmer(func):
def wrapper():
"""计时功能"""
time_start=time.time()
func()
time_end=time.time()
print("Run time is %f "%(time_end-time_start))
return wrapper
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo=timmer(foo)
foo()
#运行结果
Hello boy!
Run time is 2.000446
看!我们没有修改原来的代码就实现了这个功能,因为函数也是对象,所以能够将函数foo当做参数传递给了函数timmer。
在python中,有个更简洁的方式来取代foo=timmer(foo),使用@timmer这种方式,这个在python中被称为语法糖。
import time
def timmer(func):
def wrapper():
"""计时功能"""
time_start=time.time()
func()
time_end=time.time()
print("Run time is %f "%(time_end-time_start))
return wrapper
@timmer #等于 foo=timmer(foo)
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo()