黑马程序员技术交流社区

标题: 函数之参数文档 [打印本页]

作者: 伊利亚    时间: 2019-10-28 13:27
标题: 函数之参数文档
本帖最后由 伊利亚 于 2019-10-29 23:54 编辑

形参顺
       位置参数,默认参数*args,**kwargs

位置参数:
       :放在所有参数之前       实参:放在所有参数之前
      
[Python] 纯文本查看 复制代码
def one(name,age,gender='男',*args,**kwargs):
        print(name,age,gender,args,kwargs)
    one('elijah',18)

    >>>: elijah 18 男 () {}
注意:实参,形参只需放在最前并按照顺序传递即可

默认参数
       (注意):放在位置参数之后,**kwargs之前
实参:根据形参的位置调整

       情况:(形参)在 位置参数之后,*args和**kwargs之前
实参传递方法之一:实参传递(建,情一可用)
[Python] 纯文本查看 复制代码
def two(name,age,gender='女',*args,**kwargs):
            print(name,age,gender,args,kwargs)
        two('elijah',18,'男')

        >>>:elijah 18 男 () {}

实参传递方法之二:关键传递(不建,而定,第二可用)
[Python] 纯文本查看 复制代码
def three(name,age,gender='女',*args,**kwargs):
            print(name,age,gender,args,kwargs)
        three('elijah',18,gender='男')

        >>>:elijah 18 男 () {}

       :(形)在 位置参数之后,**kwargs之前
实参传递方法:关键传递(必如此)
[Python] 纯文本查看 复制代码
def four(name,age,*args,gender='女',**kwargs):
            print(name,age,gender,args,kwargs)
        four('elijah',18,gender='男')

        >>>:elijah 18 男 () {}
注意:不可使用 一的方法一,那样会 *args 收集到
[Python] 纯文本查看 复制代码
def five(name,age,*args,gender='女',**kwargs):
            print(name,age,gender,args,kwargs)
        five('elijah',18,'男')

        >>>:elijah 18 女 ('男',) {}
解析
1. elijah 18 两个实参按照传递给 name,age,
2. ''这个实参传递时,遇到的形 *args ,这时 *args 收集,成元祖的第一元素
3. 这时 实参 经传递,形参还有一认参数 gender=''
       造成了正常传递的不正



关键字参数
错误
[Python] 纯文本查看 复制代码
def sex(name, age, gender='女', *args, **kwargs):
            print(name, age, gender, args, kwargs)
        sex('elijah', 18, gender='男',45,name1='test')
      
[Python] 纯文本查看 复制代码
def seven(name, age, gender='女'):
            print(name, age, gender)
        seven(age=18,gender= '男',name='elijah')
注意传递给 *args 实参位置之前不可使用关键参数
1.就相**kwargs不可放在*args之前
2.但是放在 *args之后,并且存在 **kwargs 时,就会被 **kwargs 收集;**kwargs不存在,就会报错
3.所以关键参数给位置参数或者默认参数传值是最好不要不定长传参相配合




不定长传参
位置:*args在前,**kwargs在后
它们分别接收多值并转换成元祖和字典,在这就不讲关于它们的操作,用元祖和字典的方法操作即可;在这只提及几个知识点。

知道*args**kwargs把收集的参数合成元祖和字典,知道了这个之后那,就可以直接不定长参数传递元祖和字典,就不需要收集合成的步了。

*args: 元祖传入
[Python] 纯文本查看 复制代码
card = ('handsome boy','brilliant')
    def eight(a,b):
        print(a,b)
    eight(*card)

    >>>:1 2
元祖传入时,如直接解包,形参需要和元祖的元素一一对应
*args: 多参数类型配合
[Python] 纯文本查看 复制代码
def eight(name, age, gender='女', *args, **kwargs):
        print(name, age, gender, args, kwargs)
    eight('elijah', 18, '男',*('handsome boy','brilliant'))

    >>>:elijah 18 男 ('brilliant', 'handsome boy') {}

注意:需要给传递的元祖前加 * ,不然传递的元祖,再次收集合成元祖的第一元素
list,set,tuple是可相互转换的,所以也可以 *args 参数传递

**kwargs: 字典传入

[Python] 纯文本查看 复制代码
dic = {'hobby1':'guitar','hobby2':'sketch'}
    def ten(hobby1,hobby2):
        print(hobby1,hobby2)
    ten(**dic)

    >>>:guitar sketch
字典传入的时,如直接解包,形参需要和字典的 key 相同

**kwargs: 多参数类型配合
[Python] 纯文本查看 复制代码
def nine(name, age, gender='女', *args, **kwargs):
        print(name, age, gender, args, kwargs)
    nine('elijah', 18, '男',*{'handsome boy','brilliant'},**{'hobby':['guitar','sketch']})
注意传递的字典需要加两个*


作者: 熊帮君    时间: 2019-10-28 16:35
很优秀,看不懂!字很多,就很棒~!
作者: 熊帮君    时间: 2019-11-1 17:22
签到,虽然听不懂




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2