欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python—day10 函数的参数分类

程序员文章站 2022-05-14 08:58:18
一、实参与形参 1、形参:定义函数,在括号内声明的变量名,用来接受外界传来的值 def fn(形参们): pass 2、实参:调用函数,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合 注:形参随着函数的调用而产生,随着调用结束而销毁(有特例) 混用 位置形参与默认形参同时存在,默认形参 ......

一、实参与形参

1、形参:定义函数,在括号内声明的变量名,用来接受外界传来的值

      def fn(形参们):
                pass

 

def fn(a,b,c):#   形参就是考虑实参的值,随着函数的调用才会产生,并随着函数调用结束而销毁
    # a,b c必须从外界获取值,才有意义
    print(a)
    print(b)
    print(c)
    # 外部提前产生了变量,内部可以使用(x,y,z)
    print(x)
    print(y)
    print(z)
# x,y,z 是实际存在的值
x=10
y=20
z=30 

2、实参:调用函数,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合

 

fn(x,y,z)
fn(10,20,30)
fn(x+10,y*2,z/5)

  

 

注:形参随着函数的调用而产生,随着调用结束而销毁(有特例)

 
混用
位置形参与默认形参同时存在,默认形参必须在后
def fn1(a,b,c=10,d=20):
    print(a, b, c, d)
位置形参必须传值,默认形参分情况传值
fn1(100, 200, d=1000)

 

 在函数的外部不能直接使用函数的形参,原因:函数调用完毕后,形参被销毁了
print(a)
print(b)
print(c)

  

二、实参与形参的分类

 

注:各种形参出现的先后
位置形参 - 默认形参 - 可变长位置形参 - 无|有初值关键字形参 - 可变长关键字参数

 

def fn(a, b, c=10, *args, d, e=20, f, **kwargs):
    pass
# 位置形参:a、b
# 默认形参:c
# 可变长位置形参:args
# 无初值关键字形参:d、f
# 有初值关键字形参:e
# 可变长关键字参数:kwargs

  

1、实参分类:

位置实参:必须按照顺序给形参传值
 
def fn (a,b,c):
    print(a,b,c)

位置形参可以由位置实参与关键字实参来传值
fn(10,20,30)
fn(a=10,b=20,c=30)

  

关键字实参:按照关键字给形参传值,所以顺序可以颠倒

 


fn1(a=10,b=20,c=30)
fn1(c=30,b=20,a=10)

  

注:混用
1.关键字实参必须出现在位置实参后
2.多个位置实参还是按照位置传参
3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序

def fn2(a, b, c, d, e, f):
    print(a, b, c, d, e, f)
fn2(10, 20, 30, e=100, f=500, d=200)

  

注:位置实参、关键字实参共存是,关键字实参必须出现在所有位置实参之后

 

 2、形参分类:

2-1、位置形参:位置实参与关键字实参都可以对其传参
#  positional argument
def fn(a, b, c):
    print(a, b, c)

   

 
 2-1、位置形参可以由 位置实参 与 关键字实参 来传值
fn(10, 20, 30)
fn(a=10, b=20, c=30)

 

  

 


2-3、默认形参:位置实参关键字实参都可以对其传参,也可以不被传参(采用自身默认值)

fn()
fn(20, 30)
fn(a=200, b=300)
fn(100)  # 就给a传
fn(b=100)  # 就给b传

    

 


2-4、可变长位置形参:可变长形参会以 元组 形式接受 位置形参默认形参未接受完的 所有传入的位置实参,用索引来取第几个
可变长形参只能由 位置实参传值  *****

def fn(a, b=10, *args):
    print(a, b)
    print(args)    

   
小细节:可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,
导致默认形参只能由位置实参来传值

fn(1, 20, 100, 200) # 1给a  20给b,不能用b=20传  100,200给args
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},)

*单列集合(保护字符串)将该变量进行  打散 传值(本质传递的是地址)
fn(*a)
fn(*b)
fn(*c)
fn(*d)

打散
def fn1(*args):
    print(args)
ls=[1,2,3,4,5]
fn1(ls)#  输出的结果是([1,2,3,4,5],)


fn1(*ls)
将ls打散为1,2,3,4,5再进行传值=》》(1,2,3,4,5)

 

 


2-5、无初值关键字形参:只能由关键字实参传值

前提:出现在 * 之后的形参
def fn(a, b=10, *, c, d=20, e):
 pass
# c,d,e都是出现在*之后,都是关键字形参,由于必须由 关键字实参 来传值,没有顺序的强行要求

 


2-6、有初值关键字形参:只能由关键字实参传值,也可以不被传值

 

* 为分割线,可以有变量名如*args,也可以只用做分隔
a:位置
b:默认
c,e:无值关键字形参
d:有值关键字形参

注
a和b有先后顺序
c,d,e无先后顺序

 


2-7、可变长关键字形参:用来接收没有被关键字形参接收完的关键字形参,也只能由关键字实参来传值

用字典来存放数据

例题一
def fn(**kwargs):
    print(kwargs)
fn(a=10,b=20)  # {'a': 10, 'b': 20}
dic = {'x': 100, 'y': 200}
fn(**dic)  # {'x': 100, 'y': 200}

  

例题二

 

def fn(*,a,b=20,c,**kwargs):
    print(a,b)
    print(kwargs)
fn(d=40,e=50,a=10,c=30) # 随便定义一些值,输出a,b的值




整体赋值
dic={'name':'owen','age':18}
def fn1(**kwargs):
    print(kwargs)

fn1(**dic)  #输出结果{'name':'owen','age':18}


def fn1(**dic):
    print(**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'})

 

 

三、可变参数的整体使用

 

1、可变位置形参以元组方式接收值
如:接收10,20,30三个数
def fn1(*args):
    print(args)  # (10, 20, 30)
    
第一种传参
fn1(10, 20, 30)
第二种传参
t = (10, 20, 30)  # 单列集合及字符串类型都可以
fn1(*t)

  

2、可变位置实参以字典方式接收值
def fn2(**kwargs):
    print(kwargs)  # {'name': 'owen', 'age': 18}

 

第一种传参
fn2(name='owen', age=18)
第二种传参
d = {'name': 'owen', 'age': 18}  # 单列集合及字符串类型都可以
fn2(**d)