Python学习笔记——自定义函数(基础知识)

自定义函数非常简洁有效地实现了代码的复用,让程序编写、阅读、测试和修改变得更加容易。

下面记录Python自定义函数的使用。

1、定义函数:

def describe_pet(pet_name,animal_type='dog'):
    '''显示宠物的信息'''
    print(f"\nI have a {animal_type}.")
    print(f"My {animal_type}'s name is {pet_name.title()}。")   

上面代码定义了一个函数describe_pet(),第一行使用定义函数的关键字def,def关键字告诉Python解释器你要定义一个函数,describe_pet是函数名字,紧跟函数名字后面是一对圆括号,括号内可定义参数,或者为空(没有参数,圆括号也是必须的),最后是冒号结尾。

上面代码第二行及所有缩进的代码构成了函数体。

上面代码第二行的文本使用一对三单引号(或者双引号),成为文档字符串(docstring)注释,描述该函数功能。文档字符串注释可以是单行,也可以是多行,但并不是必须有,主要是供以后调用及其他人调用可以清楚该函数的功能。

2、函数参数:形参与实参

在函数定义中,变量pet_name和animal_type是函数形参(parameter),属于函数完成工作所需要的信息。

在调用函数时,让函数使用的信息放在圆括号内,如下的代码实现调用,'旺旺'就是一个实参,这个实参传递给函数describe_pet(),并把值赋给形参pet_name。

describe_pet('旺旺')

3、传递参数

函数定义中可以包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方法很多,既可以使用位置实参,这要求实参的顺序与形参的顺序必须相同;也可以使用关键字实参,其中每个实参是由变量名(形参)=值(实参)组成;还可以使用列表和字典。

(1)位置实参

使用位置实参,函数调用中的每个实参关联到函数定义中的一个形参。最简单的方式是基于实参的顺序进行关联。以这种方式关联的实参成为位置实参。如下:

describe_pet('花花','猫咪')

实参'花花'被赋值给形参pet_name,实参'猫咪'赋值给形参animal_type.

使用位置实参来调用函数是,实参和形参的顺序必须一致。

(2)关键字参数

关键字实参是传递给函数的名值对。如下:

describe_pet(animal_type='猫咪',pet_name='花花')

使用关键值实参,因将函数中形参名和实参值关联起来,Python知道各个值该赋值给哪个形参,故位置可以不按照顺序。如下代码输入效果和上面是一样的:

describe_pet(pet_name='花花',animal_type='猫咪')

(3)默认值

在编写函数时,可以给每个形参指定默认值。如果在调用函数时给形参提供了实参,Python将使用指定的实参值;否则将使用形参的默认值。因此,给形参指定默认值后,可在函数调用时省略相应的实参。上面函数定义中,对形参animal_type='dog',就是给形参animal_type指定了默认值'dog'。看如下代码:

describe_pet('旺旺')

上面一行代码调用describe_pet()函数,仅传递了一个实参,可以正确执行,输出结果如下:

函数中因给形参animal_type指定了默认值'dog',调用时如果没有对应的实参,Python将自动把animal_type形参赋值默认值'dog'。

注意(1):当使用默认值时,必须在形参列表中先列出没有默认值的形参,再列出有默认值的形参,这让Python依然能够正确地解读位置参数。

注意(2):在给形参指定默认值时,通俗习惯是等号两边不要有空格。但是如果有空格,系统会正常运行。

(4)混合调用:

Python允许使用位置参数、关键字参数和默认值,可以多种形式进行混合调用,上面定义的函数2个参数,一个是位置参数pet_name,一个是关键字参数animal_type。

基于这种混合定义,在任何情况下调用ame提供实参,在指定该实参时,既可以使用位置实参,也可以使用关键字实参。

因为animal_type是关键字实参,指定了默认值'dog',调用函数可以不传递实参,使用默认值。但是要描述的动物不是'dog',就需要传递相应的实参值,同样,既可以使用位置参数如下:

describe_pet('花花','猫咪')

也可以使用关键参数,如下:

describe_pet(pet_name='花花',animal_type='猫咪')

使用关键字实参,顺序可以更改,结果是一样的。

另外,可以混合使用,如下:

describe_pet('花花',animal_type='猫咪')

实参'花花'将赋值给形参pet_name,形参animal_type被赋值为'猫咪'。

