动态传参,命名空间,函数嵌套
1. 函数的动态参数
1. *args 位置参数动态传参 #接受到的是元祖,把所有位置实参传入的都打包
def play(*sports):
print(sports)
play('足球','篮球','羽毛球')
2. **kwargs 关键字参数动态传参 #接受到的是字典,把所有关键字实参传的数据打包接收
def play(**sports):
print(sports)
play(football='足球',basketball='篮球',sleep='我好困啊')
顺序:位置参数, *args, 默认值, **kwargs
1.位置参数必须在*args前面
def func(*args,a):
print(args,a)
func(1,2,3,4) *args接受全部位置参数,那a就没有数据了,程序会报错
2.同理,默认值参数必须在**kwargs前面,否则,默认值参数永远都取不到值,都是用默认值,没法重新赋值
def func(*args, **kwargs): #什么都能参数都能接,万能
pass
形参的位置*,**: 聚合
实参的位置*,**: 打散
def diwuti(*args):
print(args) #结果为(1,2,3,4,5)
diwuti(*[1,2,3],*(22,33)) #实参前面加*或者**,打散元素.变为1,2,3,22,33
def qizhi(**kwargs):
print(kwargs)
qizhi(**{'a':'一'},**{'b':'二'},**{'c':'三'}) #{'a': '一', 'b': '二', 'c': '三'}
2. 命名空间
存放变量名字与值绑定关系的地方
1. 内置名称空间 python解释器先启动,首先加载的就是是内置名称空间 如input,print
2. 全局名称空间 除去函数外声明的变量名称空间
3. 局部名称空间 在执行文件的过程中如果调用函数,则临时产生局部名称空间
a = 10 # 全局名称空间中的内容
def fn(): # fn也在全局名称空间
b = 20 # 局部名称空间
print(a) #在全局无法查看局部的,在局部可以查看全局
fn()
作用域:作用范围
1. 全局作用域: 内置+全局 全局存活,全局有效
2. 局部作用域: 局部(函数被调用) 临时存活,局部存活
globals() 查看全局中的内容
locals() 查看当前作用域中的内容
a = 110 # 全局
def fn(): #函数名称变量也是全局
b = 20 # 局部
def gn(): # 局部
print(globals()) # 可以查看全局作用域中的内容
print(locals()) # 查看当前作用域中的内容
gn()
fn()
3. 函数嵌套
函数可以互相的嵌套
def outer():
print("哈哈")
def inner_1():
print("呵呵")
def inner_1_1():
print("嘻嘻")
inner_1_1()
print("吼吼")
def inner_2():
print("嘿嘿")
inner_2()
inner_1()
outer() #自己先试着写一下结果,再运行核对,注意执行顺序
注意:函数声明的时候没有任何操作,程序只是给函数名留了个变量位置. 只有调用函数的时候,才会拿着值去找函数并执行一系列操作.
4. global和nonlocal关键
global: 在局部访问全局中的内容
1,把全局变量引入函数内部,可以改变全局变量
2,没有这个全局变量会创建一个全局变量
a = 10
def func():
global a #调用全局变量
a += 10
print(a)
func()
nonlocal: 在局部寻找外层函数中离他最近的那个变量
除去全局变量外,查找不到该变量系统会报错
a = 1
def fun_1():
a = 2
def fun_2():
global a
a = 3
def fun_3():
a = 4
print(a)
print(a)
fun_3()
print(a)
print(a)
fun_2()
print(a)
print(a)
fun_1()
print(a) #同样自己先写下结果,在运行程序,对比结果
函数注释 在函数内部输入3对双引号,会自动加载下面的东西o(∩_∩)o
def func(a, b): """ 这个函数是用来计算a和b的和 :param a: 第一个数据 :param b: 第二个数据 :return: 返回的是两个数的和 """ return a + b print(func.__doc__) # document文档 查看函数注释,方便别人了解函数功能

浙公网安备 33010602011771号