day7笔记
全局变量
- 在python中,函数可以使用全局变量,但是不可以修改全局变量
- 若要修改,使用
global
关键字。
- 若要修改,使用
global a
a = 3
def fun():
global a
a = 4
print(a)
值传递和引用传递
- 值传递:传递参数时仅仅是传值(拷贝)
如果要改变传递的实参,则使用引用传递。
def fun(li):
li.append(10)
li.append(100)
print(li)
li1 = [1,2,3]
fun(li1)
print(li1)
函数作为参数
-
python中,可以将函数作为参数传到另一个函数中,因为函数本身就是一个对象。
-
python中,存在函数作为参数传递给函数,并且不想被外界访问,则可以定义为匿名函数:
lambda a,b: 代码块
偏函数
print(int('a', base=16))
int()
可以接受两个参数,第一个参数是一个字符串,第二个参数是指定将第一个参数视为几进制,返回一个十进制数。
如果想要只传入一个参数,则可以使用偏函数。
import functools
int2 = functools.partial(int, base=2)
print(int2('1000'))
python3.8新特性
声明函数参数类型
def add(x:int, y:float) -> float:
print(x + y)
函数的嵌套
- 所谓函数的嵌套,即在一个函数中包含了另一个函数的定义。
def fun1():
b = 20
def fun2():
print(b)
print('222')
return fun2
a = fun1() #返回一个函数并赋给a
a() #调用该函数
改变外部函数的值
def outer():
a = 10
def inner():
nonlocal a
a = 20
print(a)
return inner
a = outer()
a()
闭包
-
一个函数嵌套另一个函数,内层函数用到外层函数的局部变量。
-
如果内层函数要更改外层函数的变量,则使用
nonlocal
关键字
def outer():
a = 10
def inner():
nonlocal a
a += 100
print(a)
return inner
a = outer()
a()
- 闭包的使用可以让一个变量常驻在内存空间中。
- 可以避免全局变量被随意修改。
另一个例子
def fun1(x):
def fun2(y):
return x + y
return fun2
print(fun1(1)(2))
- 对于该例中的函数调用,首先调用
fun1(1)
并传递一个参数,返回fun2
,然后再传入一个参数为2。
装饰器
所谓装饰器,即在不改变原有函数的基础上添加功能。
def fun(fn):
def fun_r():
print("open")
fn()
print("close")
return fun_r
def fun2():
print("begin to play with A")
def fun3():
print("begin to play with B")
fun2 = fun(fun2)
fun3 = fun(fun3)
fun2()
fun3()
为了简化上述代码,python定义了@
符号:
@fun
def fun2():
print("begin to play with A")
@fun
def fun3():
print("begin to play with B")
fun2()
fun3()
- 只需要在函数定义之前添加
@fun
就可以代替以下的代码:
fun2 = fun(fun2) #等价于@fun