day9_10

https://www.cnblogs.com/Eva-J/articles/7156261.html

https://www.cnblogs.com/Eva-J/articles/7125925.html

Day9

函数的返回值

无返回值

有返回值

返回多个或一个值。  return 1,2,3  一个元组。

 

函数的参数:形参和实参 

调用函数的时候:位置参数,关键字传参,

定义函数的时候:参数默认值,

动态参数:*args  位置参数,一个元组,  **kwargs  关键字参数,一个字典

调用的时候,将序列或字典的参数前加*,来调用。  list1[2,3,1,]  fun2(*list1)

args是一个元组,*args是一个散列,打散

kwargs **kwargs同理

 

顺序:位置参数,**args,默认参数,**kwargs(关键字参数)

 默认参数的陷阱问题:

# 如果默认参数的值是一个可变数据类型,
# 那么每一次调用函数的时候,
# 如果不传值就公用这个数据类型的资源

 

Day10

 

函数里可以查看全局变量,如果想要修改,则需要加global

# 对于不可变数据类型 在局部可是查看全局作用域中的变量
# 但是不能直接修改
# 如果想要修改,需要在程序的一开始添加global声明
# 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

ask=111
def fun2():
global ask
ask+=1
print(ask)

 

这两个函数,包含本作用域的变量名字。

#globals 永远打印全局的名字
#locals 输出什么 根据locals所在的位置

print(locals())
print(globals())  包含内置的名字


#一般这样来解决global的变量使用

# a = 1
# def func(a):
# a = 2
# return a
#
# a = func(a)
# print(a)



函数的调用嵌套

函数定义的嵌套
如果还是想对函数内的不可变的变量的值进行修改,那得用nonlocal进行声明,一层一层的找,直到找到,但不会去全局找。
nonlocal  声明上个作用的变量,跟global类似


函数名是第一类对象
函数名可以赋值,函数名就是变量名


闭包:嵌套函数,内部函数调用外部函数的变量
def outer():

dd="sjkd"
def inner():
print(dd)
print(inner.__closure__)
inner()
outer()


在外部调用内部函数。
一般是这样使用闭包,返回函数名,这样减少内存的开辟、销毁的消耗,因为我们之前想要使用inner,则必须先调用outer。
def outer():

dd="sjkd"
def inner():
print(dd)
print(inner.__closure__)
return inner
funiner=outer()
funiner()

inner.__closure__  返回的是cell类型,说明是个闭包


posted on 2022-05-09 11:22  castiel_lee  阅读(26)  评论(0)    收藏  举报

导航