网站首页 > 文章中心 > 其它

python定义传参函数

作者:小编 更新时间:2023-10-05 08:06:08 浏览量:90人看过

Python的函数和参数

parameter 是函数定义的参数形式

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

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

此外,

也是关键字传参

python定义传参函数-图1

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

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

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

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

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

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

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

非常晦涩

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

例子1:

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

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

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

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

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

而不是期望的

python 函数参数类型

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

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

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

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

add(1)

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

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

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

正确的调用方式

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

错误的调用方式

以上调用都会抛出SyntaxError 异常

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

默认参数的函数定义

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

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

默认参数的函数调用

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

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

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

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

举一个简单示例

可变参数主要有两类:

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

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

*args 的用法

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

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

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

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

理解* * kwargs

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

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

python怎么传参

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

机制有两种:值传递和引用传递.值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开

辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作

为局部变量进行,不会影响主调函数的实参变量的值.(推荐学习:Python视频教程)

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

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

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

Python 定义的函数的参数传递是怎么样的?

Python变量没有赋值,都是引用.

大多语言,是声明一个变量,给它分配一个空间保存一个值,也就是赋值.

Python则是给一个值分配一个空间,变量=这个值,只是这个变量引用了这个值的地址,也就是说,a=1,b=1,c=1,Python只分配了一个空间,保存这个值1. a,b,c都引用了这个地址.

至于为什么列表的值更改了,因为列表是可变变量

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章