请注意:混合调用,位置参数要在前,关键字参数在后,多个位置参数,需要确保顺序,如下位置参数在后,则出现错误:

(5)实参不匹配错误

调用函数,很可能会遇到实参不匹配异常错误。当调用时提供的实参多于或者少于函数定义时的形参数量时,将出现实参不匹配错误。如下:

上面代码调用describe_pet(),没有传递参数,Python会提示出错信息“缺少一个位置参数”,因为定义函数时提供的形参animal_type提供了默认值,所以提示是“缺少一个参数”。

(6)让实参变成可选

有时候,需要让参数变成可选的(额外信息),以便使用函数的人只在必要时才提供。给形参指定默认值就可以做到这一点。

注意:Python中,整数0,空字符串''及None值都等同于布尔值False。

(7)列表作为函数的参数

向函数传递列表比较常用,可能是名字列表、整数列表或更复杂的对象列表,这样可以传递给函数更多的值。如下:

上面代码,向函数传递了一个列表,函数获取列表的值,输入一条个性化的问候语。

(1)将列表传递给函数后,函数中可以修改列表,这让函数可以高效的处理大量数据,但是需要需要清楚和注意的是:在函数中对这个列表所做的任何修改是永久的。

上面函数print_models(),两个形参都是列表,一个是未打印的设计列表,以及一个空列表是完成打印的列表。函数print_models()模拟了打印设计的过程。

运行上面代码,调用函数print_models(),在函数中对列表进行了修改,实参unprinted_designs列表中元素被遍历弹出pop(),执行函数后成为空列表了。

(2)禁止函数修改列表

有时候,需要禁止函数修改列表(传入的实参列表类型变量),为了解决这个问题,可以向函数传递列表的副本而不是原始列表,这样函数体内对传入的实参(列表变量)做任何修改都只影响副本,而不影响原列表。需要如下这样做:

function_name(list_name[:])

上面代码向函数传递原列表的切片,切片是创建了原列表的副本,这样调用函数,函数体内代码对副本做修改,不影响原列表,比如:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/400296.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

年度巨作!《2024全球量子计算产业发展展望》发布

2月20日,《2024量子计算产业发展展望》的中文版报告通过光子盒官方平台发布,英文版报告通过ICV官方平台发布。 英文版报告获取地址: https://www.icvtank.com/newsinfo/897610.html 在过去的一年里,光子盒与您一同见证了全球量子…

useGeneratedKeys=“true” keyProperty=“id”

useGeneratedKeys“true” keyProperty“id” 这个注解在xml文件的insert方法中,可以用于返回主键值; 并且useGeneratedKeys参数只针对 insert 语句生效,默认为 false;

34.仿简道云公式函数实战-数学函数-PRODUCT

1. PRODUCT函数 函数使所有以参数形式给出的数字相乘并返回乘积。 2. 函数用法 PRODUCT(number1, [number2], …) 3. 函数示例 PRODUCT(数量, 单价) 4. 代码实战 首先我们在function包下创建math包,在math包下创建ProductFunction类,代码如下&…

24-k8s的附件组件-Metrics-server组件与hpa资源pod水平伸缩

一、概述 Metrics-Server组件目的:获取集群中pod、节点等负载信息; hpa资源目的:通过metrics-server获取的pod负载信息,自动伸缩创建pod; 参考链接: 资源指标管道 | Kubernetes https://github.com/kuberne…

fastApi笔记03-请求体

请求体是客户端发送给API的数据,fastApi使用 Pydantic 模型来声明请求体 不能使用 GET操作(HTTP 方法)发送请求体。 要发送数据,必须使用下列方法之一:POST(较常见)、PUT、DELETE 或 PATCH 创…

Java 后端面试指南

面试指南 TMD,一个后端为什么要了解那么多的知识,真是服了。啥啥都得了解 MySQL MySQL索引可能在以下几种情况下失效: 不遵循最左匹配原则:在联合索引中,如果没有使用索引的最左前缀,即查询条件中没有包含…

从零开始学习Netty - 学习笔记 - NIO基础 - 文件编程:FileChannel,Path,Files

