重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

python带参函数 python函数的传参要求

Python 的函数是怎么传递参数的

Python 的函数传递参数:

成都创新互联是网站建设技术企业,为成都企业提供专业的成都网站建设、成都网站制作,网站设计,网站制作,网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制适合企业的网站。十余年品质,值得信赖!

Python 传参数可以理解为 C 的 const 指针(your_type* const your_variable),它所指向的对象可以被修改产生副作用,但变量本身不能修改指向其他对象。这个和 C++ 的 reference 差不多。

所以如果一定要产生 C 的修改指针指向其他对象的效果,用 list、dict 或其他自定义的 mutable 对象包装是一个办法,但我认为这样是一种不良实践。在 C 语言中用参数输出结果有非常多的理由:

C 语言没有 tuple,不能返回多值,除非声明一个 struct 类型。这种情况下划分 in 参数和 out 参数成为一种惯例

C 语言没有异常机制,返回值一般要保留给 errno

但这些情况在 Python 中都是不存在的

Python函数的参数类型

Python函数的参数类型主要包括必选参数、可选参数、可变参数、位置参数和关键字参数,本文介绍一下他们的定义以及可变数据类型参数传递需要注意的地方。

必选参数(Required arguments)是必须输入的参数,比如下面的代码,必须输入2个参数,否则就会报错:

其实上面例子中的参数 num1和num2也属于关键字参数,比如可以通过如下方式调用:

执行结果:

可选参数(Optional arguments)可以不用传入函数,有一个默认值,如果没有传入会使用默认值,不会报错。

位置参数(positional arguments)根据其在函数定义中的位置调用,下面是pow()函数的帮助信息:

x,y,z三个参数的的顺序是固定的,并且不能使用关键字:

输出:

在上面的pow()函数帮助信息中可以看到位置参数后面加了一个反斜杠 / ,这是python内置函数的语法定义,Python开发人员不能在python3.8版本之前的代码中使用此语法。但python3.0到3.7版本可以使用如下方式定义位置参数:

星号前面的参数为位置参数或者关键字参数,星号后面是强制关键字参数,具体介绍见强制关键字参数。

python3.8版本引入了强制位置参数(Positional-Only Parameters),也就是我们可以使用反斜杠 / 语法来定义位置参数了,可以写成如下形式:

来看下面的例子:

python3.8运行:

不能使用关键字参数形式赋值了。

可变参数 (varargs argument) 就是传入的参数个数是可变的,可以是0-n个,使用星号( * )将输入参数自动组装为一个元组(tuple):

执行结果:

关键字参数(keyword argument)允许将任意个含参数名的参数导入到python函数中,使用双星号( ** ),在函数内部自动组装为一个字典。

执行结果:

上面介绍的参数可以混合使用:

结果:

注意:由于传入的参数个数不定,所以当与普通参数一同使用时,必须把带星号的参数放在最后。

强制关键字参数(Keyword-Only Arguments)是python3引入的特性,可参考:。 使用一个星号隔开:

在位置参数一节介绍过星号前面的参数可以是位置参数和关键字参数。星号后面的参数都是强制关键字参数,必须以指定参数名的方式传参,如果强制关键字参数没有设置默认参数,调用函数时必须传参。

执行结果:

也可以在可变参数后面命名关键字参数,这样就不需要星号分隔符了:

执行结果:

在Python对象及内存管理机制中介绍了python中的参数传递属于对象的 引用传递 (pass by object reference),在编写函数的时候需要特别注意。

先来看个例子:

执行结果:

l1 和 l2指向相同的地址,由于列表可变,l1改变时,l2也跟着变了。

接着看下面的例子:

结果:

l1没有变化!为什么不是[1, 2, 3, 4]呢?

l = l + [4]表示创建一个“末尾加入元素 4“的新列表,并让 l 指向这个新的对象,l1没有进行任何操作,因此 l1 的值不变。如果要改变l1的值,需要加一个返回值:

结果:

下面的代码执行结果又是什么呢?

执行结果:

和第一个例子一样,l1 和 l2指向相同的地址,所以会一起改变。这个问题怎么解决呢?

可以使用下面的方式:

也可以使用浅拷贝或者深度拷贝,具体使用方法可参考Python对象及内存管理机制。这个问题在Python编程时需要特别注意。

本文主要介绍了python函数的几种参数类型:必选参数、可选参数、可变参数、位置参数、强制位置参数、关键字参数、强制关键字参数,注意他们不是完全独立的,比如必选参数、可选参数也可以是关键字参数,位置参数可以是必选参数或者可选参数。

另外,python中的参数传递属于对象的 引用传递 ,在对可变数据类型进行参数传递时需要特别注意,如有必要,使用python的拷贝方法。

参考文档:

--THE END--

Python 的函数是怎么传递参数的?

首先你要明白,Python的函数传递方式是赋值,而赋值是通过建立变量与对象的关联实现的。

对于你的代码:

执行 d = 2时,你在__main__里创建了d,并让它指向2这个整型对象。

执行函数add(d)过程中:

d被传递给add()函数后,在函数内部,num也指向了__main__中的2

但执行num = num + 10之后,新建了对象12,并让num指向了这个新对象——12。

如果你明白函数中的局部变量与__main__中变量的区别,那么很显然,在__main__中,d仍在指着2这个对象,它没有改变。因此,你打印d时得到了2。

