动态参数: 用户传入到函数的实参数量不定时,或者是为了以后拓展,此时要用到动态参数*args,**kwargs(万能参数) *args 接收的是所有的位置参数(接收的是元组类型) **kwargs接收的是所有的关键字参数。(接收的是字典类型)
def func1(a,b,c): pass func1(1,2,3) func1(1,2,3,4,5,6) print() def func1(*args, **kwargs): print(args) print(kwaigs) func1(1,2,3,4) fnc1(x=4, y=5, z=6) #func1(1,2,3, x=4, y=5, z=6)
他们的顺序:
位置参数,*arge,默认参数,**kwargs
1, def func2(a, b,*args,sex='男'): print(a) print(b) print(args) print(sex) func2(1,2,5,6,7,8,9,sex='女')
2, def func2(a, b,*args,sex='男',**kwargs): print(a) print(b) print(args) print(sex) print(kwargs) func2(1,2,5,6,7,8,9,sex='女',x=6, y=5, name='alex') ###### 1 2 (5, 6, 7, 8, 9) *args 元组的形式 女 {'x': 6, 'y': 5, 'name': 'alex'} **kwargs 字典的形式
3, def func2(a,b,sex='男'): print(a) #1 print(b) # 2 print(sex) #女 func2(1,2,'女')
4, def func2(a,b,sex='男',*args): print(a) #1 print(b) #2 print(args) #(55,66) print(sex) #44 func2(1, 2, 44, 55, 66)
简单的加法计算:
def sum1(*args): ret = 0 for i in args: ret += i return ret print(sum1(1,2,3))
def func3(*args,**kwargs): 函数的定义,* 用意是聚合 print(args) #(1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(l1,l2) #[1,2,3],]11,21,32]
def func3(*args,**kwargs): 函数的定义,* 用意是聚合 print(args) #(1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(l1,l2) #[1,2,3],]11,21,32]
把上面的结果变成没有列表形式
def func3(*args,**kwargs): 函数的定义,* 用意是聚合 l = [] for i in args: #([1,2,3],[11,21,32]) l.extend(i) args = tuple(l) print(args) #(1,2,3,11,21,32) print(kwargs) #{} l1 = [1,2,3] l1 = [1,2,3] l2 = [11,21,32] func3(l1,l2)
*args,**kwargs:函数的定义,* 用意是聚合。
在函数的执行时,*的用意是打散。
*的魔性用法:
def func3(*args,**kwargs): print(args) # (1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(*l1,*l2)###(1, 2, 3, 11, 21, 32) s1 = 'bfhfbdb' s2 = 'jdfjdgsgg' func3(*s1,*s2) #tu1 = (1,2,3) #tu2 = (11,22,33) #func3(*tu1,*tu2) #(1, 2, 3, 11, 22, 33)
def func3(*args,**kwargs): print(args) # (1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(*l1,*l2)###(1, 2, 3, 11, 21, 32) s1 = 'bfhfbdb' s2 = 'jdfjdgsgg' func3(*s1,*s2) #tu1 = (1,2,3) #tu2 = (11,22,33) #func3(*tu1,*tu2) #(1, 2, 3, 11, 22, 33)
def func3(*args,**kwargs): print(args) # (1,2,3,11,21,32) print(**kwargs) l1 = [1,2,3] l2 = [11,21,32] func3(*l1,*l2)###(1, 2, 3, 11, 21, 32)
s1 = 'bfhfbdb' s2 = 'jdfjdgsgg' func3(*s1,*s2) #tu1 = (1,2,3) #tu2 = (11,22,33) #func3(*tu1,*tu2) #(1, 2, 3, 11, 22, 33)
当程序运行时,代码从上至下一次读取,遇到变量与值,
他会在内存中开辟一个空间,存放变量与值的内存地址的对应关系。
这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。
当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体莫不关心。
当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个
临时开辟的空间中,随着函数的结束,临时的空间关闭,这样的空间叫做临时名称空间。
name = 'alex' age = 1000 def func1(): a = 2 b = 3 func1()
内置名称空间:
len() print() input() list
名称空间: 内置名称空间 全局名称空间 局部名称空间 加载顺序:内置名称空间----> 全局名称空间(程序运行时)------>局部名称空间(函数执行时) 执行顺序:当代码执行时,从上至下一次执行。 作用域: 全局作用域:内置名称空间 全局名称空间 局部作用域:局部名称空间 取值顺序(单项):局部名称空间(函数执行时)--->全部名称空间---->内置名称空间
加载顺序:
name = 'alex' def func1(): a = 3 func1()
取值顺序:
1, name = '老男孩' def func1(): name = 'alex' print(name) func1()
name = '老男孩' def func1(): print(name) func1()
sum = 666 name = '老男孩' def func1(): #sum = 555 print(sum) func1()
L local (本地)
E eclose (关闭)
G global (全局变量)
B Built-in (内置)
sum = 666 # global def func1(): #sum = 555 #eclose def inner(): # sum = 111 # local print(sum) inner() func1()
练习题;
1, print(111) def func1(): name = 'alex' print(name) def inner(): a = 2 print(a) inner() print(333) func1() print(444) #111 333 alex 2 444
print(111) def func1(): name = 'alex' print(name) def inner(): a = 2 print(a) print(444) inner() print(555) func1() # 111 alex 444 2 555
def func1(): a = 666 print(666)
def func2(): name = 'taibai' print(name) func1()
print(333) func2() print(555) #333 taibai 666 555 global
global: def func1(): name = 'alex' print(name) print(name) 会报错
1, def func1(): name = 'alex' print(name) return name ret = func1() print(ret) 2, def func1(): global name name = 'alex' func1() print(name) # alex 3, name = '老男孩' def func1(): global name name = 'alex' func1() print(name) # alex
global: 在全局名称空间里得到局部名称空间的变量 1,return 2,global 1),在局部作用域中声明一个全局变量。 2),在局部作用域中,更改一个全局变量。 (改变全局变量,遇到global,global下面变量的值将覆盖全局变量的值) 补充: 对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global
函数中如果使用global + 变量 必须是第一次使用这个变量。
flag = True def func1(): if flag: print(333) global flag flag = False func1()
作用域的问题:
1,globals()获取全局作用域中的内容
2,locals() 获取局部作用域中的内容
locals():函数会以字典的类型返回当前位置的全部局部变量。
globals():函数以字典的类型返回全部全局变量。
def extendList(val,list=[]): list.append(val) print(locals()) #{'list': [1],'val':1] return list ret = extendList(1) print(globals()) #'ret':[1]
nonlocal:(改变全局会报错) 1,不能改变一个全局变量。 2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变革进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。 (nonlocal不能改变全局变量,如果改变父级(它的上一级),那么以下执行的都是改变的值,与父级的值没有关系。)
global和nonlocal global:寻找全局作用域中的内容 nonlocal:寻找上一级作用域中的内容,但不能是全局的 a = 10 #全局 def func(): #全局 a = 40 #局部 b = 20 #局部 def abc(): #局部 d = 30 #局部 print('哈哈') print(a,b) #这使得是局部作用域 # print(locals()) #打印全局作用域中的内容 func() # print(globals()) #打印全局作用域中的内容 a = 10 def func(): global a #全局 a = 20 print(a) func() print(a) #20 a=10 def func1(): a = 20 #30 print(a) #20 def func2(): nonlocal a a = 30 print(a) #30 func2() print(a) #30 func1() print(a) #20 30 30 10
name = '老男孩' # def func1(): nonlocal name print(name) func1() # 改变全局报错
练习:
def add_b(): b = 42 def do_global(): b = 10 print(b) def dd_nonlocal(): nonlocal b b = b + 20 print(b) dd_nonlocal() print(b) do_global() print(b) add_b()
def func1(): name = 'alex' print(name) # 1,alex def inner(): nonlocal name name ='老男孩' print(name) #2,老男孩 inner() print(name) # 3, 老男孩 func1()
def func1(*args,**kwargs): print(**kwargs) func1(*[1,2,3],**{'name':'alex'}) #
View Code
2、写函数,接收n个数字,求这些参数数字的和。(动态传参)
def sum1(*args): ret = 0 for i in args: ret += i return ret print(sum1(1,2,3))
3、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
a=10 b=20 def test5(a,b): print(a,b) c = test5(b,a) print(c) a = 10 , b = 20 , c = None
4、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
a=10
a=10 b=20 def test5(a,b): a=3 b=5 print(a,b) c = test5(b,a) print(c) a = 3, b = 5, c = None
相关面试题
1,有函数定义如下: 2、Error、24、8、10、Error def calc(a,b,c,d=1,e=2): return (a+b)*(c-d)+e 请分别写出下列标号代码的输出结果,如果出错请写出Error。 print(calc(1,2,3,4,5))__2___ #print(calc(1,2))_Error___print(calc(e=4,c=5,a=2,b=3))_24_ print(calc(1,2,3))___8_ print(calc(1,2,3,e=4))_10__print(calc(1,2,3,d=5,4))_Error___ 2,下面代码打印的结果分别是__#[10,'a']_______,_#[123]_______,__# [10,'a']______. def extendList(val,list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print('list1=%s'%list1) #[10,'a'] print('list2=%s'%list2) #[123] print('list3=%s'%list3) # [10,'a']