python 参数传递及分类

 python函数的形参集合由在调用时要传入函数的所有参数组成,这参数与函数声明中的参数列表精确的配对。这些参数包括了所有必要参数(以正确的定位顺序来传入函数的),关键字参数(以顺序或者不按顺序传入,但是带有参数列表中曾定义过的关键字)
,以及所有含有默认值,函数调用时不必要指定的参数。(声明函数时创建的)局部命名空间为各个参数值,创建了一个名字。一旦函数开始执行,即能访问这个名字。
               
              位置参数
          位置参数 标准化参数。位置参数必须以在被调用函数中定义的准确顺序来传递。另外,没有任何默认参数(见下一个部分)的话,传入函数(调用)的参数的精确的数目必须和声明 的数字一致,否则就会出错。如下面例子:

>>> def foo(who):
...     print 'hello',who
... 
>>> foo

>>> foo()
Traceback (most recent call last):
  File "", line 1, in
TypeError: foo() takes exactly 1 argument (0 given)
>>> foo('world')
hello world
>>> foo('Mr','world')
Traceback (most recent call last):
  File "", line 1, in
TypeError: foo() takes exactly 1 argument (2 given)

          foo()函数有一个位置参数。 那意味着任何对foo()的调用必须有唯一的一个参数, 不多, 不少。 否则你会频频看到TypeError。看看,python 的错误是多么具有信息性的。作为一个普遍的规则, 无论何时调用函数,都必须提供函数的所有位置参数。

              默认参数
        默认参数让程序的健壮性上升到极高的级别,因为它们补充了标准位置参数没有提供的一些灵活性。这种简洁极大的帮助了程序员。当少几个需要操心的参数时候,生活不再那么复杂。这在一 个程序员刚接触到一个API 接口时,没有足够的知识来给参数提供更对口的值时显得尤为有帮助。
        另外一个让开发者受益的地方在于,使开发者更好地控制为顾客开发的软件。当提供了默认值
的时候,他们可以精心选择“最佳“的默认值,所以用户不需要马上面对繁琐的选项。
>>> defmulti_add(const,rate=0.1):
...     return const+const*rate
... 
>>> multi_add(100)
110.0
>>> multi_add(100,0.5)
150.0
>>> 


              所有必需的参数都要在默认参数之前。为什么?简单说来就是因为它们是强制性的,但默认参 数不是。从句法构成上看,对于解释器来说,如果允许混合模式,确定什么值来匹配什么参数是不 可能的。如果没有按正确的顺序给出参数,就会产生一个语法错误:
>>> defmulti_add(rate=0.1,const):
...     returnconst+const*rate
... 
  File "", line 1
SyntaxError: non-default argument follows default argument
>>> 


                非关键字可变长参数
              可能会有需要用函数处理可变数量参数的情况。这时可使用可变长度的参数列表。变长的参数 在函数声明中不是显式命名的,因为参数的数目在运行时之前是未知的(甚至在运行的期间,每次 函数调用的参数的数目也可能是不同的) ,这和常规参数(位置和默认)明显不同,常规参数都是在 函数声明中命名的。由于函数调用提供了关键字以及非关键字两种参数类型,python用两种方法来 支持变长参数,

                当函数被调用的时候,所有的形参(必须的和默认的)都将值赋给了在函数声明中相对应的局 部变量。剩下的非关键字参数按顺序插入到一个元组中便于访问。可能你对C 中的“varargs“很熟 悉(比如, va_list,va_arg,以及省略号[....])。Python 提供了与之相等的支持---迭代过所有的 元组元素和在 C 中用 va_arg是相同的。对于那些不熟悉 C 或者"varargs"的人,这仅仅代表了在函 数调用时,接受一个不定(非固定)数目的参数。

                星号操作符之后的形参将作为元组传递给函数,元组保存了所有传递给函数的"额外"的参数(匹 配了所有位置和具名参数后剩余的)。如果没有给出额外的参数,元组为空。
          正如我们先前看见的,只要在函数调用时给出不正确的函数参数数目,就会产生一个TypeError 异常。 通过末尾增加一个可变的参数列表变量, 我们就能处理当超出数目的参数被传入函数的情形, 因为所有的额外(非关键字)参数会被添加到变量参数元组。 (额外的关键字参数需要关键字变量参 数[参见下一小节].)正如预料的那样,由于和位置参数必须放在关键字参数之前一样的原因,所有 的形式参数必须先于非正式的参数之前出现。

示例参数:
>>> defproduct(*args):
...     result=1
...     for arg in args:
...             result*=arg
...     return result
... 
>>> product(1,2,3,4)
24
>>> product(5,3,8)
120
>>> product(9)
9
>>> 



关键字变量参数
        在我们有不定数目的或者额外集合的关键字的情况中,参数被放入一个字典中,字典中键为参 数名,值为相应的参数值。为什么一定要是字典呢?因为为每个参数-参数的名字和参数值--都是成 对给出---用字典来保存这些参数自然就最适合不过了。

>>> def add_person(ssn,surnname,**kwargs):
...     print("SSN = ",ssn)
...     print("surnname=",surnname)
...     for key insorted(kwargs):
...             print("{0}={1}".format(key,kwargs[key]))
... 
>>>add_person(83272171,"Luther",forename="Lexis",age=47)
('SSN = ', 83272171)
('surnname=', 'Luther')
age=47
forename=Lexis
>>> 


注:本文主要参考《Python核心编程》与《python3程序开发指南》
    原创文章,允许转载,转载请说名出处!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值