鉴于函数定义中可能包含多个形参变量,因此函数调用中也可能包含多个实参变量。向函数传递实参变量给形参变量的方式有很多,可使用位置参数,这要求实参变量的顺序与形参变量的顺序相同;也可使用关键字参数,都由变量名和值组成,简称名称-值对;还可使用列表(元组)和字典

1.位置参数

调用函数时,Python必须将函数调用中的每个实参变量都关联到函数声明中的一个形参变量上。为此,最简单的关联方式是基于形参变量与实参变量的位置顺序。这种关联方式被称为位置参数。

其语法逻辑如下所示:



我们假设一个输出人的爱好信息函数,编写程序如下所示:



通过这个函数的声明可以发现,它需要一个人的姓名和爱好。调用print_hobby函数时,需要按位置顺序提供一个人的姓名和爱好。字符串变量的文本内容'张三'传递给函数声明中形参变量name,字符串变量的文本内容'足球'传递给函数声明中形参变量hobby,然后print_hobby函数就可以利用形参变量name和hobby去实现功能,这里实现的功能很简单,就是输出拼接字符串信息。

1.1多次调用

我们可以再进行第二次调用看是否是按照实参变量与形参变量的位置顺序来进行传递的,编写程序如下所示:



通过输出结果发现是我们所设想的输出结果。

在函数中,可根据需要使用任意数量的位置参数,Python将按位置顺序从前到后将函数调用中的实参变量关联到函数声明中相应的形参变量,完成数据信息的传递

1.2位置参数的顺序很重要

使用位置参数来调用函数时,如果实参变量的顺序不正确,结果会出乎我们的意料,比如我们把第一个实参变量位置填写爱好信息,第二个实参变量位置填写姓名信息,编写程序如下所示:



通过上面的输出结果我们发现显然不是我们想要的结果,所以一定要在函数调用时,按照形参变量的位置顺序,编写对实参变量的位置顺序,不然就会发生错误。

2.关键字参数

之前我们接触过字典的键值对,现在我们再学习一个关系对,名称-值对。关键字参数是传递给函数的名称-值对。我们直接在函数调用时将名称和值关联起来,因此向函数传递实参变量时不会混淆。用关键字参数的时候无须考虑函数调用中的实参变量的位置顺序。

我们还是以人名和爱好两个信息来举例,编写程序如下所示:



我们可以发现通过关键字参数,即使改变了实参变量的位置顺序,输出结果还是我们之前所设想的,所以,关键字参数的顺序无关紧要,因为Python知道各个实参变量的值该存储到哪个形参变量中,但是使用关键字参数时,务必准确地指定函数定义中的形参变量名。

3.默认值

编写函数时,可给每个形参变量指定默认值。在调用函数中给形参变量提供实参变量的值时,Python将使用指定的实参变量的值;否则,将使用形参变量的默认值。因此,给形参变量指定默认值后,可在函数调用中省略相应的实参变量。使用默认值可简化函数调用,比如,经过我们大量收集人的爱好,发现爱好音乐的人比较多,我们可以将音乐作为默认值,编写程序如下所示:



我们可以发现,当我们按照位置参数的方式进行实参变量值传递的时候,hobby的值由'篮球'变为了'足球',输出结果上爱好是足球,当我们不传递第二个实参变量值的时候,hobby因为没有接收到新值,所以使用了默认值'篮球',输出结果上爱好是篮球。

虽然我们的部分形参变量使用了默认值,在上面的程序中,name还是第一个位置参数,hobby还是第二个位置参数,如果我们改成print_hobby(hobby='篮球',name):这样会发生什么,编写程序如下所示:



运行后发现,提示错误,该错误显示没有默认值的参数后面应该跟随有默认值的参数。也就是说明了,在形参变量有默认值的情况下,有默认值的形参变量在后面,没有默认值的形参变量在前面,如果是多个形参变量,一部分为有默认值的形参变量,一部分为没有默认值的形参变量,那么我们要先列出没有默认值的形参变量,再列出有默认值的形参变量。这让Python依然能够正确地解读位置参数。比如我们再构造两个形参变量,一个调查时间time,一个调查者people,调查时间我们默认是'2023-01-01',编写程序如下所示:



我们一旦将有默认值的提前到没有默认值的前面,或者没有默认值的放在有默认值的后面,将在运行时产生错误,编写程序如下所示:

4.传递任意数量参数

4.1任意数量参数

有时候,我们预先不知道函数需要接受多少个实参变量,但是Python允许函数从调用语句中收集任意数量的实参变量。因为爱好可以只有一个,也可以有很多,所以数量是不一定的,我们可以通过任意数量参数来解决,其语法格式:def 函数名(形参变量名):

编写程序如下所示:



通过输出结果我们可以看出,我们把实参变量值传递给形参变量hobby的过程中,经过
号的作用,hobby变成了元组,通过元组的形式来接收多个实参变量值,既然是元组接收,我们可以遍历该元组,编写程序如下所示:



通过对输出结果的观察是符合我们设想的。

