`
SSailYang
  • 浏览: 313003 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Python 函数参数的传递[转载]

阅读更多
Python中函数参数的传递是通过“赋值”来传递的。但这条规则只回答了函数参数传递的“战略问题”,并没有回答“战术问题”,也就说没有回答怎么赋值的问题。函数参数的使用可以分为两个方面,一是函数参数如何定义,二是函数在调用时的参数如何解析的。而后者又是由前者决定的。函数参数的定义有四种形式:

   1. F(arg1,arg2,...)
   2. F(arg2=<value>,arg3=<value>...)
   3. F(*arg1)
   4. F(**arg1)

第1 种方式是最“传统”的方式:一个函数可以定义不限个数参数,参数(形式参数)放在跟在函数名后面的小括号中,各个参数之间以逗号隔开。用这种方式定义的函数在调用的时候也必须在函数名后的小括号中提供相等个数的值(实际参数),不能多也不能少,而且顺序还必须相同。也就是说形参和实参的个数必须一致,而且想给形参1的值必须是实参中的第一位,形参与实参之间是一一对应的关系,即“形参1=实参1 形参2=实参2...”。很明显这是一种非常不灵活的形式。比如:"def addOn(x,y): return x + y",这里定义的函数addOn,可以用addOn(1,2)的形式调用,意味着形参x将取值1,主将取值2。addOn(1,2,3)和addOn (1)都是错误的形式。
第2种方式比第1种方式好一点,在定义的时候已经给各个形参定义了默认值。因此,在调用这种函数时,如果没有给对应的形式参数传递实参,那么这个形参就将使用默认值。比如:“def addOn(x=3,y=5): return x + y”,那么addOn(6,5)的调用形式表示形参x取值6,y取值5。此外,addOn(7)这个形式也是可以的,表示形参x取值7,y取默认值5。这时候会出现一个问题,如果想让x取默认值,用实参给y赋值怎么办?前面两种调用形式明显就不行了,这时就要用到Python中函数调用方法的另一大绝招 ──关健字赋值法。可以用addOn(y=6),这时表示x取默认值3,而y取值6。这种方式通过指定形式参数可以实现可以对形式参数进行“精确攻击”,一个副带的功能是可以不必遵守形式参数的前后顺序,比如:addOn(y=4,x=6),这也是可以的。这种通过形式参数进行定点赋值的方式对于用第1种方式定义的函数也是适用的。
上面两种方式定义的形式参数的个数都是固定的,比如定义函数的时候如果定义了5个形参,那么在调用的时候最多也只能给它传递5个实参。但是在实际编程中并不能总是确定一个函数会有多少个参数。第3种方式就是用来应对这种情况的。它以一个*加上形参名的方式表示,这个函数实际参数是不一定的,可以是零个,也可以是N个。不管是多少个,在函数内部都被存放在以形参名为标识符的tuple中。比如:


对这个函数的调用addOn() addOn(2) addOn(3,4,5,6)等等都是可以的。

与第3种方式类似,形参名前面加了两个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中。这时候调用函数必须采用key1=value1、key2=value2...的形式。比如:

   1. def addOn(**arg):
   2.     sum = 0
   3.     if len(arg) == 0: return 0
   4.     else:
   5.        for x in arg.itervalues():
   6.           sum += x
   7.     return sum

那么对这个函数的调用可以用addOn()或诸如addOn(x=4,y=5,k=6)等的方式调用。

上面说了四种函数形式定义的方式以及他们的调用方式,是分开说的,其实这四种方式可以组合在一起形成复杂多样的形参定义形式。在定义或调用这种函数时,要遵循以下规则:

   1. arg=<value>必须在arg后
   2. *arg必须在arg=<value>后
   3. **arg必须在*arg后

在函数调用过程中,形参赋值的过程是这样的:
首先按顺序把“arg”这种形式的实参给对应的形参
第二,把“arg=<value>”这种形式的实参赋值给形式
第三,把多出来的“arg”这种形式的实参组成一个tuple给带一个星号的形参
第四,把多出来的“key=value”这种形式的实参转为一个dictionary给带两个星号的形参。
听起来好复杂,实际是是很简单的。很直观,来看例子:

   1. def test(x,y=5,*a,**b):
   2.     print x,y,a,b

就这么一个简单函数,来看看下面对这个函数调用会产生什么结果:
test(1) ===> 1 5 () {}
test(1,2) ===> 1 2 () {}
test(1,2,3)  ===> 1 2 (3,) {}
test(1,2,3,4) ===> 1 2 (3,4)
test(x=1)   ===> 1 5 () {}
test(x=1,y=1)  ===> 1 1 () {}
test(x=1,y=1,a=1)   ===> 1 1 () {'a':1}
test(x=1,y=1,a=1,b=1)   ===> 1 1 () {'a':1,'b':1}
test(1,y=1) ===> 1 1 () {}
test(1,2,y=1) ===> 出错,说y给赋了多个值
test(1,2,3,4,a=1) ===> 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4) {'k':1,'t':2,'o':3}
分享到:
评论

相关推荐

    第六章Python函数习题及答案--中文

    Python 函数习题及答案 -- 中文 本章节主要讲解了 Python ...本章节讲解了 Python 函数的基本概念和应用,包括函数的定义、函数的调用、函数的参数、函数的返回值等,同时也探讨了变量的范围和按值传递参数等问题。

    python 函数的动态参数python 函数的动态参数python 函数的动态参数python 函数的动态参数.txt

    python 函数的动态参数python 函数的动态参数python 函数的动态参数python 函数的动态参数python 函数的动态参数python 函数的动态参数python 函数的动态参数python 函数的动态参数python 函数的动态参数

    python函数实验报告.doc

    2. **函数参数**: - 函数可以接受参数,如`isPrime`函数中的`v`,用于传递值到函数内部进行处理。 - 参数类型可以是整数、字符串等,例如`demo`函数接收一个字符串`v`,统计其中的大写字母、小写字母、数字和其他...

    Python语言基础:函数的参数.pptx

    本篇文章将深入探讨Python中函数参数的四种类型:必需参数、关键字参数、默认参数和不定长参数。 1. **必需参数**: 必需参数是在定义函数时明确指定的参数,调用函数时必须按顺序提供这些参数。如果缺少任何一个...

    收集的C调用Python函数资料

    C函数的参数需要转换为Python对象才能传递给Python函数。这通常通过Python的类型转换函数完成,如`PyLong_FromLong()`(对于整型),`PyUnicode_FromString()`(对于字符串)等。 5. **调用Python函数**: 使用`...

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

    在调用函数的过程中参数是如何被解析先看第一个问题,在python中函数参数的定义主要有四种方式: 1.F(arg1,arg2,…) 这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的...

    C++之python函数调用

    在`InvokeNoParm()`函数中,`a`函数被调用,但不传递任何参数。 6. **调用有参数函数**: 对于有参数的函数,如`InvokeWith1Parm()`和`InvokeWith2Parm()`所示,首先需要使用`Py_BuildValue()`创建参数元组,然后...

    python函数声明和调用定义及原理详解

    函数参数的传递分为两种:位置参数和关键字参数。位置参数指的是按照函数定义时的顺序依次传递的参数,关键字参数则是指定了参数名的参数,可以不按照定义顺序传递。如果需要,可以在函数定义中给参数设置默认值,...

    python函数文档_python函数_python文档_python_

    在Python中,函数的定义使用关键字`def`,后跟函数名和圆括号,其中可能包含参数。函数文档是为其他程序员或使用者提供关于函数功能、参数、返回值和使用方式的详细信息的关键部分。 Python函数文档通常通过在函数...

    python函数和函数传参ppt.pptx

    函数参数的传递方式多样。可选参数(默认参数)可以在定义函数时设定默认值,但它们必须位于参数列表的末尾。例如,`dup(str, times = 2)`函数中`times`就是一个可选参数,如果不提供,它的默认值为2。可变数量参数...

    c++调用Python函数(并返回数据).zip

    4. **准备参数**:根据Python函数的参数类型,我们需要创建相应的Python对象作为参数。例如,如果函数需要一个整数参数,我们可以使用`PyLong_FromLong()`创建一个整数对象。 5. **调用Python函数**:使用`PyObject...

    Python函数定义及使用.pptx

    本节将详细介绍 Python 函数的定义和使用,包括函数的理解、定义、参数传递、返回值、作用域、递归等内容。 函数的理解与定义 函数是一段具有特定功能的、可重用的语句组,用函数名来表示并通过函数名进行完成功能...

    在Python中居然可以定义两个同名通参数的函数

    ### 在Python中定义两个同名同参数的函数 在日常编程实践中,我们通常遵循一个基本原则:在一个作用域内,不允许存在两个同名的函数或变量。然而,在Python中,却存在一种特殊情况,即可以在同一作用域下定义两个...

    VC调用Python函数,源代码

    - 若要调用Python函数,可以创建`PyObject*`类型的指针,通过`PyImport_ImportModule()`导入模块,然后使用`PyObject_GetAttrString()`获取函数对象,最后使用`PyObject_CallObject()`执行函数并传入参数。...

    Python函数.md

    #### 四、函数参数 ##### 1、位置参数与关键字参数 - **位置参数**:按照参数的位置顺序进行传递。例如: ```python def test(a, b, c): print(a) print(b) print(c) test(1, 2, 3) # 输出1 2 3 ``` - **...

    python函数.docx

    函数参数分为两种类型:形式参数(形参)和实际参数(实参)。形参是在函数定义中声明的,而实参是在调用函数时提供的值。例如: ```python def print_max(a, b): if a &gt; b: print(a, 'is maximum') else: ...

    Python函数参数定义及传递方式解析

    Python函数参数定义与传递方式是编程中至关重要的概念,它决定了如何向函数传递信息并进行处理。Python提供了四种参数定义方式,每种都有其特定的使用场景和优势。 1. **位置参数(Positional Arguments)** 这是...

    python 函数的使用-python基础,python函数的使用说明,有python2的参考代码

    Python 函数是编程中重复使用代码段的关键构造,它们提供了...理解函数、参数、形参和实参以及局部变量的概念对于编写可维护和可扩展的Python代码至关重要。通过熟练掌握这些基础知识,可以更高效地组织和复用代码。

    Python函数速查表.zip

    在Python中,函数是第一类对象,可以作为参数传递,也可以作为返回值。`def`关键字用于定义函数,如`def hello(name): print(f'Hello, {name}')`。此外,Python还支持匿名函数,即lambda函数,如`lambda x, y: x + y...

Global site tag (gtag.js) - Google Analytics