备考计算机二级Python之Day5

第5章 函数和代码

一、函数的基本使用

函数是一段具有特定功能的、可重用的语句组,通过函数名来表示和调用。

函数的使用包括两部分:函数的定义和函数的使用

1、函数的定义

Python语言通过保留字def定义函数,语法形式如下:

def <函数名>(<参数列表>):<函数体>return <返回值列表>

函数名可以是任何有效的Python标识符,参数列表是调用该函数时传递给它的值,可以有零个、一个或多个,当传递多个参数由逗号分隔,当没有参数时也要保留圆括号。参数列表中的参数是形式参数,简称“形参” ,相当与实际参数的一种符号表示或符号占位符。

函数体是函数每次被调用时被执行的代码,由一行或多行语句组成。如果需要返回值,使用保留字return和返回值列表。函数可以没有return语句,函数体结束后会将控制权返回给调用者

例如,定义一个整数n的阶乘计算函数,代码如下:

def fact(n):s=1for i in range(1,n+1):s*=ireturn s

提示:无return函数

当函数没有return时,仅表示执行一段代码功能。

2、函数的使用

函数的定义也叫函数“声明”,定义后的函数不能直接运行,需要经过“调用”才能得到运行。

调用函数的基本方法如下:

<函数名>(<实际赋值参数列表>)

例如。定义一个整数n的阶乘计算函数,同时对其进行调用,代码如下。

#定义一个对整数n求阶乘的函数
def fact(n):s=1for i in range(1,n+1):s*=ireturn s
#调用整数阶乘函数
print(fact(100))
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

每次调用函数可以提供不同参数作为输入,以实现对不同数据的处理;

函数执行后,可以反馈相应的处理结果。函数的执行与黑盒类似,使用者不需要了解函数内部实现原理,只要了解函数的输入输出方式即可。

具体来说,函数的使用一共分为4个步骤。

(1)函数定义

使用def保留字将一段代码定义为函数,需要确定函数名、参数名、参数的个数,使用参数名称作为形式参数(占位符)编写函数内部的功能代码。

(2)函数调用

通过函数名调用函数功能,对函数的各个参数赋予实际值,实际值可以是实际数据,也可以是在调用函数前已经定义过的变量。

(3)函数执行

函数被调用后,使用实际参数(赋予形式参数的实际值)参与函数内部代码的运行,如果有结果则进行输出。

(4)函数返回

函数执行结束后,根据return保留字的指示决定是否返回结果,如果返回结果,则结果将被放置到函数被调用的位置,函数使用完毕,程序继续运行。

编程中大量使用函数已经成为一种编程范式,叫作函数式编程。

在Python中,函数也是有类型的,可以通过type()获得函数类型。函数采用其定义的名字表达,具体为function类型,这是一种Python的内置类型。然而,如果调用函数,则类型为返回值的类型。

def f(x):return x+1type(f)
<class 'function'>type(f(1))
<class 'int'>

上述代码,函数f()是function类型,但其调用f(1)的类型是被调用函数返回值的类型,因为

f(1)返回数字为2,为整数类型,所以f(1)的类型是整数。

Python语言最小函数可以不表达任何功能,如下:

def f():pass

其中,保留字pass表示不进行任何操作,起到占位作用,因为函数体内部总要编写一行代码,pass用来表示这种占位。对f()的调用不实现任何功能。

二、函数的参数传递

1、可选参数传递

函数的参数在定义时可以指定默认值,当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代。带有可选参数的函数定义语法形式如下:

def <函数名>(<非可选参数列表>,<可选参数>=<默认值>):<函数体>return <返回值列表>

以两个数的乘法计算函数为例,设y为可选参数,示例如下。

def multiply(x,y=10):print(x*y)multiply(99)
990multiply(99,2)
198

需要注意,可选参数一般放置在非可选参数的后面,即定义函数时,先给出所有非可选参数,然后再分别列出每个可选参数及对应的默认值。

2、参数名称传递

函数调用时,默认采用按照位置顺序的方式传递给函数,例如multiply(99,2)中第一个实参默认赋值给形参x,第二个实参赋值给形参y。

Python语言同时支持函数按照参数名称方式传递参数,语法形式如下:

<函数名>(<参数名>=<实际值>)

以两个数的乘法计算函数为例,观察multiply()函数的调用方式,示例如下。

def multiply(x,y=10):print(x*y)multiply(x=99)
990multiply(y=2,x=99)
198

