您的位置:首页 > 编程语言 > Python开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: