Python 收集参数与反转过程

收集 参数

简单的说,采用如下定义的函数

def my_func(*param1, **param2):    print *param1    print **param2

就是Python中的收集参数.即,所有位置参数会以元组的形式传递给函数my_func()的形式参数param,而位置参数之后的关键字参数会组成字典形式传递给函数my_func()的形式参数param2.

示例如下:

>>>my_func(1,2,3,foo=‘fooword‘,bar=‘barword‘)
(1, 2, 3)
{‘foo‘: ‘fooword‘, ‘bar‘: ‘barword‘}

如果只向函数传递位置参数或者只传递关键字参数,也是可以的. 如下:

>>> my_func(bar=‘barword‘,foo=‘fooword‘)()
{‘foo‘: ‘fooword‘, ‘bar‘: ‘barword‘}
>>> my_func(1,2,3)
(1, 2, 3)
{}

如果在关键字参数后,再添加位置参数,该位置参数将不会被收集,如下:

>>> my_func(1,2,foo=‘fooword‘,bar=‘barword‘)
(1, 2)
{‘foo‘: ‘fooword‘, ‘bar‘: ‘barword‘}

如果试图在位置参数前传递关键字参数,程序将抛出异常,如下:

>>> my_func(first=‘firstword‘,1,2,foo=‘fooword‘,bar=‘barword‘)
  File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg

反转过程

既然,在定义函数时可以指定将参数收集为元组或字典,那么,在调用函数时,当然可以将实际参数存储于元组或字典中,传递给函数,这就称为反转过程.

没有使用参数收集的函数

如果一个函数正常定义,使用反转过程传递参数,示例如下:

>>> def add(x,y):
...     return x+y
...
>>> t = (3,4)
>>> m= add(*t)
>>> print m
7
>>>m= add(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (1 given)

使用参数收集函数

如果一个函数使用参数收集,使用反转过程传递参数,示例如下:

>>> d = {‘foo‘:‘fooword‘,‘bar‘:‘barword‘}
>>> my_func(*t,**d)
(3, 4)
{‘foo‘: ‘fooword‘, ‘bar‘: ‘barword‘}

注意: 反转过程,将参数整合为一个元组或字典传递给函数,同样需要使用 *t (元组)或者  **d (字典) 的调用形式.

收集参数的应用

以位置参数为例,使用收集参数方法,可以一次传递多个参数.

>>> def input_name(*name):
...     for n in name:
...             print "input is %s" % n
...
>>> input_name(‘John‘)
input is John
>>> input_name(‘John‘,‘Hank‘,‘Alice‘,‘Bob‘)
input is John
input is Hank
input is Alice
input is Bob

收集参数,如果使用关键字参数,即收集到一个字典,使用方法类似于元组.

收集参数中的 *  符号,被成为 "拼接操作符" (Splicing),使用拼接操作符传递参数,可以不用考虑参数的数量.

时间: 2024-10-07 03:26:15

Python 收集参数与反转过程的相关文章

python收集参数

最近学习python,看<Python基础教程>(第2版),发现函数定义里面有一个"收集参数"很有趣. 用户定义函数时,可以定义一个确定参数数量的函数,如: >>> store(data, name1, name2, name3) 但是假如定义前不知道有多少个参数,该如何定义呢,C++和java中都有相应的解决方法,python中自然也有 def print_params(*params): print(params) 这里参数前面加上了星号*,即是不确定

第七章第3讲:python函数的关键字参数、默认参数、(收集参数)

1.关键字参数 作用:函数参数赋值时,不需要考虑函数代码块中参数的位置 def hello1(greeting,name): print("%s %s" % (greeting,name)) def hello2(name,greeting): # print("%s %s" % (name, greeting)) print("%s %s" % (greeting,name)) print(hello1("hello",&q

python 函数参数多种传递方法

python进阶教程之函数参数的多种传递方法 我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.我们将接触更多的参数传递方式.回忆一下位置传递:复制代码代码如下: def f(a,b,c): return a+b+cprint(f(1,2,3)) 在调用f时,1,2,3根据位置分别传递给了a,b,c.关键字传递有些情况下,用位置传递会感觉比较死板.关键字(keyword)传递是根据每个参数的名字传递参数.关键字并不用遵守位置的对应关系.依然

Python 函数参数类型大全(非常全!!!)

Python 函数参数类型大全(非常全!!!) 1.在python编写程序里面具有函数文档,它的主要作用是为了让别人可以更好的理解你的函数,所以这是一个好习惯,访问函数文档的方式是: MyFunction.__doc__ 2.python编写程序函数的时候具有两类参数: 形式参数(形参)及其实际参数(实参). 跟绝大部分编程语言一样,形参指的是函数创建和定义过程中小括号里的参数,而实参指的是函数在调用过程中传递进去的参数. 3.关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪

Python3基础 函数 收集参数+普通参数 的示例

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: # 收集参数 定制参数 定制参数 def MyFun(* paramters, name, key) : print('收集参数的长度:',len(paramters)) print(paramters[1]) print(name) print(key) #如何调用呢? #定

转:python 函数参数的传递(参数带星号的说明)

python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要有四种方式:1.F(arg1,arg2,...)这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应

python函数参数改变问题

python函数参数改不改变的问题 前几天在做项目的过程中发现了一个问题,向函数中传入一个list,在函数体内将其赋值给list,对list1操作后发现list也发生了变化,啊 ! 出乎意料.查了一下原因,原来python里有可变对象和不可变对象之分.只有传入的是不可变对象时,值才不发生改变,若是可变对象,充当函数参数时要注意了. 不可变对象:Number ,String , Tuple,bool 可变对象: List , Set , Dictionary是可以改变内部的元素 下面总结一下: 先

python函数参数类型及其顺序

根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSITIONAL.KEYWORD_ONLY.VAR_KEYWORD.如图: POSITIONAL_ONLY:参数值必须以位置参数的形式传递.python没有明确的语法来定义POSITIONAL_ONLY类型的参数,但很多内建或扩展模块的函数中常常会接收这种参数类型,实际使用中不多见,这里暂不考虑. PO

Python收集主机信息

Python收集linux主机信息,需要安装dmidecode命令,yum -y install dmidecode #!/usr/bin/env python # coding=utf-8   from subprocess import Popen, PIPE   #获取ifconfig命令信息 def getIfconfig():     p = Popen(['ifconfig'], stdout=PIPE)     data = p.stdout.read().decode()