传参,命名空间,作用域
传参(动态传参,关键字传参,无敌传参,以及传参的顺序) , 命名空间 , 作用域的问题 , 函数的嵌套 , 关键字global和nonlocal
动态传参, 可以接收任意的参数
顺序: 位置参数 *args 默认值参数 **kwargs
位置参数的动态传参 写法: *参数名 例如: *args
接收的参数是tuple类型
def eat(*food): print(food) eat("盖浇饭", "麻辣烫", "冰封") #结果:('盖浇饭', '麻辣烫', '冰封')
位置参数要放在前面,默认值参数要放在动态参数后面
def func(a, b, c, *args, d=110): print(a, b, c,args,d) func(1, 4, 7, 3, 6, 9,12,3,3) #结果:1 4 7 (3, 6, 9, 12, 3, 3) 110
关键字参数
# 关键字参数 接出来是字典 def eat(**kwargs): print (kwargs) eat(a="大树林",b="小树林",c="小路") #结果:{'a': '大树林', 'b': '小树林', 'c': '小路'}
无敌传参,什么都能接
def yu(*args,**kwargs): print (args,kwargs) yu(1,2,3,4,a="we",b="bn")
*打散
def eat(*fruit): # 聚合成元组 print(fruit) lst = ["香蕉", "茄子", "黄瓜", "辣椒", "大白梨"] eat(*lst) # 这里的*表示的是把lst打散 #结果:('香蕉', '茄子', '黄瓜', '辣椒', '大白梨') # 打散后形成元组
**打散
def eat(**kwargs): # 把所有的关键字参数聚合成字典 print(kwargs) dic = {"a":1, "b":2, "c":3} eat(**dic) # 打散字典,依次传参 # 结果:{'a': 1, 'b': 2, 'c': 3}
命名空间
我们给存放名字和值的关系的空间起⼀一个名字叫: 命名空间. 我们的变量量在存储的时候就
是存储在这片空间中的.
加载顺序:
1. 内置命名空间
2. 全局命名空间
3. 局部命名空间(函数被执⾏行行的时候)
取值顺序:
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间
#例 a = 10 def func(): a = 20 print(a) func() #结果:20
作用域的问题
1. globals() 获取全局作用域中的内容
2. locals() 获取局部作用域中的内容
global: 寻找全局作用域中的内容
nonlocal: 寻找上一级作用域中的内容, 但不能是全局的
a = 10 # 全局 def func(): # 全局 a = 40 # 局部 b = 20 # 局部 def abc(): # 局部 d = 30 # 是局部 print("哈哈") print(a, b) # 这⾥使⽤的是局部作⽤域 print(locals()) abc() # print(globals()) # 打印全局作用域中的内容 # print(locals()) # 打印局部作用域中的内容,locals()打印当前这个函数局部作用与中的内容 func() print(globals()) # print(globals()) # 打印全局作用域中的内容
函数的嵌套
只要遇见了()就是函数的调用. 如果没有()就不是函数的调用
def fun2(): print(222) def fun3(): print(666) print(444) fun3() print(888) print(33) fun2() print(555) #结果: # 33 # 222 # 444 # 666 # 888 # 555
关键字global和nonlocal
首先我们写这样一个代码, 首先在全局声明一个变量, 然后再局部调用这个变量, 并改变这
个变量的值
global
a=10 def func(): global a # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a func() print (a)
nonlocal调用上一级,且不能是全局
a = 10 def func1(): a = 20 def func2(): nonlocal a #nonlocal调用上一级,且不能是全局 a = 30 print(a) func2() print(a) func1() #结果:30 #30
#求最大值和最小值的其中一种写法
# 求最大值和最小值的另一种写法 def func(*args): m=args[0] #假设args里面第0项就是最大值 mi=args[0] #假设args里面第0项就是最小值 for i in args: if i > m: m = i #循环出来当前的元素比假设的元素大,就记录当前这个元素,以此类推,最后得到的是最大的值 if i < mi: mi = i #循环出来当前的元素比假设的元素小,就记录当前这个元素,以此类推,最后得到的是最小的值 return m,mi print(func(1,2,3,4,5,45,6,7,78))
知识点补充
def extendList(val, list=[]): #这里的定义的一个空列表其实是一个指向,指向内存中的这个列表,而不是每次添加都创建一个新列表 list.append(val) return list list1 = extendList(10) #第一次传进去val等于10,然后append添加到列表中,列表里面装的就是10 print('list1=%s' % list1) # list = [10] list2 = extendList(123, []) #第二次传进去123,[],传进去的有一个空列表123就被添加到自己这个空列表中了 print('list2=%s' % list2) # list3 = extendList('a') # list = [10, 'a'] #最后传入一个a,因为列表中已经有一个10 了 ,所以a就被追加到10后面了 print('list3=%s' % list3)