总而言之,在不知道函数具体收到多少个实参变量值的时候,我们可以采取将形参变量在左上角加上*号的方式。

4.2结合使用位置参数和任意数量参数

如果要让函数接受不同类型的实参变量,必须在函数声明中将接纳任意数量参数的形参变量放在最后,Python先匹配位置参数和关键字参数,再将余下的实参变量都收集到最后一个形参变量中。

比如我们在之前的程序中,加入人名,函数声明时,人名形参变量name,必须放在任意数量形参变量的前面,函数调用时先写人名实参变量,然后再写任意数量实参变量,编写程序如下所示:



基于上述函数声明,Python将第一个实参变量值'张三'传递到形参变量name,并将其他的实参变量值都存储在元组hobby中

4.3任意数量的关键字参数

有时候,需要接受任意数量的实参变量,但预先不知道传递给函数的会是什么样的信息。在这种情况下可将函数的形参变量编写成能够接受任意数量的关键字参数。比如一个人的信息简介,我们知道名字是必须的,但是我们不知道他会提供什么其他的信息,我们可以使用任意数量的关键字参数,编写程序如下所示:



函数print_info的声明要求提供姓名,同时允许用户根据需要提供任意数量的关键字参数,也就是名称-值对。

形参变量**other中的两个星号让Python创建一个名为other的空字典,并将收到的所有名称-值对都封装到这个字典中。在函数中可以向访问其他字典那样访问other中的名称-值对。

总而言之,编写函数时,可以以各种方式混合使用位置参数、关键字参数和任意数量参数。

【python基础】函数-参数形式的更多相关文章

  1. Python基础-函数参数

    Python基础-函数参数 写在前面 如非特别说明,下文均基于Python3 摘要 本文详细介绍了函数的各种形参类型,包括位置参数,默认参数值,关键字参数,任意参数列表,强制关键字参数:也介绍了调用函 ...

  2. python基础——函数参数

    课上老师已经讲过函数(func)的参数(args)传递. 之前学习了根据位置传递对应的参数,下面会介绍其他参数传递方式. 之前的位置传参: def f(a,b,c): return a+b+c pri ...

  3. python基础——函数的参数

    python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...

  4. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  5. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  6. python 中函数参数传递形式

    python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...

  7. python基础—函数嵌套与闭包

    python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间   内置在解释器中的名称 2 全局名称空间   顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...

  8. (转)python中函数参数中如果带有默认参数list的特殊情况

    在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]):     for i in range(x):         ...

  9. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  10. python中函数参数的引用方式

    值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...

随机推荐

  1. HTTP TCP UDP WEBSOCKET

    概念: TCP和UDP:传输层协议:(卡车) HTTP:应用层协议:(货物).HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议.客户端使用Web浏览器发 ...

  2. window的子对象

    在控制台输入 history history.length 历史记录个数history.back() 后退history.forward() 前进history.go(n) 跳到某一页,可正可负,当n ...

  3. STM32 HAL库学习(F407ZGT6) (1)-晶振/时钟树

    时钟树(以F407为例)   对于 STM32F4 系列的芯片,正常工作的主频可以达到 168Mhz,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十Khz的时钟即可.同一个 ...

  4. [Linux]CPU架构/指令集:RISC / CISC | arm | amd | X86/i386 | aarch64

    1 前言 本文是解决在软件开发.软件交付过程中,常常需要找寻与服务器硬件的CPU架构适配的软件包时,开发者和交付者又时常摸不着头脑.[迷迷糊糊]地就下载了某个所谓"适配".&quo ...

  5. day07-OpenFeign-服务调用

    SpringCloud OpenFeign-服务调用 1.OpenFeign介绍 https://github.com/spring-cloud/spring-cloud-openfeign Open ...

  6. 从内核源码看 slab 内存池的创建初始化流程

    在上篇文章 <细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现 >中,笔者从 slab cache 的总体架构演进角度以及 slab cache 的运行原理角度为大家勾勒 ...

  7. Java学习笔记06

    1. 类和对象 1.1 类和对象 ​ 客观存在的事物皆为对象,所以我们也常常说万物皆对象. 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象 类是对象的数据类型,类是具有相同属性和行为 ...

  8. rails的接口查询详解

    Retrieving Objects from the Database find "find"是一种常用的数据库查询方法,在Rails中被用于从数据库中查找单个记录.它可以接收一 ...

  9. AI人工智能 机器学习 深度学习 学习路径及推荐书籍

    要学习Pytorch,需要掌握以下基本知识: 编程语言:Pytorch使用Python作为主要编程语言,因此需要熟悉Python编程语言. 线性代数和微积分:Pytorch主要用于深度学习领域,深度学 ...

  10. Python 函数及参数的使用

    函数 带名字的代码块,用于完成具体的工作 关键字def定义一个函数,定义函数名,括号内是需要完成任务所需要的信息,最后定义冒号结尾 缩进构成函数体 函数调用,依次指定函数名以及冒号括起来的必要信息 d ...