python装饰器、迭代器、生成器、闭包等等

闭包是什么
内层函数调用外层函数。
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

def outer():
    name = '好好听课'
    def inner():
        print("你要干嘛",name)
    return inner

fun = outer()
fun()

闭包+高阶函数=装饰器

为什么要用装饰器?
软件开发需要遵守以下原则:
开闭原则:
1.对已实现的功能模块不应该修改
2.对现有的功能的扩展开发

装饰器,python自带语法糖
例题:用装饰器实现程序计算程序计算时间

import time

def count_time(fun):
    def inner():
        start_time = time.time()
        fun()
        end_time = time.time()-start_time
        print(end_time)
    return inner

@count_time
def loop():
    for i in range(10):
        print(i)

loop()

迭代器

a =iter([3,1,2,33])
print(type(a))
print(a.__next__(),a.__next__(),a.__next__(),a.__next__())
<class 'list_iterator'>
3 1 2 33

可以看到a是一个迭代器的类,需要用next方法或循环取出迭代器中的值
map()函数返回的也是一个迭代器,可以用list()方法取出对应的值,上列中的a也可以用list(a)取出对应的值,返回的就是一个列表

生成器,生成器本质是一个计算算法,可以用循环迭代来取出你想要的数据,而列表等于一个固定存在内存里的数,直接通过地址去取数据list[n],复杂度为O(1),生成器需要用用一个循环去取出你想要的数据,复杂度为O(n)

b = [x**2 for x in range(5)]
#这是一个列表生成式
c = (x**2 for x in range(5))
#这是一个列表生成器,同样可以用next()方法去一个个取数
print(next(c))
print(c.__next__())

把()变成[]就变成了列表表达式
把列表表达式的【】变成()就变成了生成器,创建一个列表时,列表容量是有限的,所以我们在循环使用的时候一遍循环
一边计算去生成,就叫生成器,generator。
生成器保留的是算法,每次调用的时候就去计算,如果没有更多元素,就报错,也是可迭代对象

把函数变成生成器的方法,即把return变成yield

def add_one(x):
    yield x+1

原文地址:https://www.cnblogs.com/yeyeyeyey/p/12098402.html

时间: 2024-10-12 22:04:19

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,

&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

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

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

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

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

python 装饰器、生成器、迭代器

装饰器 作用:为其他函数增加功能 装饰器必须要明白以下几点: 1.作用域 2.高阶函数 3.闭包 from functools import reduce import time def outside(func): def inside(*args): start = time.time() func(*args) end = time.time() result = end - start print(result) return inside @outside #同于 add = outs

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

闭包函数 闭包:定义在内网函数,包含对外部作用域而非全局作用域 范围:一个函数套用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

day-5 装饰器 迭代器 生成器

1.装饰器 1.1 带参数的装饰器 参数可以用来决定是否执行某个装饰器的某一部分 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函数之前要做的''') re = func(*args,**kwargs) if flag: print('''执行函数之后要做的''') return re return inner return timer @outer(False) def func

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.实现有参装