python参数类型_Python 参数类型和参数匹配模型

Python 方法的参数种类有很多,而不是通常语言定义的那样, Python 方法的传参能力要比想象的强大很多。很多初学者可能对一些库中带 * 带 ** 的参数类型非常奇怪,但是其实这些语法正是保证 Python 方法传参强大的重要因素。

First Thing

首先要声明 argument 和 parameter 的区别,很多时候这两个单词被直接翻译为参数更导致了很多人无法区分,argument 是调用方发起的称呼,parameter 是定义方法时使用

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

参数类型

在讨论参数类型之前,先来看一个例子

def bar(a, # <- this parameter is a normal python parameter

b=1, # <- this is a parameter with a default value

*, # <- all parameters after this are keyword only

c=2, # <- keyword only argument with default value

d): # <- keyword only argument without default value

pass

这是一个典型的方法定义,其中包括了一些类型,但是还不全面。

Python 的参数类型:

Positionals: matched from left to right 很多教程都叫做:位置参数

顾名思义,就是从左往右匹配,比如 def foo(a, b): pass 传参的时候就必须 foo(1,'a') 按照位置传

Keywords: matched by argument name

也就是传参时需要指定关键词 (name=value) 这样的形式传,比如定义 def func(name=value):pass 然后调用 func(name=value)

Defaults: specify values for arguments that aren’t passed

可以给某些参数默认值,如果不传这些参数则使用默认值,这些可选参数传值时也需要 name=value

Varargs collecting: collect arbitrarily many positional or keyword arguments

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

Varargs unpacking: pass arbitrarily many positional or keyword arguments

调用者可以使用 * 方式来 unpack 参数集合,比如 func(*sequence) 调用者将 sequence 的所有对象一个个按照顺序传入(作为单独的 positional arguments), func(**dict) 调用者将 dict 中的所有 key/value 以单独的关键词参数传入 (keyword arguments)

Keyword-only arguments: arguments that must be passed by name

In Python 3.0 以后引入,可以指定必须 name=value 传递

总而言之,上面定义的参数类型模型,让 Python 能够决定方法需要传递多少参数,通常情况下位置参数调用者必须显示指定,而如果定义了默认参数调用者往往可以省去,而如果定义了 * 参数,则表示调用者可以传任意数量的参数。

顺序

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

方法调用者,参数列表需要按照如下顺序: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

在定义和调用时, **arg 如果定义都必须在最后出现,如果不按照顺序使用,会给出语法错误。 Python 内部按照下面的步骤来匹配参数列表:

先按照 positional arguments 来赋值,对于任何 positional arguments:

尝试将 argument 绑定到第一个没有填充的 parameter slot,如果 slot 不是 vararg slot,标记 slot 为 filled 。

如果下一个 unfilled slot 是一个 vararg slot,并且没有 name 那么报错

否则(下一个 unfilled slot 是一个 vararg slot),所有剩下的 non-keyword arguments 都传给 vararg slot。

再按照 keyword arguments 来赋值任何匹配的参数

如果 parameters 中存在 name 和 keyword 匹配的参数,在将 argument value 赋值给 parameter slot. 如果 parameter slot 已经 filled,报错

否则,如果有 keyword dictionary argument, argument 就添加到存在的 dictionary,如果已经存在同名 key,则报错

否则,如果没有 keyword dictionary, 并且没有匹配的 named parameters , 报错

将剩余没有 keyword 的参数赋值给 *name 元组

将剩余的 keyword 参数赋值给 **name 字典

最后将默认值赋值给没有传入的参数

如果 vararg slot 还没有填充,将空的 tuple 赋值给他

对于剩下的空的 slot,如果有默认值则填充,如果没有默认值,则报错

在这些之后,Python 会检查每个参数都已经有且仅有一个值,如果不是将抛出错误。一旦匹配完成,Python 就将传入的对象赋值给参数名。

在这些都理清楚之后 Python 3.0 还有一个 keyword-only arguments 似乎还要费些笔墨。

Python 3.0 Keyword-Only Arguments

Python 3.0 总结了定义方法时参数列表的顺序,允许我们使用 keyword-only arguments —- 这类参数只能通过 keyword 传入,永远不会使用 positional argument 来填充。当我们既想要方法处理任意数量的 arguments 并且也可选的接受一些 configuration 选项时。

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

