参数
形参:定义函数,在括号内声明的变量名,用来接受外界传来的值
实参:调用函数,在括号内传入的实际的值,值可以为常亮,变量,表达式或者三者的结合
注:形参随着函数的调用才产生,随着函数调用结束而销毁
在函数定义()中出现的参数:形参
形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁
def fn(a, b, c): a,b,c必须要从外界获取值,采用意义 print(a) print(b) print(c) 外部提前产生了的变量,内部可以使用 print(x) print(y) print(z) x,y,z是实际存在的值 x = 10 y = 20 z = 30
在函数调用()中出现的参数(外界实际存在的值):实参
fn(10, 20, 30)
fn(x, y, z)
fn(x + 10, y * 2, z / 5)
调用函数是,实参可以由 常量、变量、表达式或三种的组合
在函数的外部不能直接使用函数的形参,原因:函数调用完毕后,形参被销毁了
实参的作用:为形参传递值
位置实参:按照位置顺序,从左到右为形参传递值
def fn(a,b,c): print(a,b,c) fn(10,20,30) fn(30, 20, 10)
关键字实参:可以不按顺序传递,形参安名字取值
def fn(a,b,c): print(a,b,c) fn(a=10,c=20,b=30) fn(c=30, b=20, a=10)
两者混用:关键字实参必须出现在位置实参之后
def fn(a, b, c, d, e, f): print(a, b, c, d, e, f) fn(10, 20, 30, e=100, f=500, d=200)
位置形参:可以由位置实参与关键字实参来传值
def fn(a,b,c): print(a,b,c) fn(10,20,c=30)
默认形参:具有默认值,用‘=’进制复制,可以由位置实参与关键字实参来传值,还可以不用传值(采用直身默认值)
def fn(a=10,b=20,c=30): print(a,b,c) fn(a=50,c=80)
常见:位置形参与默认形参同时存在,默认形参必须在后
def fn(a,b,c=40,d=80): print(a,b,c,d) fn(100,300,5000)
位置形参必须传值,默认形参分情况传值
可变长位置形参:*args 只能由位置实参来传值
def fn(a,b=80,*args): print(a,b,args) fn(1,90,123,2131,21412,)
可变长位置形象会以元组形成接受位置形参与默认形参未接受完的所有的传入的位置形参
小细节;可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,导致默认形参只能由位置实参来传值
可变长位置形参整体赋值
def fn(*args): print(args) fn(1,2,3,4,5) #(1,2,3,4,5) a=('abcde') def fn(*args): print(args) fn(1, 2, 3, 4, 5) # (1, 2, 3, 4, 5) a = 'ab' b = [1, 2] c = (1, 2) d = {1, 2} fn(a) # ('ab', ) fn(b) # ([1, 2], ) fn(c) # ((1, 2), ) fn(d) # ({1, 2}, ) 问 就拿a,b,c,d进行传值,如何得到 ''' ('a', 'b') (1, 2) ''' # *单列集合(保护字符串)将该变量进行 打散 传值 (本质传递的是地址) fn(*a) fn(*b) fn(*c) fn(*d) # 打散 def fn1(*args): print(args) ls = [1, 2, 3, 4, 5] fn1(ls) # (ls, ) fn1(*ls) # 将ls打散为1,2,3,4,5再进行传值=>(1,2,3,4,5)
关键字形参:必须由关键字实参来传值,出现在*后面的都是关键字形参,*为分割线,可以有变量名 *args, 也可以只用来做分隔
关键字形参必须由 关键字实参 来传值, 出现在*后的都是关键字形参
def tt(a, b=10, *, c, d=10, e): print(a, b, c, d, e) keyword-only arguments def fn(*, a, b=10, c): print(a, b, c) a:位置 b:默认 c,e:无值关键字形参 d:有值关键字形参 注: a和b有先后顺序 c,d, e无先后顺序 fn(10, 20, 30) fn(b=300, c=100, a=200)
可变长关键字形参:用来接收没有被关键字形参接收完的关键字形参,也只能由关键字实参来传值
用字典来存放数据 def fn(*, a, b=20, c, **kwargs): print(a, b) print(kwargs) fn(d=40, e=50, a=10, c=30) # 整体赋值 dic = {'name': 'Owen', 'age': 18} def fn1(**kwargs): print(kwargs) fn1(**dic) dd = { 'k1': [1, 2, 3, 4, 5], 'k2': {"name":"Bob"} } fn1(**dd) def fn2(*args): print(args) ll = [1, [1, 2], {"name":"Bob"}] fn2(*ll) # (1, [1, 2], {"name":"Bob"})
总结
def fn(a, b=10, *args, d, f=20, **kwargs):
print(a)
print(b)
print(args)
print(d)
print(f)
print(kwargs)
有位置实参传值: args和kwargs如果都能接收到值:
b必须传值且只能用位置实参传值,f可以不用传值
fn(1,2,3,4,d=5,g=6,k=7)
print()
全部用关键字实参传值
fn(x=100,y=200,d=300,b=400,a=500)
1.位置形参与默认形参: 能用 位置实参 关键字实参 传值
2.可变长位置形参:只能 位置实参 传值
3.所以关键字形参:只能 关键字实参 传值