广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python函数参数传递机制
  • 973
分享到

Python函数参数传递机制

函数机制参数 2023-01-31 02:01:17 973人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

        最近在写代码的过程中,发现python参数传递不是很明白。Python确实很灵活,但是灵活的后果就是要花更多的时间去研究。废话不多说,始めましょう!!!Python参数传递有一下几种方式:1:位置参数Fun(arg1,arg

        最近在写代码的过程中,发现python参数传递不是很明白。Python确实很灵活,但是灵活的后果就是要花更多的时间去研究。废话不多说,始めましょう!!!


Python参数传递有一下几种方式:

1:位置参数

Fun(arg1,arg2,...)

2:默认值参数

Fun(arg1,arg2=<value>...)

3:关键字参数

Fun(arg1=<value>,arg2=<value>...)

4:过量位置参数

Fun(arg1,arg2,*arg3)

5:过量关键字参数

Fun(arg1,arg2,**arg3)

6:混合参数

Fun(arg1,arg2=<value>,*arg3,**arg4)


一:位置参数

Fun(arg1,arg2,...)

位置参数在所有的开发语言中基本都有,这种方式函数声明了几个参数,在调用的时候就必须传几个参数,并且传递参数的位置也要跟声明函数的参数位置必须一致。

In [64]: def demo(a,b):
   ....:     return a+b
   ....: 

In [65]: demo(1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-65-cd1a36a59e96> in <module>()
----> 1 demo(1)

TypeError: demo() takes exactly 2 arguments (1 given)

In [66]: demo(1,2)
Out[66]: 3

In [67]:

这种方式比较简单,就不做太多说明。



二:默认值传递

Fun(arg1,arg2=<value>...)

我个人认为,默认值传递和第三种的关键字传递结合在一起说明比较好,因为大多数情况下,默认值传递本身就要使用关键字。

In [67]: def demo(a,b=2):
   ....:     return a+b
   ....: 

In [68]: demo(2)
Out[68]: 4

In [69]: demo(4,5)
Out[69]: 9

In [70]: demo(a=4)
Out[70]: 6

In [71]: demo(a=4,b=5)
Out[71]: 9

In [72]: demo(b=5)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-72-f88a17b9de38> in <module>()
----> 1 demo(b=5)

TypeError: demo() takes at least 1 argument (1 given)

In [73]: demo(b=5,a=3)
Out[73]: 8

在声明函数demo的时候,给参数b付了一个默认值2,所以在调用demo的时候,可以只给a传递,在函数内部计算的时候就使用的是b的默认值。

如果在调用的时候给b传了一个值,那就使用传递的值,而不是使用默认值。

但是这种情况下,参数a是必须的,所以在调用的时候必须给a传值,否则将报错。因为参数b有默认值,所以即使不给b传值,也是可以的,将使用默认值。

在声明函数的时候,参数列表中有参数的名称,所以可以通过指定变量名的形式传递参数,并且变量的位置可以改变,这样Python内部自己就会去对应哪个实参该传给哪个形参。


三:关键字传递

Fun(arg1=<value>,arg2=<value>...)

In [79]: def demo(a=1,b=2,c=3):
   ....:     return a+b+c
   ....: 

In [81]: demo(4,5,6)
Out[81]: 15

In [82]: demo(4)
Out[82]: 9

In [83]: demo(b=4)
Out[83]: 8

In [84]: demo(b=8,a=5,c=3)
Out[84]: 16

理解了上面默认值传递的形式,再看关键字传递就很容易理解了,所以就不在做太多的解释。


四:过量位置参数

Fun(arg1,arg2,*arg3)

In [94]: def demo(a,b,*args):
   ....:     print a+b
   ....:     print type(args)
   ....:     print args
   ....:     

In [95]: demo(1,2,3,4,5)
3
<type 'tuple'>
(3, 4, 5)

In [100]: demo(1,2,3)
3
<type 'tuple'>
(3,)

In [98]: demo(1,23)
24
<type 'tuple'>
()

In [101]: demo(1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-101-cd1a36a59e96> in <module>()
----> 1 demo(1)

TypeError: demo() takes at least 2 arguments (1 given)

如上面的代码所示:声明的函数demo中,参数a和b是必须参数,所以a和b是必须的,也就是说在调用demo函数的时候,至少需要传递两个参数,否则将出错。

过量位置参数使用星号(*)加变量名的形式(*args),在传递多余2个参数的时候,前两个参数分别赋值给了a和b,后面的参数都将整体赋值给args,通过打印可以看出,args是一个元祖类型,所以可以通过遍历将里面的数据取出来使用。


五:过量关键字参数

Fun(arg1,arg2,**arg3)

In [103]: def demo(a,b,**kwargs):
   .....:     print a+b
   .....:     print type(kwargs)
   .....:     print kwargs
   .....:     

In [104]: demo(1,2)
3
<type 'dict'>
{}

In [105]: demo(1,2,c=1)
3
<type 'dict'>
{'c': 1}

In [106]: demo(1,2,c=1,d=2)
3
<type 'dict'>
{'c': 1, 'd': 2}

In [107]: demo(1,2,3,c=1,d=2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-107-94e09001d957> in <module>()
----> 1 demo(1,2,3,c=1,d=2)

TypeError: demo() takes exactly 2 arguments (5 given)

In [108]: demo(1,2,3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-108-856c09b109ab> in <module>()
----> 1 demo(1,2,3)

TypeError: demo() takes exactly 2 arguments (3 given)

过量关键字使用两个星号加变量名的形式,即(**kwargs)

在之前的介绍关键字参数的时候可以看出,关键字参数一般都以键值对的形式存在,在过量关键字参数中也是,kwargs只接受键值对形式的参数,所以像107和108这两种调用方式就会出错,值1和2分别赋值给了a和b,后面的c=1和d=2通过kwargs来接受,剩余的3没有形式参数来接受,所以就会报错。因为**kwargs值接受键值对形式的参数。


六:混合参数

Fun(arg1,arg2=<value>,*arg3,**arg4)

In [109]: def demo(a,b,c=1,*args,**kwargs):
   .....:     print a+b+c
   .....:     print args
   .....:     print kwargs
   .....:     

In [110]: demo(2,3)
6
()
{}

In [111]: demo(2,3,4)
9
()
{}

In [112]: demo(2,3,4,5)
9
(5,)
{}

In [113]: demo(2,3,4,5,6)
9
(5, 6)
{}

In [114]: demo(2,3,4,5,6,d=1,e=2)
9
(5, 6)
{'e': 2, 'd': 1}

如上面代码所示,混合参数就是将前面介绍的几种形式结合起来一起使用。

a和b是位置参数,c是默认值参数,args是过量位置参数,kwargs是过量关键字参数。

理解了上面说的几种形式,再来理解混合参数形式应该比较简单,就不做过多的解释。


下面通过混合实例的形式,说明一下具体的使用。

首先定义函数如下

In [109]: def demo(a,b,c=1,*args,**kwargs):
   .....:     print a+b+c
   .....:     print args
   .....:     print kwargs
   .....:


实例1:

In [115]: demo(2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-115-5fc919890c38> in <module>()
----> 1 demo(2)

TypeError: demo() takes at least 2 arguments (1 given)

在调用函数的时候只传了一个值,但是从函数定义来看,a和b时必须的,只传了一个值,相当于只给a赋值了,b没有赋值,所以会报错。


实例2

In [117]: demo(2,3,a=4)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-117-803c2126718d> in <module>()
----> 1 demo(2,3,a=4)

TypeError: demo() Got multiple values for keyWord argument 'a'

上面调用函数出错的原因是因为没有按照正确的顺序给demo赋值,不能就认为指定a=4,就会在调用的时候就将4赋值给了a,剩下两个值2和3分别赋值给b和c,这是错误的,在这种混合模式下,赋值顺序必须是先位置参数->默认值参数->过量位置参数->过量关键字参数,否则就会出错。再看下面这个例子。

In [119]: demo(1,2,3,d=2,5,6)
  File "<ipython-input-119-6a415509517c>", line 1
    demo(1,2,3,d=2,5,6)
SyntaxError: non-keyword arg after keyword arg


In [120]: demo(1,2,3,5,6,d=2,)
6
(5, 6)
{'d': 2}

1,2,3分别赋值给了a,b,c,这没有问题,但是将d=2过量关键字参数放在了5,6过量位置参数前面,就出现了报错,将两者的顺序调换一下就没有问题。


重新定义函数demo,之后的实例将使用新定义的函数

In [121]: def demo(a,b,c):
   .....:     return a+b+c
   .....:


实例3

In [122]: demo(a=1,2,3)
  File "<ipython-input-122-ec666e77af79>", line 1
    demo(a=1,2,3)
SyntaxError: non-keyword arg after keyword arg


In [123]: demo(1,2,c=3)
Out[123]: 6

In [124]: demo(a=1,b=2,c=3)
Out[124]: 6

如上面的代码所示:

[122]在调用函数demo的时候在最前面指定了a的值,出现了错误,错误信息翻译成中文意思是:不要在关键字参数后使用位置参数。

[123]的调用方式就不会出现错误。所以在调用函数的时候,使用关键字形式传参一定要在位置传参的后面。


实例4

In [125]: args = (2,3)

In [126]: demo(1,*args)
Out[126]: 6

In [127]: demo(a=1,*args)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-127-aeb489dc72f3> in <module>()
----> 1 demo(a=1,*args)

TypeError: demo() got multiple values for keyword argument 'a'

上面[126]调用的时候,通过一个元祖包装了2个参数值,1赋值给形参a,元祖args中的2,3分别赋值给了形参b和c。

但是[127]的调用形式就会出错,其调用形式可以看成demo(a=1,2,3),原因就跟上面实例3的情况差不多,因为Python中“关键字形式传参一定要在位置传参的后面”,所以Python在赋值的时候,将先将2赋值给a,将3赋值给b,最后又将a=1赋值给a,所以就会出现上述的错误信息。


如果换一种形式传参,将2和3分装到字典中,就不会出现这种错误,如下代码所示

In [129]: dict={'b':2,'c':3}

In [130]: demo(a=1,**dict)
Out[130]: 6

In [131]: demo(**dict,a=1)
  File "<ipython-input-131-cd33424dd41b>", line 1
    demo(**dict,a=1)
               ^
SyntaxError: invalid syntax

将参数包装到字典中,就相当于所有的参数都是用关键字参数的形式传递,即demo(a=1,b=2,c=3),所以就不会出错。


综上所述,在传递参数的时候,一定要遵循参数传递的顺序,即位置参数->默认值参数->过量位置参数->过量关键字参数。

--结束END--

本文标题: Python函数参数传递机制

本文链接: https://www.lsjlt.com/news/186253.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python函数参数传递机制
            最近在写代码的过程中,发现Python参数传递不是很明白。Python确实很灵活,但是灵活的后果就是要花更多的时间去研究。废话不多说,始めましょう!!!Python参数传递有一下几种方式:1:位置参数Fun(arg1,arg...
    99+
    2023-01-31
    函数 机制 参数
  • Python 函数作为参数传递
    #map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作...
    99+
    2023-01-31
    函数 参数 Python
  • Python中怎么传递函数参数
    今天就跟大家聊聊有关Python中怎么传递函数参数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。函数参数的使用又有俩个方面值得注意:>>> def&nbs...
    99+
    2023-06-17
  • Python中函数参数如何传递
    这篇文章主要介绍了Python中函数参数如何传递,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。函数参数如何传递key-value方式传递参数:下面是非常常见的传递方式,参数名...
    99+
    2023-06-25
  • 浅谈Python中函数的参数传递
    1.普通的参数传递 >>> def add(a,b): return a+b >>> print add(1,2) 3 >>> pri...
    99+
    2022-06-04
    浅谈 函数 参数
  • python如何传递函数中的参数
    在python中传递函数参数的方法有以下几种使用function(**kwargs)方法传参def func(**kwargs):print kwargsfunc(a = 1, b = 2, c = 3)输出为:{'a':1, 'b':2,...
    99+
    2022-10-15
  • Python中的函数参数传递问题
    目录一、前言二、了解形式参数和实际参数1.通过作用理解2.通过比喻来理解形参和实参三、位置参数1.数量必须与定义时一致2.位置必须与定义时一致四、关键字参数五、为参数设置默认值六、可...
    99+
    2023-01-04
    Python函数参数传递 Python函数 Python参数传递
  • java 函数的参数传递
    The Java programming language always uses call by value. That means that the method gets a copy of all parameter values....
    99+
    2023-06-03
  • php函数间的参数传递(值传递/引用传递)
    php:函数间的参数传递 1.值传递 复制代码 代码如下: <php function exam($var1){ $var1++; echo "In Exam:" . $var...
    99+
    2022-11-15
    php函数 参数传递
  • python函数中如何传递参数位置
    今天就跟大家聊聊有关python函数中如何传递参数位置,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、说明调用函数时,默认按位置顺序将对应的实参传递给形参,将第一个实参分配给第一个...
    99+
    2023-06-15
  • python函数的四种参数传递方式
    python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及,后两种一般...
    99+
    2023-01-30
    四种 函数 参数
  • Python参数的传递
    一、参数的传递  函数的参数传递本质上就是:从实参到形参的赋值操作。Python中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python中参数的传递都是“引用传递”,不是“值传递”。 具体操作时分为两类: 对“可变对象”进行...
    99+
    2023-09-10
    java 开发语言
  • Python函数值传递引用传递及形式参数和实际参数的区别
    通常情况下,定义函数时都会选择有参数的函数形式,函数参数的作用是传递数据给函数,令其对接收的数据做具体的操作处理。 在使用函数时,经常会用到形式参数(简称“形参&rdqu...
    99+
    2022-11-11
  • 深入理解python中函数传递参数是值传递还是引用传递
    目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是...
    99+
    2022-06-04
    函数 参数 python
  • Python函数参数传递的规则是什么
    在Python中,函数参数传递的规则如下:1. 不可变对象作为参数:当传递不可变对象(例如数字、字符串、元组)作为函数参数时,实际上...
    99+
    2023-09-16
    python
  • python函数参数传递的方法有哪些
    在Python中,函数参数传递的方法有以下几种:1. 位置参数传递:根据参数的位置顺序进行传递,参数的值与参数的位置一一对应。例如:...
    99+
    2023-10-19
    python
  • python函数装饰器构造和参数传递
    目录一.闭包函数二.python装饰器构造三.python装饰器叠加四.python装饰器传参1.装饰器单个参数传递2.装饰器多个参数传递3.装饰器的不定长参数五、带返回值的装饰器前...
    99+
    2022-11-13
  • Python中函数参数传递方法有哪些
    这篇文章主要介绍“Python中函数参数传递方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中函数参数传递方法有哪些”文章能帮助大家解决问题。定义和传递参数parameters ...
    99+
    2023-07-06
  • 一文搞懂Python的函数传参机制
    目录一、最简单的函数(无返回值、参数)二、最简单的函数(带返回值、无参数)三、带一个参数(无默认值)四、带有多个参数(无默认值)五、参数设置默认值(一个参数)六、参数设置默认值(多个...
    99+
    2022-11-11
  • php函数参数的传递方法
    这篇文章给大家分享的是有关php函数参数的传递方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在调用函数时,需要向函数传递参数,被传入函数的参数称为实参,而函数定义的参数称为形参。而向函数传递参数的方式有四种,...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作