3.文件编程 3.1.FileChannel FileChannel只能工作在非阻塞模式下面,不能和selector一起使用 获取 不能直接打开FIleChannel,必须通过FileInputSream,或者FileOutputSetream ,或者RandomAccessFile来获取FileChannel 通过FileIn…

2024光伏展

2024年光伏展是一个专业的光伏行业展览会,旨在展示最新的光伏技术和产品,并促进光伏行业的发展和合作。 该展览会预计将吸引来自全球各地的光伏制造商、供应商、投资者和专业人士。参展的公司将有机会展示他们的最新产品和技术,与其他行业领导…

力扣238和169

一:238. 除自身以外数组的乘积 1.1题目 1.2思路 1.3代码 //左右乘表 int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int* answer (int*)malloc(numsSize*sizeof(int));int i 0;int left[numsSize],right[numsSize];left[0] 1;for(i 1;…

04 Aras Innovator二次开发-客户端方法

客户端方法为JS方法。 系统提供了很多触发点,可以嵌入客户端方法,如下: 1 对象类的客户端事件页签: 2 窗体的Form Event和Filed Event 3.关系类的网格事件: 4 属性事件: 5.可自定义Action,触发客户端事件…

剑桥大学强推!一本超硬核的机器学习教材书!(449页中英文pdf下载)

今天给同学们推荐一本专为高级本科生或刚毕业的学生设计的机器学习教材——《理解机器学习:从理论到算法》。 这本教材的内容十分丰富,但没有陷入“科普”式的堆砌材料的写作方式,由于作者是该领域的权威专家,因此在介绍各种理论…

⭐北邮复试刷题LCR 037. 行星碰撞__栈 (力扣119经典题变种挑战)

LCR 037. 行星碰撞 给定一个整数数组 asteroids,表示在同一行的小行星。 对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相…

天锐绿盾 | 文件数据\资料防泄漏软件 \ 自动智能透明加密保护

怎么防止公司办公终端文件数据资料外泄? 防止公司办公终端文件数据资料外泄是非常重要的,以下是一些有效的措施: 限制访问权限:根据员工的职责和需求,设定文件和数据资料的访问权限。确保只有授权人员才能访问敏感信息。 加密存…

JAVA高并发——单例模式和不变模式

文章目录 1、探讨单例模式2、不变模式 由于并行程序设计比串行程序设计复杂得多,因此我强烈建议大家了解一些常见的设计方法。就好像练习武术,一招一式都是要经过学习的。如果自己胡乱打,效果不见得好。前人会总结一些武术套路,对…

Flink理论—容错之状态后端(State Backends)

Flink理论—容错之状态后端(State Backends) Flink 使用流重放和 检查点的组合来实现容错。检查点标记每个输入流中的特定点以及每个运算符的相应状态。通过恢复运算符的状态并从检查点点重放记录,可以从检查点恢复流数据流,同时保持一致性 容错机制不…

Git笔记——1

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 Git安装_centos 创建本地仓库 配置本地仓库 添加文件——场景一 查看.git文件 添加文件——场景二 修改文件 版本回退 总结 前言 世上有两种耀眼的光芒&#…

基于Java (spring-boot)的社区物业管理系统

一、项目介绍 本系统共分为两个角色:管理员和业主。 主要功能有,核心业务处理,基础信息管理,数据统计分析 核心业务处理:车位收费管理,物业收费管理,投诉信息管理,保修信息管理。 …

大数据计算技术秘史(上篇)

在之前的文章《2024 年,一个大数据从业者决定……》《存储技术背后的那些事儿》中,我们粗略地回顾了大数据领域的存储技术。在解决了「数据怎么存」之后,下一步就是解决「数据怎么用」的问题。 其实在大数据技术兴起之前,对于用户…

什么是HTTP代理,socks5代理?它们的区别是什么?

什么是HTTP代理? HTTP代理是一种常见的网络代理方式,它通过在客户端和服务器之间建立一个中间层,将客户端的请求转发给服务器,并将服务器的响应返回给客户端。HTTP代理通常用于访问受限制的网站,或者在网络中隐藏客户…

NestJS入门9:管道入门

前文参考 NestJS入门1:创建项目 NestJS入门2:创建模块 NestJS入门3:不同请求方式前后端写法 NestJS入门4:MySQL typeorm 增删改查 NestJS入门5:加入Swagger NestJS入门6:日志中间件 NestJS入门7&…