Python概念之装饰器、迭代器、生成器

装饰器、迭代器、生成器均属于函数知识范畴

1.装饰器

理解装饰器,首先要了解闭包函数。

闭包函数:1、定义在函数内部的函数;

     2、该函数的函数体代码包含对外部作用域(而不是全局作用域)名字的引用;

     3、通常将闭包函数用return返回,然后可以任意调用。

eg:以下代码中inner()即闭包函数

def outer():    x=1    def inner():        print(x)    return innerf=outer()

装饰器:即是一种闭包函数的应用。

什么是装饰器?:装饰它人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。

装饰器的原则:1、不修改被装饰对象的源代码 2、不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

import time
def timmer(func):
    def inner():
        start=time.time()
        res=func()
        stop=time.time()
        print(‘run time is %s‘ %(stop-start))
        return res
    return inner

@timmer #index=timmer(index)
def index():
    time.sleep(1)
    print(‘welecome to index‘)
    return 1111
res=index()
print(res)

2.迭代器

迭代器:迭代器即迭代的工具。

什么是迭代?:指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值

为什么要有迭代器?:对于序列类型:str,list,tuple,可以依赖索引来迭代取值,但是对于dict,set,文件,python必须为我们提供一种不依赖于索引的迭代取值的方式-》迭代器

什么是可迭代对象?:可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下

‘hello‘.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{‘a‘:1}.__iter__
{‘a‘,‘b‘}.__iter__
open(‘a.txt‘).__iter__

什么是迭代器对象?:可迭代对象执行obj.__iter__()得到的结果就是迭代器对象,而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象

文件类型是迭代器对象:
open(‘a.txt‘).__iter__()
open(‘a.txt‘).__next__()

注意:迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。

eg:

d={‘name‘:‘lili‘,‘age‘:‘18‘,‘sex‘:‘male‘}
d_iter=iter(d)
# d_iter=iter(d)
while True:
    try:
        print(next(d_iter))
    except StopIteration:
        break

优点:
提供一种统一的、不依赖于索引的取值方式
迭代器同一时间在内存只有一个值,更节省内存
缺点:
只能往后取,并且是一次性的
不能统计值的个数,即长度

3.生成器

什么是生成器?:只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器

生成器就是迭代器

def func():
    print(‘=====>1‘)
    yield 1
    print(‘=====>2‘)
    yield 2
    print(‘=====>3‘)
    yield 3
g=func()# g.__iter__
res1=next(g)
print(res1)

res2=next(g)
print(res2)

res3=next(g)
print(res3)

yield的功能:
1、yield为我们提供了一种自定义迭代器对象的方法
2、yield与return的区别1:yield可以返回多次值 #2:函数暂停与再继续的状态是由yield帮我们保存的

原文地址:https://www.cnblogs.com/iqinyu/p/9478972.html

时间: 2024-11-04 00:18:48

Python概念之装饰器、迭代器、生成器的相关文章

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

python第四天装饰器+迭代器+生成器

1.函数嵌套:在调用一个函数的过程中,调用了其他函数 def f1(): x=1 def f2(): print('from f2') f2() f1()  2.名称空间与作用域 a. 名称空间:存放名字与变量值绑定关系的地方 (1)内置名称空间:在python解释器启动时产生,存放一些python内置的名字 (2)全局名称空间:在执行文件时产生,存放文件级别定义的名字. (3)局部名称空间:在执行过程中,如果调用了该函数则会产生该函数的局部名称空间.在调用该函数的时候生效,调用结束时失效 加载

python大法好——装饰器、生成器、迭代器

1.装饰器 1. 不能修改被装饰的函数的源代码  2. 不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1 函数即“变量” 2 高阶函数     a:把一个函数名当做实参传给另外一个函数(不修改被装饰函数源代码)     b:返回值中包含函数名(不修改函数的调用方式) 3嵌套函数 装饰器 想了很久过两天代码实现 : 列表生成式: a=[i if i<5 else i*i for i in a] 2.生成器 为什么会有这个功能? 答:我们可以使用列表储存数据,可当我们的数据特别大的时候,建立

Python学习---装饰器/迭代器/生成器的学习【all】

Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210 原文地址:https://www.cnblogs.com/ftl1012/p/9484145.html

&lt;04day&gt;_函数嵌套--闭包函数--装饰器--迭代器--生成器

一.函数的嵌套定义 1.python函数支持嵌套 def f1(): #f1函数的定义 def f2(): #f2函数的定义 print('from f2') def f3(): #f3函数的定义 print('from f3') f2() f1() 嵌套函数--运行结果说明: 1首先调用f1()结果,f1函数为空.担保函f2函数,f2函数有内容打印并且有调用,f2函数包含f3函数,但f3函数无调用. 运行结果: 列子:多个数据之间的大小比较. #!/usr/bin/python # -*- c

函数+装饰器+迭代器+生成器

闭包函数 闭包:定义在内网函数,包含对外部作用域而非全局作用域 范围:一个函数套用1或n个函数 from urllib.request import urlopen #urlopen模块 作用:爬网页 #闭包函数,内部get函数调用外部page函数 def page(url): #调用url def get(): #下载 return urlopen(url).read() #爬网页 return get #返回url值 baidu=page("http://www.baidu.com"

Day4 装饰器——迭代器——生成器

一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def foo(): print('foo') def bar(): print('bar') dic={ 'foo':foo, 'bar':bar, } while True: choice=input('>>: ').strip() if choice in dic: dic[ch

python_装饰器——迭代器——生成器

一.装饰器 1.什么是装饰器? 器=>工具,装饰=>增加功能 1.不修改源代码 2.不修改调用方式 装饰器是在遵循1和2原则的基础上为被装饰对象增加功能的工具 2.实现无参装饰器 1.无参装饰器的模板 def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper 2.使用:在被装饰对象正上方单独一行 @无参装饰器名 def foo(): pass 3.实现有参装