采用参数名称传递方式不需要保持参数传递的顺序,参数之间的顺序可以任意调整,只需要对每个必要参数赋予实际值即可,这种方式会显著增强程序的可读性。

3、函数的返回值

return语句用来结束函数并将程序返回到函数被调用的位置继续执行。return语句可以出现在函数中任何部分,同时可以将0个、1个或多个函数运算的结果返回给函数被调用处的变量。

以两个数的乘法计算函数为例,观察multiply()函数的返回值,示例如下。

def multiply(x,y=10):return x*y
s=multiply(99,2)
print(s)198

提示:多个返回值

当return返回多个值时,这些值形成了一个元组数据类型,由小括号和逗号分隔,例如(a,b,c)。

元组是Python内置的一种组合数据类型。

以两个数的乘法计算函数为例,观察multiply()函数返回多个值的情况,示例如下。

def multiply(x,y=10):return x*y,x+ys=multiply(99,2)
print(s)(198, 101)a,b=multiply(99,2)
print(a)198print(b)101

当函数存在多种结束条件时,将使用多个return语句,例如:

def manyret(x):try:if x>0:return x+1else:return x-1except:return 0

在manyret()函数中由于存在try-except异常判断及if-else分支语句,该函数有3个出口,每个出口都有return语句,因此共有3个返回return语句。

三、变量的作用域

根据程序中变量所在的位置和作用范围,变量分为局部变量和全局变量。局部变量仅在函数内部使用,且作用域也在函数内部。全局变量可以跨越函数使用,作用域覆盖整个程序。

1、局部变量

局部变量是指函数内部定义并使用的变量,仅在函数内部有效,当函数退出时变量将不再存在。

以两个数的乘法计算函数为例,multiply()函数内部定义的变量z是局部变量,代码如下:

def multiply(x,y=10):z=x*y #z是函数内部的局部变量return zs=multiply(99,2)
print(s)
198
print(z)
Traceback (most recent call last):File "<pyshell#45>", line 1, in <module>print(z)
NameError: name 'z' is not defined

当multiply()函数调用后,变量z将不存在,因此再使用这个变量会报错。

2、全局变量

全局变量指在函数之外定义的变量,在程序执行全过程有效。全局变量在函数内部使用时,需要提前使用保留字global声明,语法形式如下:

global<全局变量>

以两个数的乘法计算函数为例,观察multiply()函数中变量n及对变量n的声明,代码如下。

n=2 #n是全局变量
def multiply(x,y=10):global nreturn x*y*n #使用全局变量ns=multiply(99,2)
print(s)
396

提示:全局变量声明

使用global对全局变量进行声明时,该变量要与外部全局变量同名。

上例中,变量n是全局变量,在函数multiply()中使用时需要在函数内部使用global声明,声明后即可使用。如果未使用保留字global声明,即使名称相同,也不是全局变量,对比代码如下。

n=2 #n是全局变量
def multiply(x,y=10):n=x*yreturn n #此处的n不是全局变量s=multiply(99,2)
print(s)
198
print(n)
2

尽管multiply()中使用了变量n,但由于没有用global保留字声明,该变量仍然是局部变量。使用global保留字声明后,外部定义变量的作用域才能进入函数内部,这种声明不能省略。

四、代码复用

函数是程序的一种基本抽象方式,它将一系列代码组织起来通过命名供其他程序使用。函数封装的直接好处是代码复用,任何其他代码只要输入参数即可调用函数,从而避免相同功能代码在调用处重复编写。代码复用有另一个好处,当更新函数功能时,所有被调用处的功能都被更新。

程序由一系列代码组成,如果代码是顺序但无组织,不仅不利于阅读和理解,也很难进行升级和维护。当程序长度在百行以上,如果不划分模块,程序的可读性就已经很糟糕了。解决这一问题最好的方法是将一个程序分割成短小的程序段,每一段程序完成一个小的且特定的功能。利用函数将程序合理划分为多个功能模块,并基于模块设计程序是一种常用的程序设计方法,被称为“模块化设计”。

模块化设计指通过函数的封装功能将程序划分成主程序、子程序和子程序间关系的表达。模块化设计是使用函数设计程序的思考方法,以功能块为基本单位,一般有两个基本要求:

·紧耦合:尽可能合理划分功能块,功能块内部耦合紧密

·松耦合:模块间关系尽可能简单,功能块之间耦合度低

耦合性指程序结构中各模块之间相互关联的程度,它取决于各模块间接口的复杂程度和调用方式。耦合性是影响软件复杂程度和设计质量的一个重要因素。紧耦合指模块或系统间关系紧密,存在较多或复杂的相互调用。紧耦合的缺点在于更新一个模块可能导致其他模块变化,复用较困难。松耦合一般基于消息或协议实现,系统间交互简单。

提示:模块化

松耦合代表了模块化,从系统观念来看,松耦合是总体设计原则。

利用函数只是模块化设计的必要非充分条件,根据计算需求合理划分函数十分重要。一般来说,完成特定功能或经常复用的一组语句应该采用函数来封装,并尽可能减少函数间参数和返回值的数量。

五、函数递归

1、递归定义

函数是一种代码封装,能够被其他程序调用,当然,也可以被函数自身的内部代码调用。这种函数定义中调用函数自身的方式称为递归。

数学上一个经典的递归例子叫阶乘,其中,n的阶乘与n-1的阶乘有关,体现了递归关系。递归不是循环,因为每次递归都会计算比它更小数的阶乘,直到0!。0!是已知的值,被称为递归的基例。当递归到底了,就需要一个能直接算出值的表达式。

递归的两个关键特征

(1)递归基例:存在一个或多个基例,不需要再次递归,它是确定的表达式。

(2)递归链条:所有递归都有一个链条,表现为函数功能的不同值调用。

2、递归构建

以阶乘计算为例,可以把阶乘定义为一个单独的函数fact(n),表示n!.如下代码给出阶乘计算的代码实现。

def fact(n):if n==0:return 1else:return n*fact(n-1)
num=eval(input("请输入一个整数:"))
print(fact(abs(int(num))))

如第五行所示,fact()函数在其定义内部引用了自身,这就形成了递归过程。fact()函数通过if语句给出了n为0时的基例,当n==0,fact()函数不再递归,返回数值为1,如果n!=0,则通过递归返回n与n-1阶乘的乘积。

由于负数和小数通过减一无法到达递归基例(n==0),代码第七行通过abs()和int()函数将用户的输入转变为非负整数,该程序输出效果如下:

请输入一个整数:23
25852016738884976640000请输入一个整数:-12
479001600

每次函数调用时,函数参数的副本会临时储存,递归中各函数再运算自己的参数,相互没有影响。当基例结束运算并返回值时,各函数逐层结束运算,向调用者返回计算结果。

递归可以解决很多计算问题。以字符串反转为例,对于用户输入的字符串s,输出反转后的字符串。基本思想是把字符串看作一个递归对象,长字符串由较短字符串组成,每个短字符串也是是一个对象。假如把一个字符串看成仅由两部分组成:首字符和剩余字符串。如果将剩余字符串与首字符交换,就完成了反转整个字符串,代码如下:

def reverse(s):if s=="":return selse:return reverse(s[1:])+s[0]
str=input("请输入一个字符串:")
print(reverse(str))

观察这个函数的工作过程。s[0]是首字符,s[1:]是剩余字符串,将它们反向连接,可以得到反转字符串。执行这个程序,结果如下:

请输入一个字符串:日照香炉生紫烟
烟紫生炉香照日

3、递归计算方法

递归是一种计算方法,如同数学归纳法。

证明一个与自然数相关的命题P(n)时,数学归纳法采用如下步骤。

(1)证明当n取第一个值n_{_{0}}时命题成立.

(2)假设当n_{k}时命题成立,证明当n=n_{k}+1时命题也成立。

综合(1)和(2),对一切自然数n(n>=n_{_{0}}),命题P(n)都成立。

递归和数学归纳法都利用了递归原理,本质相同。它们都由链条和基例构成,表达计算问题的解决路线,递归计算方式具体使用函数、分支等语法表达问题,进而利用计算机解决问题。需要注意,递归计算不需要直接给出求解公式,仅需要利用计算机程序表达问题即可,递归会利用计算机的强大算力展开链条,逐次计算得到结果。

六、过程式与函数式编程

编程方法是如何思考、设计、编写程序的方法,与编程语言的语法一样重要。介绍过程式编程和函数式编程两个方法。

过程式编程是一种以计算过程或运算流程为中心的编程方法,也是一种十分自然、符合人类思维方式的编程方法。面对一个计算任务,最直接的描述方式是按照操作流程或步骤进行分解,并编写代码逐步实现流程或步骤所要求的计算功能。过程式编程采用这种方式,以划分计算步骤为主要方法,组织程序代码。

Python语言通过编程语言支持过程式编程。一般来说,采用顺序、分支、循环等逻辑就可以完整描述计算过程。例如,将百分制成绩转化为五分制成绩,代码如下:

#将百分制成绩转换为五分制成绩
score=eval(input("请输入一个百分制成绩:"))
if score>=90.0:grade="A"
elif score>=80.0:grade="B"
elif score>=70.0:grade="C"
elif score>=60.0:grade="D"
else:grade="E"
print("对应的五分制成绩是:{}".format(grade))

过程式编程主要关注流程描述。用函数获取用户输入成绩,用分支判断成绩并进行相应转换,最后打印输出。只要将计算步骤梳理清楚,按照步骤编写程序即可。

函数式编程方法是过程式编程的一种演进,亦称模块化编程。函数式编程的主要思想是把程序过程尽量写成一系列函数调用,这能够使代码编写更简洁、更易于理解。函数式编程是软件项目中最常见的编程方式,也是代码复用的主要方式。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot教程(二十四) | SpringBoot集成AOP实现日志记录

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot集成AOP实现日志记录 &#xff08;一&#xff09;AOP 概要1. 什么是 AOP &#xff1f;2. 为什么要用 AOP&#xff1f;3. AOP一般用来干什么&#xff1f;4. AOP 的核心概念 &#xff08;二&#xff09;Spring AOP1. 简…

CSS3页面布局-三栏-中栏流动布局

三栏-中栏流动布局 用负外边距实现 实现三栏布局且中栏内容区不固定的核心问题就是处理右栏的定位&#xff0c; 并在中栏内容区大小改变时控制右栏与布局的关系。 控制两个外包装容器的外边距&#xff0c;一个包围三栏&#xff0c;一个包围左栏和中栏。 <!DOCTYPE html&…

vllm 部署GLM4模型进行 Zero-Shot 文本分类实验,让大模型给出分类原因,准确率可提高6%

文章目录 简介数据集实验设置数据集转换模型推理评估 简介 本文记录了使用 vllm 部署 GLM4-9B-Chat 模型进行 Zero-Shot 文本分类的实验过程与结果。通过对 AG_News 数据集的测试&#xff0c;研究发现大模型在直接进行分类时的准确率为 77%。然而&#xff0c;让模型给出分类原…

【软件测试面试题】WEB功能测试(持续更新)

Hi&#xff0c;大家好&#xff0c;我是小码哥。最近很多朋友都在说今年的互联网行情不好&#xff0c;面试很难&#xff0c;不知道怎么复习&#xff0c;我最近总结了一份在软件测试面试中比较常见的WEB功能测试面试面试题合集&#xff0c;希望对大家有帮助。 建议点赞收藏再阅读…

AI学习记录 - 怎么理解 torch 的 nn.Conv2d

有用就点个赞 怎么理解 nn.Conv2d 参数 conv_layer nn.Conv2d(in_channels1, out_channels 10 // 2, kernel_size3, stride2, padding0, biasFalse) in_channels in_channels 可以设置成1&#xff0c;2&#xff0c;3&#xff0c;4等等都可以&#xff0c;一般来说做图像识别…

微服务案例搭建

目录 一、案例搭建 1.数据库表 2.服务模块 二、具体代码实现如下&#xff1a; (1) 首先是大体框架为&#xff1a; &#xff08;2&#xff09;父模块中的pom文件配置 &#xff08;3&#xff09;shop_common模块&#xff0c;这个模块里面只需要配置pom.xml&#xff0c;与实体…

MySQL如何判断一个字段里面是否包含汉字

SQL查询中&#xff0c;length() 和 char_length() 都是用来获取字符串长度的函数 在单字节字符集下&#xff08;如ASCII&#xff09;&#xff1a;每个字符通常占用1个字节&#xff0c;因此length()和char_length()在这类字符集中给出的结果是一样 在多字节字符集下&#xff0…

matplotlib绘制子图以及局部放大效果

需求&#xff1a;绘制1*2的子图&#xff0c;子图1显示两个三角函数&#xff0c;子图2显示三个对数函数&#xff0c;子图2中对指定的区域进行放大。 绘图细节&#xff1a; 每个子图中每个函数的数据存放到一个列表中&#xff0c;然后将每个子图的数据统一存到一个列表中&#…

Go 使用Redis安装、实例和基本操作

Go使用Redis&#xff1a;详解go-redis/v9库 引言 Redis作为一个高性能的键值对数据库&#xff0c;广泛应用于缓存、消息队列、实时数据分析等场景。在Go语言中&#xff0c;go-redis/v9库提供了丰富的接口和高效的数据交互能力&#xff0c;使得在Go项目中集成Redis变得简单而高…

接口限流经典算法

文章目录 限流基于计数器的限流基于滑动窗口的限流桶漏斗算法令牌桶算法 限流 为了保证系统的安全性和稳定性&#xff0c;防止恶意流量和突发大量流量短时间内大量请求接口&#xff0c;造成服务器崩溃&#xff0c;接口的限流是有必要的。 以下是四种经典的限流算法。 基于计数…

Python测试框架Pytest的使用

pytest基础功能 pytset功能及使用示例1.assert断言2.参数化3.运行参数4.生成测试报告5.获取帮助6.控制用例的执行7.多进程运行用例8.通过标记表达式执行用例9.重新运行失败的用例10.setup和teardown函数 pytset功能及使用示例 1.assert断言 借助python的运算符号和关键字实现不…

UE5打包iOS运行查看Crash日志

1、查看Crash 1、通过xCode打开设备 2、选择APP打开最近的日志 3、选择崩溃时间点对应的日志 4、选择对应的工程打开 5、就能看到对应的Crash日志 2、为了防止Crash写代码需要注意 1、UObject在RemoveFromRoot之前先判断是否Root if (SelectedImage && Selecte…

Frog4Shell — FritzFrog 僵尸网络将一日攻击纳入其武器库

FritzFrog 的背景 Akamai 通过我们的全球传感器网络持续监控威胁,包括我们之前发现的威胁。其中包括FritzFrog 僵尸网络(最初于 2020 年发现),这是一个基于 Golang 的复杂点对点僵尸网络,经过编译可同时支持基于 AMD 和 ARM 的机器。该恶意软件得到积极维护,多年来通过增…

百日筑基第六十天-学习一下Tomcat

百日筑基第六十天-学习一下Tomcat 一、Tomcat 顶层架构 Tomcat 中最顶层的容器是 Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个 Server可以包含至少一个 Service&#xff0c;用于具体提供服务。Service 主要包含两个部分&#xff1a;Conn…

AI周报(8.18-8.24)

AI应用-XGO-Rider: 全球首款轮腿式桌面 AI 机器人 中国的 Luwu 智能打造的XGO-Rider 是全球首款轮腿式桌面 AI 机器人。这个小巧紧凑的机器人将轮式机器人的灵活性与腿式机器人的障碍处理能力相结合&#xff0c;可以全方位移动&#xff0c;轻松适应各种地形。 XGO-Rider 主要设…

服务商模式实现JSAPI小程序微信支付(javaphp)

官方文档 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter2_1.shtml 使用wechatpay-php实现JSAPI支付&#xff08;服务商和普通商户&#xff09;文章浏览阅读1.3k次&#xff0c;点赞3次&#xff0c;收藏7次。之前我使用的sdk是“wechatpay-guzzle-middle…

python实用教程(二):安装配置Pycharm及使用(Win10)

上一篇&#xff1a;python实用教程&#xff08;一&#xff09;&#xff1a;安装配置anaconda&#xff08;Win10&#xff09;-CSDN博客 1、简介及下载 PyCharm是一款功能强大的 Python 编辑器&#xff0c;具有跨平台性。是Jetbrains家族中的一个明星产品。 下载地址&#xff…

redis实战——go-redis的使用与redis基础数据类型的使用场景(二)

一.go-redis操作hash 常用命令&#xff1a; redisClient.HSet("map", "name", "jack") // 批量设置 redisClient.HMSet("map", map[string]interface{}{"a": "b", "c": "d", "e"…

计算机毕业设计选题推荐-游戏比赛网上售票系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

棚子影院CMS程序PHP源码

01, 棚子影视是我现在最常用的一个看视频的网站&#xff0c;支持观看电影、国漫&#xff01;动漫&#xff0c;电视剧、综艺、记录片、香港剧等等。同时棚子影视支持手机&#xff0c;PC端在线观看&#xff0c;不用下载任何播放器&#xff0c;直接电脑或者手机打开网址就可以在线…