python学习笔记12(装饰器、偏函数、变量作用域)
2019-01-03 11:32
741 查看
装饰器、偏函数、变量作用域
装饰器
定义: 是一个闭包,把一个函数当做参数,返回一个替代版的函数
本质: 就是一个返回函数的函数
示例:
#简单的装饰器 def func1(): #定义了一个函数 print("sunck is a good man") #希望在不改变上面函数的情况下,给函数添加别的功能 #定义一个简单的装饰器 def outer(func): #输入的是一个函数 def inner(): #在inner函数中给输入的函数添加功能 print("*******************") #要添加的功能 func() #输入的函数的功能 return inner #返回innner函数 #f是函数func1的加强版本 f = outer(func1) #f等于inner函数 f() #运行inner函数 # outer(func1)() #等价于上面的两个语句 # 输出: ******************* sunck is a good man
使用@符号将装饰器应用到函数
def outer(func): def inner(age): if age < 0: age = 0 func(age) return inner #say = outer(say) #@outer #相当于say = outer(say) @outer def say(age): print("sunck is %d years old" % (age)) say(-10) #输出: sunck is 0 years old
装饰器常用于对某些已有的函数进行修饰,使其满足特定的需求
通用装饰器:
def outer(func): def inner(*args, **kwargs): #使传入的参数符合所有类型 #添加修改的功能 print("&&&&&&&&&&&&&") func(*args, **kwargs) return inner @outer #say = outer(say) def say(name, age): #函数的参数力理论上是无限制的,但实际上最好不要超过6、7个 print("my name is %s, I am %d years old" % (name, age)) say("sunck", 18) #输出: &&&&&&&&&&&&& my name is sunck, I am 18 years old
偏函数: 对函数的默认值进行修改的函数、理论上不需要人为定义
示例:
#int默认是10进制,即base=10,把base改成2
print(int("1010")) #输出:1010 print(int("1010", base = 2)) #输出:10 #偏函数,该函数把int函数默认base改成2 def int2(str, base = 2): return int(str, base) print(int2("1011")) import functools #把一个参数固定住,形成一个新的函数 int3 = functools.partial(int, base = 2) #用functools模块生成偏函数 print(int3("111"))
变量作用域
作用域: 变量可以使用的范围。程序的变量并不是在所有位置都能使用的,访问的权限决定于变量的在哪里赋值的
作用域分类:
局部作用域
函数作用域(闭包以外的函数)
全局作用域:在定义到整片文档结束之间使用
内建作用域
示例:
num = 10 print(id(num)) #输出:1447652656 def func(): #声明num为全局变量,方便在函数中修改 global num # 修改num num = 20 print(id(num)) #输出:1447652976 #可以使用,但是无法直接修改 #num = 20#相当于在函数内部定义了一个num #可以直接使用外部全局变量的的值 print("num =", num) #输出:num = 20 func() print("外部打印num =", num) #输出:外部打印num = 20 print(id(num)) #输出:1447652976
局部-》函数-》全局-》内建
python中只有模块、函数、类才会引入新的的作用域去,其他的(if/if-elif-else/while/for)等不会引入新的作用域的
示例:
if 1: a = 10 print(a) #输出:10 #体现作用域 def func(): b = 20 print("b =", b) func() #print(b) #报错,因为b找不到 def outer(): num = 10 def inner(): nonlocal num #num为非局部变量 num = 20 def little(): nonlocal num num = 30 print("在little里打印Num =", num) little() print("在inner里打印num =", num) inner() print("在outer里打印num =", num) outer() #输出: 在little里打印Num = 30 在inner里打印num = 30 在outer里打印num = 30 def outer(): num = 10 def inner(): num = 20 def little(): nonlocal num num = 30 print("在little里打印Num =", num) little() print("在inner里打印num =", num) inner() print("在outer里打印num =", num) outer() #输出: 在little里打印Num = 30 在inner里打印num = 30 在outer里打印num = 10
相关文章推荐
- python学习笔记三:函数及变量作用域
- python学习笔记11(函数二): 参数的传递、变量的作用域
- python学习笔记6-函数变量
- python学习笔记之函数总结--高阶函数以及装饰器
- python 学习笔记-变量作用域
- python学习笔记,返回函数,匿名函数,装饰器
- python学习笔记12--函数
- python函数学习与变量作用域
- Python3学习笔记4-函数,全局变量&局部变量,内置函数
- python[变量作用域-函数-闭包-装饰器-生成器]
- (原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域
- (原创)c#学习笔记06--函数02--变量的作用域02--参数和返回值与全局数据
- python学习笔记12(函数三): 参数类型、递归、lambda函数
- 【学习笔记六】 - js中 创建对象的模式与继承 及 js中实现块级作用域和函数私有变量 《js高程》6-7笔记
- 装饰器学习笔记1:函数的作用域
- Python3 学习笔记12_函数_20180302
- Python3学习笔记4-函数,全局变量&局部变量,内置函数
- Python 学习笔记(一)语句,变量,函数
- iOS开发学习笔记 2-6 C语言部分 函数及变量的作用域
- Python学习(21):Python函数(5):变量作用域与闭包