python 疑点 参数类型和参数匹配模型

parameter是指函数定义中参数,而argument指的是函数调用时的实际参数。

def foo(a, b):  # <- a and b are "parameters" or "formal arguments"
    pass

foo(1, 2)  # <- 1 and 2 are arguments to foo, that match a and b

Python 参数类型和参数匹配模型
http://einverne.github.io/post/2015/08/python-argument-matching-model.html

方法可以使用带 * 或者 ** 的参数来收集任意长度的参数,定义方法时 def func(*name) 用来收集剩下的位置参数然后保存到 tuple 中,定义方法 def func(**name) 将收集所有的 keyword arguments 然后作为 dictionary

思考

方法定义和方法调用都要遵循一定的顺序:

方法调用者,参数列表需要按照如下顺序:positional arguments(value) -> keyword arguments(name=value) -> *sequence -> **dict
而方法定义时,参数定义需要按照: normal arguments(name), 跟着 default arguments(name=value), -> *name -> name or name=value keyword-only arguments -> **name
下面代码中a,b就是normal arguments(name),*args就是 *name ,value keyword-only arguments这里没有 , **kwargs就是 **name

def this_fun(a,b,*args,**kwargs):
    print a
    print b
    print args
    print kwargs


this_fun(0,1,2,3,index1=11,index2=22)
0
1
(2, 3)
{'index2': 22, 'index1': 11}

解答:因为 normal arguments是正常的位置参数(相当于一定有的),之后如果没有名称都变成 星号的加入到一个tuple中,最后才是keyword(因为防止调用时不给这个keyword所以要放到最后)也就是一定要给出名称=数值这种形式(例如a=3)

Python 3.0 总结了定义方法时参数列表的顺序,允许我们使用 keyword-only arguments —- 这类参数只能通过 keyword 传入,永远不会使用 positional argument 来填充。

句法上, keyword-only arguments 类似于 named arguments,但是出现在 *args 后面。所有这类 argument 都必须在调用时使用 keyword 形式传入。

>>> def kwonly(a, *b, c):   ###此时c为
        print(a, b, c)

>>> kwonly(1, 2, c=3)
1 (2,) 3

>>> kwonly(a=1, c=3)
1 () 3

>>> kwonly(1,2,3)
TypeError: kwonly() needs keyword-only argument c
>>> def kwonly(a, *, b, c):
        print(a, b, c)

>>> kwonly(1, c=3, b=2)
1 2 3
>>> kwonly(c=3, b=2, a=1)
1 2 3
>>> kwonly(1,2,3)
TypeError: kwonly() takes exactly 1 positional argument (3 given)
>>> kwonly(1)
TypeError: kwonly() needs keyword-only argument b

b,c 如果被使用到则必须使用 keyword,因为星号之后只能是keyword-only arguments

如果 keyword-only 参数没有默认值,则在调用时必须传入

为什么要有 keyword-only arguments ,简单的来说,就是想让方法支持任意的 positional arguments 并且让 configuration 选项作为 keyword 传入。
比如想要实现一个函数,处理传入的一组对象,并且有一个开关用来指定处理完成之后是否通知

process(X, Y, Z)
process(X, Y, notify=True)
def process(*args, notify=False): ... ###这里notify也就是keyword-only arguments 在*args与**kwargs之间

这里notify也就是keyword-only arguments 在*args与kwargs之间!!!!**也就是需要关键字指出的第一个,位置参数最后一个的下一个

如果没有 keyword-only arguments,我们可能需要同时使用 *args 和 **args 并且人工的从 keywords 中获取 notify 。使用 keyword-only 可以节省很多


进入python环境中:查看python版本

import sys
print(sys.version)
print(sys.version_info)

未进入prthon环境中:查看python版本

python --version

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值