一、不定长参数
在函数定义中,经常会碰到*args 和**kwargs作为参数。
事实上在函数中,*和**才是必要的,args和kwargs可以用其他名称代替
*args 是指不定数量的非键值对参数。
**kwargs是指不定数量的键值对参数。
*args 作为作为元组匹配没有指定参数名的参数。
而**kwargs作为字典,匹配指定了参数名的参数。
*args 必须位于**kwargs 之前。
1、可变参数、参数组,*args
# 1、不是必填参数;
# 2、不限制参数的个数:
# 3、传入多个参数的时候,他把参数放到一个元组里面
def send_report(*args): #可变参数、参数组 print('发邮件') print(args) # for a in args: # print(a) send_report()#不传 打印结果为发邮件 () send_report(1)#传一个 打印结果为 发邮件 (1,) send_report(1,2,3,4,5)#传多个 打印结果为 发邮件 (1,2,3,4,5)
2、关键字参数,**kwargs
# 1、不是必填参数;
# 2、不限制参数的个数:
# 3、传入多个参数的时候,他把参数放到一个字典里面
# 4、必须得使用关键字调用,k=v,k1=v1
def send_report2(**kwargs): #关键字参数 print('发邮件') print(kwargs) send_report2()#不传 打印结果为 发邮件 {} #send_report2(1)#会报错 send_report2(name='xiaohei',age=18)#字典 打印结果为 发邮件 {'name':'xiaohei','age':18}
3、调用函数的时候:
关键字参数后面不能再写位置参数了。
*args 调用不能传k=v格式的
**kwargs 调用必须写k=v格式的
def myfunc(name,addr,phone,qq,email): print(name,addr,phone,qq,email) myfunc(phone=110,addr='beijing',qq='5345355',email='134@163.com',name='xxx')#使用关键字调用 myfunc('hanmin',phone=110,addr='beijing',qq='5345355',email='134@163.com')#第一个用的位置参数,剩下的是关键字参数 #myfunc('哈哈哈',addr='beijing','qqq',email='134@163.com',name='xxx')#此种方法错误,关键字参数后面不能再用位置参数 def myfunc1(name,addr='beijing',*args): # print(name,addr,args) print('name:',name) print('addr:',addr) print('args:',args) myfunc1('xiaohei','xiaobai')#xiaobai给了addr args为() # myfunc1('xiaohei',addr='shanghai',args=(1,2,3))#错误,使用关键字调用,args无法传值 myfunc1('xiaohei','shanghai','hhh','bbb')#args:('hhh', 'bbb') def myfunc2(name,addr='beijing',**kwargs): print('name',name) print('addr',addr) print('kwargs',kwargs) myfunc2(name='xiaobai',addr='shanghai',age=18,sex='nv')#kwargs: {'age': 18, 'sex': 'nv'} def myfunc3(name,addr='beijing',*args,**kwargs): print('name:',name) print('addr:',addr) print('args:',args) print('kwargs:',kwargs) myfunc3(name='xiaohei',addr='shanghai',age=18,sex='nv')#k=v形式的会传给kwargs args: () kwargs: {'age': 18, 'sex': 'nv'} myfunc3('xiaohei','chengdu','chongqing',country='china')#chongqing传给args;country='china'传给kwargs args: ('chongqing',) kwargs: {'country': 'china'}
二、全局变量、局部变量
1、全局变量:
大家都可以用的变量就是全局变量
不可变的数据类型是全局变量的话,必须得加global:
int(整型) str(字符串) tuple(元组)
可变的数据类型是全局变量的话,不需要加global:
dict(字典) list(列表) set(集合)
全局变量一般定义在最上面,尽量少用全局变量,会占内存,不安全
2、局部变量: 函数里面定义的变量都是局部变量,出了函数后无法使用
language = 'Python'#全局变量 def hello(): language='Java'#局部变量,作用域在函数里面 print(language) hello() #结果取局部变量Java def xiaobai(): print(language) xiaobai() # 结果仍取全局变量Python def change(): global language #修改全局变量 language = 'C#' print(language) change() #结果取修改后的全局变量 C#
(1)参数传递一个正确的例子:
money=500 def test(consume): return money - consume def test1(money): return test(money) + money money = test1(money) print(money)#结果为500
(2)参数传递一个错误的例子:
def test(): global a a = 5 def test1(): c = a + 5 return c # 若想执行正确则在此处加test() res = test1() print(res)
函数需要先调用才能执行