一、迭代器(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:
returnelse:
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("添加参数")
迭代器、生成器、装饰器' ref='nofollow'>python基础【四】---->迭代器、生成器、装饰器
原文:https://www.cnblogs.com/Utopia-Clint/p/10878081.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!