>>> def kwonly(a, *b, 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

这里 *b 如果不需要任意长度可以简写为 *

>>> 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

>>> def kwonly(a, *, b='spam', c='ham'):

...

print(a, b, c)

...

>>> kwonly(1)

1 spam ham

>>> kwonly(1, c=3)

1 spam 3

>>> kwonly(a=1)

1 spam ham

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

1 2 3

>>> kwonly(1, 2)

TypeError: kwonly() takes exactly 1 positional argument (2 given)

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

在调用时,keyword-only 被传入时,必须要在 **args 之前

>>> def f(a, *b, c=6, **d): print(a, b, c, d)

>>> f(1, *(2, 3), **dict(x=4, y=5))

1 (2, 3) 6 {'y': 5, 'x': 4}

>>> f(1, *(2, 3), **dict(x=4, y=5), c=7)

SyntaxError: invalid syntax

>>> f(1, *(2, 3), c=7, **dict(x=4, y=5))

1 (2, 3) 7 {'y': 5, 'x': 4}

>>> f(1, c=7, *(2, 3), **dict(x=4, y=5))

1 (2, 3) 7 {'y': 5, 'x': 4}

>>> f(1, *(2, 3), **dict(x=4, y=5, c=7))

1 (2, 3) 7 {'y': 5, 'x': 4}

为什么要有 keyword-only arguments ,简单的来说,就是想让方法支持任意的 positional arguments 并且让 configuration 选项作为 keyword 传入。

比如想要实现一个函数,处理传入的一组对象,并且有一个开关用来指定处理完成之后是否通知

process(X, Y, Z)

process(X, Y, notify=True)

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

def process(*args, notify=False): ...

reference

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

city如何使用 mega unity_制作思路和CityEngine的简单使用

最近什么都不想干&#xff0c;就总结一下之前做过的一些东西。首先是建立一个虚拟城市&#xff0c;目前这个城市还在建造中&#xff0c;主要是用于自己的之后的动画和开放世界游戏制作&#xff0c;下面说以下自己之前的思路。说起城市建模&#xff0c;可以说是哗的一下一大堆可…

计算机网络结构有哪些,计算机网络主要拓扑结构有哪些

计算机网络的最主要的拓扑结构有总线型拓扑、环形拓扑、树形拓扑、星形拓扑、混合型拓扑以及网状拓扑。其中环形拓扑、星形拓扑、总线型拓扑是三个最基本的拓扑结构。在局域网中&#xff0c;使用最多的是星形结构。网络的拓扑结构&#xff1a;网络拓扑结构是指抛开网络电缆的物…

iphone怎样关闭副屏_iPhone手机关掉这3个设置,不仅省电,而且手机还不会卡

现在很多人无论是吃饭睡觉上厕所手机都会形影不离&#xff0c;然而手机玩久了电量就会刷刷的往下掉&#xff0c;不仅如此长时间下去手机还会出现卡顿的情况。如何才能令手机不卡顿并且最大限度上省电呢&#xff1f;为大家分享几个技巧&#xff0c;关掉这3个设置&#xff0c;手机…

wxpython按钮形状如何修改_Python图形化界面入门教程 - 使用wxPython自定义表

原标题&#xff1a;Python图形化界面入门教程 - 使用wxPython自定义表 来自&#xff1a; Linux迷 网址&#xff1a;https://www.linuxmi.com/python-gui-wxpython-zidingyi-biao.html 在此Python GUI中&#xff0c;我们学习下在wxPython中显示“定制表” 。在第一部分中&#x…

武汉大学计算机考研 专业课程,2018武汉大学计算机考研复试经验贴

2018武汉大学计算机考研复试经验贴武汉大学发布于2019年9月22日 12:25阅读数 18196初试唯一要讲的就是专业课问题&#xff0c;今年专业课改革&#xff0c;只考两门专业课。一门是数据结构&#xff0c;分值为90分&#xff0c;只有选择题和代码题&#xff0c;大概24个选择题&…

hi3798mv300是什么手机_华为海思电视芯片hi3798mv300 硬件参数如何?

这个是MV300的参数http://www.hisilicon.com.cn/-/media/Hisilicon/pdf/STB/Hi3798MV300.pdf​www.hisilicon.com.cn这个是MV200的参数http://www.hisilicon.com/-/media/Hisilicon/pdf/STB/Hi3798MV200.pdf​www.hisilicon.com两者对比&#xff1a;从参数来看&#xff0c;V300…

python 字符串分割_python中分割字符串split切割并选择输出 逐行读取文件后字符串拼接...

字符串根据分隔符切割后输出&#xff0c;一下面 #!/usr/bin/python # -*- coding: utf-8 -*- str"abc,123 efg,567" #以空行分割后输出 print str.split(); #以,分割2次后输出 print str.split(,,2); #以,分割2次后输出地2个参数&#xff0c;1是从0开始&#xff0c;代…

武汉计算机985211大学有哪些,武汉985211大学有哪些 武汉985211大学有什么

想必大家都听过去武大看樱花这句话吧!湖北最出名的大学可能就是武汉大学了&#xff0c;但是武汉大学不仅仅以其优秀的师资闻名&#xff0c;也以校园里美丽的樱花闻名。想要了解武汉985211大学有哪些&#xff0c;就来看看这些文章吧!武汉的985大学有武汉大学和华中科技大学。211…

迪信通机器人_迪信通要做机器人 玩票还是另有深意?

原标题&#xff1a;迪信通要做机器人 玩票还是另有深意?“迪信通要玩场大的。”迪信通(06188.HK)总裁金鑫近日向第一财经记者表示。金鑫所说&#xff0c;指向迪信通正在布局的一系列转型。迪信通是国内手机线下连锁渠道商&#xff0c;2015年&#xff0c;在手机行业整体增速放缓…

defaultdict python_Python使用defaultdict读取文件各列的方法

本文实例讲述了Python使用defaultdict读取文件各列的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; #!/usr/bin/python """USAGE: python *.py align_SNP_site out_file""" import sys #import time from collections import Cou…

为什么输入法显示中文打不出中文_搜狗输入法打不出中文怎么回事 打不出汉字解决办法...

搜狗输入法有的时候在电脑上打不出中文的情况你有遇到过吗&#xff1f;想知道如何修复搜狗输入法&#xff1f;不妨来看看本站提供的详细教程吧&#xff01;搜狗输入法打不出中文怎么回事&#xff1f;第一种&#xff1a;我们可以在搜狗输入法的“设置属性”――输入法修复器――…

html一排小标题怎么写,工作总结大标题小标题怎么写

大凡公文中所说的标题主要有两种&#xff1a;一种是公文本身的标题。根据中办发《党政机关公文处理工作条例》中的表述&#xff0c;“标题由发文机关名称、事由和文种组成。”按照此义&#xff0c;这里的标题应是指公文的总标题&#xff0c;也有人称之为题目、名称、大标题或主…

github 公钥 私钥_ubuntu git生成ssh key (公钥私钥)配置github或者码云

Git是分布式的代码管理工具&#xff0c;远程的代码管理是基于SSH的&#xff0c;所以要使用远程的Git则需要SSH的配置。github的SSH配置如下&#xff1a;设置Git的user name和email&#xff1a;git config --global user.name "xx"git config --global user.email &qu…

vmci.sys版本不正确_这样安装 Python 库才是最正确的哦

优质文章&#xff0c;第一时间送达&#xff01;分享一篇之前的文章&#xff0c;里面的这个Python知识点&#xff0c;可能很多人都还不清楚。平常我都是直接执行 pip install安装的第三方库&#xff0c;很多教程也是这么介绍的&#xff0c;一直以来我都认为这是标准的、正确的安…

概率计算机在线,高斯正态分布(概率)计算公式与在线计算器_三贝计算网_23bei.com...

输入平均值(M)、标准偏差(S)、数值(X1)、(选填)数值(X2)等已知量&#xff0c;点击计算按钮&#xff0c;可快速求出概率P(XX1)、概率P(XX2)、概率P(X1到X2)等结果。正态分布(Normal distribution)&#xff0c;也称“常态分布”&#xff0c;又名高斯分布(Gaussian distribution)&…

linux搭建lnnp_linux主机安装lnmp详细步骤

首先登陆ssh登陆&#xff0c;然后安装lnmp&#xff1a;wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz -cO lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 && ./install.sh lnmp大概40-50分钟然后##添加网站(虚拟主机)##lnmp vhost add提…

python操作文件open_python:open/文件操作

open/文件操作 fopen(/tmp/hello,w) #open(路径文件名,读写模式) #读写模式:r只读,r读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式 如:rb,wb,rb等等 读写模式的类型有&#xff1a; rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278) csv w 以写方式打开&…

mybatis 连接池_应用框架之Mybatis数据源和连接池

本文将从以下几个方面介绍Mybatis的数据源和连接池&#xff1a;MyBatis数据源DataSource分类数据源DataSource的创建过程DataSource什么时候创建Connection对象MyBatis数据源DataSource分类MyBatis数据源实现是在以下四个包中&#xff1a;MyBatis把数据源DataSource分为三种&am…

python默认安装地址_python多版本下设置python3为默认的方法

python3设置为多版本为默认的方法 如何在双python下设置python3为默认 在C:\Program下举例 第一步安装好python2和python3后设置好环境变量 第二步去掉python2根目录下的python.exe文件&#xff0c;还有Scripts文件夹下的pip.exe文件 第二步复制python3根目录下的python3.exe文…

惠普图形计算机游戏,惠普发布Victus by HP 16 - 一款适合PC游戏新人的游戏笔记本...

除了更新了其Omen系列的笔记本电脑&#xff0c;惠普今天还宣布了一个新的游戏笔记本电脑品牌&#xff0c;名为Victus by HP 16。看起来&#xff0c;Victus是为那些刚进入PC游戏世界的人准备的&#xff0c;他们可能不一定想买一台顶级的游戏笔记本作为他们的第一次尝试。虽然这表…