Python定义函数时,不同参数类型的传递

python的底层是通过C语言实现,因此参数调用时是通过地址传递的(和C语言一样,值是单向传递,指针才能实现双向传递),比如:


# -*- coding: utf-8 -*-def f1(x,y):    z=x+y    y=x  return z
a= 1
b=2
c=f1(a, b)
print c, a, b

得到的结果是

3 1 2

从这里可以看出b值并没有变化,也就是说值是单向传递的。

函数的定义时,参数可以是数值,列表(当元组处理),字典等,其参数定义形式如下:

def f(a, *pargs, **kargs):
    print(a, pargs, kargs)

实际上这是python的很重要的一个特性,即arbitrary arguments。当你需要一个函数支持任意多个参数的时候,你就会用到它。上面例子中的那个函数,python会把匹配上的参数作为一个tuple(元祖)来处理。可以像下面这样调用函数f,

f(1, 3, ‘abc‘, (‘lls‘, ‘pow‘), param1 = ‘A‘)

打印出来结果如下:

(1, (3, ‘abc‘, (‘lls‘, ‘pow‘)), {‘param1‘: ‘A‘})

python会把1匹配给参数a,把3, ‘abc‘, (‘lls‘, ‘pow‘)匹配给pargs,可以看出pargs被用tuple (3, ‘abc‘, (‘lls‘, ‘pow‘))赋值。
类似的,前面出现两个星号的kargs会被用字典匹配,即所有像param = x这种格式的传入参数会被转成dict赋值给给kargs。

需要注意的是,在定义函数的时候**kargs这种类型的参数必须放在最后(如果有的话),而*pargs这种类型的参数必须放在**kargs这种类型参数的前面,其他类型参数的后面。
比如下面这几种定义都是非法的

def f(a, *b, c=6, **d):
    pass
def f(a, **b, *c):
    pass
def f(*a, **b, c):
    pass
def f(a, b, *c, **d, e):
    pass

而下面这几种定义都是合法的

def f(a, **b):
    pass
def f(a, *b):
    pass
def f(*a, **b):
    passs
def f(**a):
    pass
def f(a, b=1, *c, **d):
    pass

举一个实际一点的例子,写一个函数,输入任意多个数字作为参数,找到其中最大的一个,就可以利用我们提到的*pargs, 代码如下:

1 def max(*pargs):
2     maxNum = pargs[0]
3     for i in pargs[1:]:
4         if i > maxNum:
5             maxNum = i
6     return maxNum
7
8 print max(5, 3, 1, 43, 54, 23, 1, 2, 32)

结果打印54。

参考博文:http://blog.chinaunix.net/uid-29466937-id-5752171.html

原文地址:https://www.cnblogs.com/kuangsyx/p/8858175.html

时间: 2024-10-31 16:14:54

Python定义函数时,不同参数类型的传递的相关文章

Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型

11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型,如Figure 11-5所示. Figure 11-5. A model for hotel reservations 想要返回每位游客房间预订条数和带来的总收入.因为很多地方需要这些信息,所以想要创建一个”模型定义”函数,接受一个查询参数,返回一个包含游客合计信息的匿名类型的集合: 2. 把Li

Python 定义函数

1        函数 1.1   调用函数 要调用一个函数,需要知道函数的名称和参数. abs绝对值函数 >>> abs(-10) 10 >>> abs(-213) 213 max最大值函数 >>> max(-1,2,5) 5 数据类型转换 >>> int(12.3) 12 >>> int('12.3')   --转换带有小数的整数字符串时,会报错 Traceback (most recent call last)

关于python的函数的*和**参数:

1.将足够的参数解包以后传递给函数:>def f(p1, p2, p3, p4):>     print p1+p2+p3+p4>>li = [1, 2, 3, 4]>f(*li)10>>tu = (1, 2, 3, 4)>f(*tu)10>>di = {'p1':1, 'p2':2, 'p3':3, 'p4':4}>f(**di)>10 2.使用封包的方法访问多余的参数>>> def funct(*para, **

js类定义函数时用不用prototype的区别?

一直在使用js编写自以为是面向对象的方法,遇到一个问题,就是定义一个方法,如下:      function ListCommon2(first,second,third) {   this.First=function () {  alert("first do"+first); } }  ListCommon2.do1=function(first) {    //   this.First();  alert("first do"+first); } List

js面向对象编程: js类定义函数时prototype和this区别?

在面向对象编写js脚本时,定义实例方法主要有两种 如下: function ListCommon2(afirst) { var first=afirst; this.do1=function () { alert("first do"+first); } } ListCommon2.prototype.do2=function() { // alert("first do"+first);//会出错,不能访问first this.do1(); } this.do1=

Python - 在定义函数时,为什么默认参数不能放在必选参数前面?

直接定义这样的函数时,Python会报错: Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>> def foo(p1, p2=6, p3): return 0

python定义函数以及参数检查

(转自廖雪峰网站) 函数定义 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数为例: def my_abs(x): if x >= 0: return x else: return -x 请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回.因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑. 如果没有re

python函数中的参数类型

python函数中的参数 python的函数类型详解

Python定义函数

其他形式1: 1.定义函数 def test4(a = ()): print('################test4################') print(type(a)) print(a) 2.调用函数 正确调用: test4((1, 2))        #a在函数体内部为tuple类型 test4(a=(1, 2))    #a在函数体内部为tuple类型 test4((1,))          #a在函数体内部为tuple类型 test4(a=(1,))      #a