版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章函数与模块函数函数的参数类型与应用变量的作用域嵌套调用与递归调用模块05函数函数函数:是组织好的,可重复使用的,用来实现特定功能的代码段。我们使用过的:input()、print()、str()、int()等都是Python的内置函数为什么要学习、使用函数呢?为了得到一个针对特定需求、可供重复利用的代码段提高程序的复用性,减少重复性代码,提高开发效率局部变量变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用)主要分为两类:局部变量和全局变量所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效变量a是定义在’testA’函数内部的变量,在函数外部访问则立即报错.局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量deftestA():
num=100
print(num)testA()print(num)函数的定义函数的定义:函数的调用:函数名(参数)①参数如不需要,可以省略②返回值如不需要,可以省略③函数必须先定义后使用注意事项下面是一个简单的函数声明和调用的示例“defsay_hello()”声明了函数say_hello,它没有参数;冒号“:”表示函数体的开始。缩进的语句print('Hello,world!')是函数体,表示函数的内容。函数名say_hello()后面的括号和冒号不能省略。defsay_hello():print("helloword")say_hello()函数的传入参数传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据有如下代码,完成了2个数字相加的功能:函数的功能非常局限,只能计算1+2。有没有可能实现:每一次使用函数,去计算用户指定的2个数字,而非每次都是1+2呢?可以的,使用函数的传入参数功能,即可实现。defadd():
result=1+2 print(f"{x}+{y}的结果是:{result}")函数的传入参数-传参定义基于函数的定义语法:可以有如下函数定义:实现了,每次计算的是x+y,而非固定的1+2x+y的值,可以在调用函数的时候指定。defadd(x,y): result=x+y print(f"{x}+{y}的结果是:{result}")函数的传入参数-语法解析语法解析:函数定义中,提供的x和y,称之为:形式参数(形参),表示函数声明将要使用2个参数参数之间使用逗号进行分隔函数调用中,提供的5和6,称之为:实际参数(实参),表示函数执行时真正使用的参数值传入的时候,按照顺序传入数据,使用逗号分隔#定义函数defadd(x,y): result=x+y print(f"{x}+{y}的结果是:{result}")#调用函数add(5,6)函数的传入参数传入参数的数量是不受限制的。可以不使用参数也可以仅使用任意N个参数总结1.函数的传入参数的作用是?在函数运行的时候,接受外部传入的数据2.使用方式3.注意事项函数定义中的参数,称之为形式参数函数调用中的参数,称之为实际参数函数的参数数量不限,使用逗号分隔开传入参数的时候,要和形式参数一一对应,逗号隔开defadd(x,y): result=x+y print(f"{x}+{y}的结果是:{result}")什么是返回值程序中的返回值:如图代码定义两数相加的函数功能。完成功能后,会将相加的结果返回给函数调用者所以,变量r接收到了函数的执行结果。综上所述:
所谓“返回值”,就是程序中函数完成事情后,最后给调用者的结果defadd(a,b): result=a+b returnresultr=add(1,2)print(r)返回值的语法语法格式如图:如图,变量就能接收到函数的返回值语法就是:通过return关键字,就能向调用者返回数据返回值的使用举例上面的例子定义了一个名为maximum()的函数,用于比较两个数x和y。当x>y时,通过returnx将较大值x返回;否则返回y。使用print(maximum(2,3))直接输出函数返回的结果。defmaximum(x,y):
ifx>y:
returnx
else:
return
yprint(maximum(2,3))02函数参数类型与应用函数参数种类使用方式上的不同,函数有4中常见参数使用方式:位置参数默认参数关键字参数可变长参数位置参数位置参数:调用函数时根据函数定义的参数位置来传递参数注意:
传递的参数和定义的参数的顺序及个数必须一致defuser_info(name,age,gender):print(f'您的名字是{name},年龄是{age},性别是{gender}')user_info('TOM',20,'男')默认参数默认参数:默认参数也叫缺省参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用).作用:
当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值.注意:
函数调用时,如果为缺省参数传值则修改默认参数值,否则使用这个默认值defsay(message,times=1):print(message*times)say("He11o")say('World',5)关键字参数关键字参数:函数调用时通过“键=值”形式传递参数.作用:
可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求.注意:
函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序deffunc(a,b=5,c=10):print("ais",a,"andbis",b,"andcis",c)func(3,7)func(25,c=24)func(c=50,a=100)不定长参数可变长参数:当调用函数时,如果不确定要传递多少个参数,可以使用不定长参数。这使得函数具有更大的灵活性,能够处理各种数量的输入。作用:
当调用函数时不确定参数个数时,可以使用不定长参数不定长参数的类型:1.位置参数元组:通过一个星号(*)来表示,它接收任意数量的位置参数,并将这些参数存储为一个元组。2.关键字参数字典:通过两个星号(**)来表示,它接收任意数量的关键字参数,并将这些参数存储为一个字典。不定长参数-举例1.位置参数元组:通过一个星号(*)来表示,它接收任意数量的位置参数,并将这些参数存储为一个元组。defexample_function(*args):print(args)#args是一个包含所有位置参数的元组example_function(1,2,3)不定长参数-举例2.关键字参数字典:通过两个星号(**)来表示,它接收任意数量的关键字参数,并将这些参数存储为一个字典。defexample_function(**kwargs):
print(kwargs)#kwargs是一个包含所有关键字参数的字典
example_function(a=1,b=2,c=3)不定长参数注意这两种可变长参数可以同时出现在同一个函数中。函数参数的顺序必须遵循以下规则:(1)首先是普通的位置参数;必须首先传递,且数量和顺序必须与函数定义一致。(2)其次是可变长位置参数(即*args);传递额外的位置参数,这些参数将被收集到一个元组中.(3)最后是关键字参数(即**kwargs);通过“键-值”对的形式传递,这些参数将被收集到一个字典中。defexample_function(a,b,*args,**kwargs):print("普通位置参数:",a,b)print("可变长位置参数:",args)print("关键字参数:",kwargs)#调用函数example_function(1,2,3,4,5,name="Alice",age=30)03变量的作用域全局变量所谓全局变量,指的是在函数体内、外都能生效的变量思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办?答:将这个数据存储在一个全局变量里面#定义全局变量num=100def
testA():
print(num)#访问全局变量def
testB():num=200#定义局部变量
print(num)#访问局部变量testA()#调用testA函数testB()#调用testB函数print(f'全局变量num={num}')#打印全局变量的值局部变量`testB`函数内部的num
=200是定义了一个局部变量思考:`testB`函数需要修改变量全局num的值为200,如何修改程序?#定义全局变量num=100deftestA():print(num)deftestB():
num=200#定义局部变量
print(num)testA()testB()print(f'全局变量num={num}')global关键字☆使用global关键字可以在函数内部声明变量为全局变量,如下所示#定义全局变量num=100deftestA():print(num)#访问全局变量deftestB():globalnum#声明要修改的变量是全局变量
num=200#修改全局变量的值
print(num)#访问全局变量testA()#调用testA函数testB()#调用testB函数print(f'全局变量num={num}')#打印全局变量的值04嵌套调用与递归调用什么是函数的嵌套所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数
执行效果:deffunc_b():
print("---2---")deffunc_a():print("---1---")func_b()
print("---3---")
#调用函数func_afunc_a()func_a()执行过程如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次函数A执行的位置嵌套调用实例max_of_four函数首先调用max函数比较5和2,结果为5,赋值给res1。然后,比较res1(即5)和420,得到420,赋值给res2。最后,比较res2(即420)和299,最终得出最大值420,返回并输出。def
max_of_four(a,b,c,d):
res1=max(a,b)#调用max函数比较a和b
res2=
max(res1,c)#用max函数比牧res1和c
res3=
max(res2,d)#调用max函数比较res2和d
returnres3print(max_of_four(5,2,420,299))函数的递归递归(recursion)是一种直接或者间接调用函数自身的算法,其实质是把问题分解成规模缩小的同类子问题,然后递归调用表示问题的解。能够设计成递归算法的问题必须满足以下两个条件:存在可重复执行的步骤:问题能够被分解为更小规模的同类子问题,并且这些子问题的解决方法与原问题相同。这使得函数可以通过调用自身来处理这些子问题。存在明确的递归出口(basecase):必须有一个或多个条件能够终止递归调用,以防止无限递归。递归出口是问题规模最小、可以直接解决的情况。递归实例通过循环计算n的阶乘通过递归计算n的阶乘虽然递归通常比循环更具可读性,尤其是在表达一些具有自然递归结构的问题时(如阶乘、斐波那契数列等),但在大多数情况下,循环可能会更高效,因为递归调用涉及函数调用栈的操作,这可能会导致性能上的开销。deffactorial(n):result=n
foriin
range(1,n):result*=i
returnresultprint(factorial(5))deffactorial(n):
ifn==1:return1#递归出口
else:
returnn*factorial(n-1)#调用自身print(factorial(5))递归实例deffactorial(n):
ifn==1:
return
1#递归出口
else:
returnn*factorial(n-1)#调用自身print(factorial(5))运行逻辑:当计算factorial(5)时:factorial(5)调用
factorial(4)factorial(4)调用
factorial(3)factorial(3)调用
factorial(2)factorial(2)调用
factorial(1)factorial(1)返回
1递归返回,依次计算:factorial(2)返回
2×1=2factorial(3)返回
3×2=6factorial(4)返回
4×6=24factorial(5)返回
5×24=120最终输出结果为120。05模块模块为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。使用模块最大的好处就是大大提高了代码的可维护性。当一个模块编写完毕,可以被其他地方引用。同时,我们在写程序的时候,也经常引用其他模块。而且,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。(1)模块的导入在C语言中如果要引用sqrt()这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常调用sqrt函数的。在Python中,如果要引用一些内置的函数,需要使用关键字import来引入某个模块。import语句的格式如下:importmodule1[,module2,...moduleN]例如:引用模块math,就需要在文件最开始的地方用importmath来引入。在调用math模块中的函数时,必须这样引用:模块名.函数名。为什么必须加上模块名这样调用呢?因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名。importmathprint(sqrt(4))#这样会报错print(math.sqrt(4))#这样才能正常输出结果,结果为2.0创建和导入模块(1)模块的导入有时候如果需要用到模块中的某个函数,只需要引入该函数即可,此时可以通过from…import语句,其格式如下:frommodnameimportname1[,name2,...nameN]通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function(),在模块B中也有函数function(),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。如果想一次性引入math中所有的东西,还可以通过frommathimport*来实现,但是不建议这么做。只在下面两种情况下建议使用这个方法:①目标模块中的属性非常多,使得反复敲入模块名很不方便。②在交互式解释器中,因为这样可以少敲键盘。创建和导入模块创建和导入模块-两种方式的区别比较项目importmathfrommathimport*命名空间不会污染当前命名空间会将模块中的名称导入到当前命名空间调用方式需要通过`math.函数名`调用直接通过`函数名`调用命名冲突风险低,避免与本地命名冲突高,可能导致与本地或其他模块的命名冲突代码可读性高,明确函数来源稍低,不明确函数来源导入内容导入整个模块导入模块中所有公开名称推荐使用importmath:这种方式更清晰、更安全,能明确地看出函数或变量的来源,避免命名冲突谨慎使用frommathimport*:仅在代码简单且明确不会发生命名冲突时使用,以保持代码的简洁(2)创建模块在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。比如有这样一个文件test.py,在test.py中定义了函数add:defadd(a,b):returna+b这样在其他文件中就可以先importtest,然后通过test.add(a,b)来调用了,比如在test1.py中,有如下代码:importtestprint(test.add(3,4))运行程序输出结果7。当然也可以通过fromtestimportadd来引入。fromtestimportaddprint(add(3,4))创建和导入模块(2)创建模块那么引入模块有什么作用呢?先看一个例子,在文件test.py中的代码:#test.pydefdisplay(): print("helloworld")display()在test1.py中引入模块test:#test1.pyimporttest然后运行test1.py,会输出"helloworld"。也就是说在用import引入模块时,会将引入的模块文件中的代码执行一次。但是注意,只在第一次引入时才会执行模块文件中的代码,因为只在第一次引入时进行加载,这样做很容易理解,不仅可以节约时间还可以节约内存。创建和导入模块(2)创建模块当我们希望模块中的某些代码块仅在模块作为主程序运行时执行,而避免在模块被其他程序引入时执行,可以利用模块的__name__属性。每个模块都有一个__name__属性,当模块被直接运行时,该属性值为'__main__';而当模块被引入到其他程序中时,该属性值为模块名。例如:#!/usr/bin/python3#Filename:test.pyif__name__=='__main__':print('程序自身在运行')else:print('我是被引入')>>>importusing_name我是被引入创建和导入模块包(Packages)是用来组织模块的一个目录。为了让Python把这个目录当做包,目录中的__init__.py文件是必须要有的,这个文件可以直接是一个空文件,但也可以为包执行初始化语句或设置__all__变量。使用语句importPackageA.SubPackageA.ModuleA可以从包中导入单独的模块,使用时必须用全路径名。也可以使用它的变形语句:fromPackageA.SubPackageAimportModuleA,可以直接使用模块
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026孟加拉国纺织印染设备行业市场供求现状研究及行业前景预判
- 2026全球医疗物联网趋势下植入式设备数据安全挑战研究报告
- 2026中国手机支付行业市场格局便捷服务分析研究投资评估规划报告
- 2026中国洗涤行业升级对漂洗化学品需求结构影响报告
- 2026中国医疗健康产业市场深度调研及发展趋势与投资前景预测研究报告
- 2026中国投资咨询行业运营现状供需分析及投资发展规划研究报告
- 2026中国图书零售业市场供需分析及投资评估规划分析研究报告
- 2026中国新材料行业市场发展现状与投资规划研究报告
- 2026农业科技园区发展规划分析与投资决策研究报告
- 2026中国写字楼卫生间小便器使用效率与管理优化报告
- 2026年完整军队文职考试真题解析试卷及答案
- 2026年留疆战士选拔章节练习题及深度解析
- 2026年球星卡行业分析报告及未来发展趋势报告
- 白念珠菌:从形态特征、胞壁多糖结构到免疫学活性的深度剖析
- 2026年临床检验标本采集指南
- 瓦斯隧道安全管理
- 抗滑桩施工风险评估与防控措施
- 幕墙工程监测监控方法
- 母婴保健技术服务考核标准与操作规范手册
- 关于农业防灾减灾工作落实情况的汇报
- 2025年环氧树脂在光伏行业的材料应用报告
评论
0/150
提交评论