如果你想让输出为12,最简洁的办法是:

在函数add()里增加return num

调用函数时使用d = add(d)

代码如下:

def add(num):

num += 10

return num

d = 2

d = add(d)

print d

python 函数参数类型

python 的函数参数类型分为4种:

1.位置参数:调用函数时根据函数定义的参数位置来传递参数,位置参数也可以叫做必要参数,函数调用时必须要传的参数。

当参数满足函数必要参数传参的条件,函数能够正常执行:

add(1,2) #两个参数的顺序必须一一对应,且少一个参数都不可以

当我们运行上面的程序,输出:

当函数需要两个必要参数,但是调用函数只给了一个参数时,程序会抛出异常

add(1)

当我们运行上面的程序,输出:

当函数需要两个必要参数,但是调用函数只给了三个参数时,程序会抛出异常

add(1,2,3)

当我们运行上面的程序,输出

2.关键字参数:用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

add(1,2) # 这种方式传参,必须按顺序传参:x对应1,y对应:2

add(y=2,x=1) #以关健字方式传入参数(可以不按顺序)

正确的调用方式

add(x=1, y=2)

add(y=2, x=1)

add(1, y=2)

以上调用方式都是允许的,能够正常执行

错误的调用方式

add(x=1, 2)

add(y=2, 1)

以上调用都会抛出SyntaxError 异常

上面例子可以看出:有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的

3.默认参数:用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值,所有位置参数必须出现在默认参数前,包括函数定义和调用,有多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上

默认参数的函数定义

上面示例第一个是正确的定义位置参数的方式,第二个是错误的,因为位置参数在前,默认参数在后

def add1(x=1,y) 的定义会抛出如下异常

默认参数的函数调用

注意:定义默认参数默认参数最好不要定义为可变对象,容易掉坑

不可变对象:该对象所指向的内存中的值不能被改变,int,string,float,tuple

可变对象,该对象所指向的内存中的值可以被改变,dict,list

这里只要理解一下这个概念就行或者自行百度,后续会写相关的专题文章讲解

举一个简单示例

4.可变参数区别:定义函数时,有时候我们不确定调用的时候会多少个参数,j就可以使用可变参数

可变参数主要有两类:

*args: (positional argument) 允许任意数量的可选位置参数(参数),将被分配给一个元组, 参数名前带*,args只是约定俗成的变量名,可以替换其他名称

**kwargs:(keyword argument) 允许任意数量的可选关键字参数,,将被分配给一个字典,参数名前带**,kwargs只是约定俗成的变量名,可以替换其他名称

*args 的用法

args 是用来传递一个非键值对的可变数量的参数列表给函数

语法是使用 符号的数量可变的参数; 按照惯例,通常是使用arg这个单词,args相当于一个变量名,可以自己定义的

在上面的程序中,我们使用* args作为一个可变长度参数列表传递给add()函数。 在函数中,我们有一个循环实现传递的参数计算和输出结果。

还可以直接传递列表或者数组的方式传递参数,以数组或者列表方式传递参数名前面加(*) 号

理解* * kwargs

**kwargs 允许你将不定长度的键值对, 作为参数传递给函数,这些关键字参数在函数内部自动组装为一个dict

下篇详细讲解 *args, **kwargs 的参数传递和使用敬请关注

python怎么给函数传参

函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两

种:值传递和引用传递。

推荐:Python教程

值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放

进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函

数的实参变量的值。

引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函

数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正

因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

更多技术请关注Python视频教程。

Python的函数和参数

parameter 是函数定义的参数形式

argument 是函数调用时传入的参数实体。

对于函数调用的传参模式,一般有两种:

此外,

也是关键字传参

python的函数参数定义一般来说有五种: 位置和关键字参数混合 , 仅位置参数 , 仅关键字参数 , 可变位置参数 , 可变关键字参数 。其中仅位置参数的方式仅仅是一个概念,python语法中暂时没有这样的设计。

通常我们见到的函数是位置和关键字混合的方式。

既可以用关键字又可以用位置调用

这种方式的定义只能使用关键字传参的模式

f(*some_list) 与 f(arg1, arg2, ...) (其中some_list = [arg1, arg2, ...])是等价的

网络模块request的request方法的设计

多数的可选参数被设计成可变关键字参数

有多种方法能够为函数定义输出:

非常晦涩

如果使用可变对象作为函数的默认参数,会导致默认参数在所有的函数调用中被共享。

例子1:

addItem方法的data设计了一个默认参数,使用不当会造成默认参数被共享。

python里面,函数的默认参数被存在__default__属性中,这是一个元组类型

例子2:

在例子1中,默认参数是一个列表,它是mutable的数据类型,当它写进 __defauts__属性中时,函数addItem的操作并不会改变它的id,相当于 __defauts__只是保存了data的引用,对于它的内存数据并不关心,每次调用addItem,都可以修改 addItem.__defauts__中的数据,它是一个共享数据。

如果默认参数是一个imutable类型,情况将会不一样,你无法改变默认参数第一次存入的值。

例子1中,连续调用addItem('world') 的结果会是

而不是期望的


网站栏目:python带参函数 python函数的传参要求
文章URL:http://cqcxhl.cn/article/hhcdop.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP