目录
一、函数的作用域
函数中变量的作用域:
全局变量 局部变量
函数内部可以使用全局变量,但是不能修改,如果一定要在函数内部修改全局变量,那么用global
二、函数的值传递、引用传递
函数的值传递、引用传递:
值传递:在传递参数的时候,仅仅是将自己的值拷贝了一份,传递给了函数的参数,变量不会改变
def test_01(x,y):
x += 10
y += 100
print(x)
print(y)
a=10
b=20
test_01(a,b)
print(a)
print(b)
引用传递:在传递参数时,传地址,函数形参获取的值也是同一块内存
三、匿名函数:
function(){}
在python中,将一个函数作为参数传到另一个函数中去
函数的参数数据类型:只要是一个对象就可以
函数本身就是一个对象
test_fuc(lambda a ,b:a+b)【:后面是return值】
lambda【arge1,arge2……】:代码块(函数体)
存在函数作为参数传递给函数,并且又不想让外界访问,而且参数函数足够简单,即可以定义为匿名函数【lambda表达式】
_ _name_ _,拿到函数的名字
四、函数嵌套:
1函数可以作为返回值返回
2函数可以作为参数进行传进
3函数名本质上是一个变量名,指向函数的内存地址
def fun1():
b=20
def fun2():#近似看为 fun2=def(){}
print(b)
return fun2()
a = fun1()
五、闭包
内层函数如果要改变外层局部变量的值,需要使用nonlocal关键字赋予权限
闭包可以让一个变量常驻在内存中
#可以避免全局变量被修改
def outer():
a=1
def inner():
#内层函数如果要改变外层局部变量的值,需要使用nonlocal关键字赋予权限
nonlocal a
a += 1
print(a)
return inner()
a= outer()
a()
a()
六装饰器
装饰器本质上是一个闭包,作用是不改变原有函数的前提下,为函数添加新的功能,但是源代码不变
用户登录
日志
表达式雏形:
def wrapper(目标函数)
def inner()
原函数可能有形参,所以用可变参数【*args】
def guanjia(fn):
def inner():
print("开挂")
fn()
print("关闭外挂")
return inner
@guanjia #哪里需要就哪里@ play_wz =guanjia(play_wz)
def play_wz():
print("来和妲己玩耍吧")
@guanjia
def play_dnf():
print("你好呀,我是赛利亚,今天又是美好的一天")
play_wz()
play_dnf ()
七偏函数
偏函数:
functool模块提供了很多方法,其中一个就是偏函数
import functools
int2 = functools.partial(int,base=2)#定义为2进制,别人改不了
print(int2("10010"))
八、高阶函数
高阶函数:
map():将来可以调用的额,可迭代数据
从可迭代对象中获取第一个元素,作为函数的参数,传入函数中,将函数执行后返回结果作为生成对象中的第一个元素
最终返回一个可迭代对象
a = map(lambda x:x*x,[1,2,3])
print(list(a))
for i in a:
print(i)
filter()过滤:过滤对指定的序列执行过滤 只要成立(为真:0为假,其余数字为真)
a = filter(lambda x: x % 2, [1, 2, 3, 4])
print(list(a))
reduce():用上一次计算的结果作为下一次传入的x值,如果上一次没有计算结果,则将可迭代数据的强两个元素分别作为x,y传入
如果有额外数据,会作为第一次传入的x值
from functools import reduce
a = reduce(lambda x, y: x+y, [1, 2, 3, 4])
print(a)