Discuss / Python / 命名关键字参数的一个问题

命名关键字参数的一个问题

Topic source

nishno_s45

#1 Created at ... [Delete] [Delete and Lock User]

廖老师,问一下有没有这样的写法

def f3(a,*,*q):
    print(a,q)

为什么结果是invalid syntax

轩序待翃

#2 Created at ... [Delete] [Delete and Lock User]

依老师所说,*代表后面是命名关键字参数,而*q是位置型可变参数,传入的是tuple,是有序的,而关键字参数需要dict(键:值)是无序的,一定要把有序的位置参数放*前面

def f3(a,*q,*,b,**w)

此处a,*q都是位置参数 此处b,**w都是关键字参数 传参时:

f3( 1 , *[2,3] , b=1, **{ 'w1':2 , 'w2':3 } )

f3( *[1,2,3] , **{ 'b':1, 'w1':2 , 'w2':3 } )

以上等价于f3(*q,**w)(可看成a是*q的第一个参数)

即老师所说 : 对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

土城剑客

#3 Created at ... [Delete] [Delete and Lock User]

你这种定义方式编译会报错, def f3(a,*q,*,b,**w)

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用,除了 【可变参数无法和命名关键字参数混合】。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数

即有*,就不能再出现*q

那究竟是为什么"【可变参数无法和命名关键字参数混合】"啊?

樓蘭-後主

#6 Created at ... [Delete] [Delete and Lock User]

可变参数无法和命名关键字参数混合

imustdoit

#7 Created at ... [Delete] [Delete and Lock User]

这段讨论非常好,学东西真的要有讨论才会更明白

参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数。

那究竟是为什么"【可变参数无法和命名关键字参数混合】"啊? 我觉得应该是这个样的: 命名关键字参数后面必须传的是键值对,而可变参数无法是一个tuple 当命名关键字参数后面发现是一个可变参数(tuple)时解析器就无法解析所以不能跟,有因为关键字参数本身也是一个dict,也是键值对所以命名关键字参数和关键字参数就可以组合.其实就是和 轩序待翃 解析的理由一样

那究竟是为什么"【可变参数无法和命名关键字参数混合】"啊? 我觉得应该是这个样的: 命名关键字参数后面必须传的是键值对,而可变参数是一个tuple 当命名关键字参数后面发现是一个可变参数(tuple)时解析器就无法解析所以不能组合,又因为关键字参数本身也是键值对(dict)所以命名关键字参数和关键字参数就可以组合.其实就是和 轩序待翃 解析的理由一样

因为第一次发讨论的时候错别字太多了 重新发一次 哈哈


  • 1
  • 2

Reply