全栈python之路——用函数实现模块化程序设计

    xiaoxiao2025-06-04  26

    把实现某一个功能的代码定义为一个函数,在需要使用时,随即调用即可。 简单理解就是可以完成某项 工作的代码块,类似于积木块,可以反复地使用

    一、函数的创建和调用

    创建一个函数

    创建函数其实就是定义一个函数: 语法格式如下

    def functionname([parameterlist]) ['''comments'''] [functionbody]

    参数说明: functionname : 函数名称,在调用函数时使用 parameterlist :可选参数,用于指定向函数中传递参数。参数之间用逗号分割 ,不指定表示没有参数 ‘’‘comments’’’:可选参数,表示为函数指定注释,注释的内容通常是说明该函数的功能 functionbody:可选参数,用于指定函数体功能代码。如果函数有返回值,可以使用return语句调用 注意:如果定义一个什么也不做的空函数,可以使用pass语句作为占位符

    比如创建一个根据体重和身高计算BMI的函数fun_bmi(),该函数包含三个参数,分别用于指定姓名,身高和体重,再根据公式:BMI=体重/(身高*身高)

    # -*- coding: utf-8 -*- # @Time : 2019/5/26 19:15 # @Author : Xieqc # @Email : xieqc@tedu.cn # @File : 定义函数BMI.py # @Software: PyCharm def fun_bmi(person,height,weight): '''功能:根据身高和体重计算BMI指数 :param person: 姓名 :param height: 身高,单位:米 :param weight: 体重,单位:千克 ''' print(person + '的身高' + str(height) + "米 \t 体重:" + str(weight) + "千克") bmi = weight/(height*height) print(person + "的BMI指数为:" + str(bmi)) if bmi<18.5: print('tai qing le') if bmi>=18.5 and bmi<24.9: print('zhengchang') if bmi>=24.9 and bmi<29.9: print('guozhong') if bmi>=29.9: print('pangzi')

    运行上面的代码,将不会显示任何内容,也不会抛出异常,因为fun_bmi()函数还没有调用。

    调用函数

    调用上诉函数:

    fun_bmi('匿名',1.75,75)

    显示如下结果:

    匿名的身高1.75米 体重:75千克 匿名的BMI指数为:24.489795918367346 zhengchang

    pass语句

    def func(): pass

    写个pass先占着,以后再写。

    二、参数传递

    什么是形式参数和实际参数

    形式参数就是你定义函数时写的参数,相当于 变量名 实际参数就是你调用函数时写的参数,相当于给变量赋的值

    值传递和引用传递又是什么鬼? 值传递:实参为不可变对象,传递后,实参值不变 引用传递:实参为可变对象,传递后,实参值也一同改变

    # 定义函数 def demo(obj): print("原值:",obj) obj += obj #调用函数 print("=========值传递========") mot = "唯有在被追赶的时候,你才能真正地奔跑。" print("函数调用前:",mot) demo(mot) #采用不可变对象——字符串 print("函数调用后:",mot) print("=========引用传递 ========") list1 = ['邓肯','吉诺比利','帕克'] print("函数调用前:",list1) demo(list1) #采用可变对象——列表 print("函数调用后:",list1)

    函数执行后:

    =========值传递======== 函数调用前: 唯有在被追赶的时候,你才能真正地奔跑。 原值: 唯有在被追赶的时候,你才能真正地奔跑。 函数调用后: 唯有在被追赶的时候,你才能真正地奔跑。 =========引用传递 ======== 函数调用前: ['邓肯', '吉诺比利', '帕克'] 原值: ['邓肯', '吉诺比利', '帕克'] 函数调用后: ['邓肯', '吉诺比利', '帕克', '邓肯', '吉诺比利', '帕克']

    位置参数

    数量必须与定义的参数保持一致,否则会报以下错误: Traceback (most recent call last): File "D:/01study/02python/python代码存放/日常练习代码存放/定义函数BMI.py", line 24, in <module> fun_bmi('匿名',1.75) TypeError: fun_bmi() missing 1 required positional argument: 'weight' 位置必须 与定义时保持一致

    关键字参数:

    调用时如果想位置不一致怎么办:

    fun_bmi(height=1.83,weight=75,person='路人甲')

    为参数设置默认值

    在定义函数时,可以指定默认参数,需要注意的是,默认参数写在所有参数的最后,否则会产生语法错误。 使用函数“函数名.defaults” 查看函数的默认值参数的当前值。

    使用可变对象作为函数参数的默认值时,多次调用,会导致意料之外的情况: def demo(obj=[]): # 定义函数并为参数obj指定默认值 print("obj的值:",obj) obj.append(1) demo() demo()

    连续调用两次,会产生如下效果:

    obj的值: [] obj的值: [1]

    为了防止出现这种情况,最好使用None作为对象的默认值

    def demo(obj=None): if obj==None: obj = [] print("obj的值:",obj) obj.append(1) demo() demo()

    结果如下:

    obj的值: [ ] obj的值: [ ] 定义函数时,为形参设置默认值,必须指向不可变对象

    可变参数

    两种形式,一种形参前面有一个*号,接收参数后放到元祖中 一种有两个**星号,接收参数后放到字典中。 1.*parameter 表示接收任意多个实际参数并将其放到一个元组中:

    def printplayer(*name): # 定义输出我喜欢的NBA球员的函数 print('\n我喜欢的NBA球员有:') for item in name: print(item) # 输出球员名称 printplayer('邓肯') printplayer('邓肯', '乔丹', '吉诺比利', '帕克') printplayer('邓肯', '大卫罗宾逊', '卡特', '鲍文')

    调用上面三次函数,结果如下:

    我喜欢的NBA球员有: 邓肯 我喜欢的NBA球员有: 邓肯 乔丹 吉诺比利 帕克 我喜欢的NBA球员有: 邓肯 大卫罗宾逊 卡特 鲍文

    如果想要使用已经存在的列表作为函数的可变参数,在列表名前加*号

    parm = ['邓肯','吉诺比利','帕克'] printplayer(*parm)

    2.**parameter 接收任意多个显式赋值的参数,并将其放到一个字典中。

    def printsign(**sign): # 定义输出姓名和绰号的函数 print() # 输出一个空行 for key, value in sign.items(): # 遍历字典 print("[" + key + "] 的绰号是:" + value) # 输出组合后的信息 printsign(邓肯='石佛', 罗宾逊='海军上将') printsign(吉诺比利='妖刀', 帕克='跑车', 鲍文='鲍三叔')

    运行结果如下:

    [邓肯] 的绰号是:石佛 [罗宾逊] 的绰号是:海军上将 [帕克] 的绰号是:跑车 [吉诺比利] 的绰号是:妖刀 [鲍文] 的绰号是:鲍三叔

    变量的作用域

    局部变量和全局变量 局部变量:在函数内部有用 全局变量: 1.如果一个变量在函数外调用,name不仅可以在函数外可以访问到,在函数内也可以访问到

    message = '唯有在被追赶的时候,你才能真正地奔跑。' # 全局变量 def f_demo(): print('函数体内:全局变量message =',message) # 在函数体内输出全局变量的值 f_demo() # 调用函数 print('函数体外:全局变量message =',message) # 在函数体外输出全局变量的值

    运行结果如下:

    函数体内:全局变量message = 唯有在被追赶的时候,你才能真正地奔跑。 函数体外:全局变量message = 唯有在被追赶的时候,你才能真正地奔跑。 局部变量和全局变量重名时,不影响函数外的变量。

    2.使用global 关键字进行修饰,也可以变为全局变量

    message = '唯有在被追赶的时候,你才能真正地奔跑。' # 全局变量 print('函数体外:message =',message) # 在函数体外输出全局变量的值 def f_demo(): message = '命运给予我们的不是失望之酒,而是机会之杯。' # 局部变量 print('函数体内:message =',message) # 在函数体内输出局部变量的值 f_demo() # 调用函数 print('函数体外:message =',message) # 在函数体外输出全局变量的值

    运行结果如下:

    函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。 函数体内:message = 命运给予我们的不是失望之酒,而是机会之杯。 函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。

    上诉结果可以看出,内部定义的变量没有变为全局变量,可以使用global关键字

    message = '唯有在被追赶的时候,你才能真正地奔跑。' # 全局变量 print('函数体外:message =',message) # 在函数体外输出全局变量的值 def f_demo(): global message # 将message声明为全局变量 message = '命运给予我们的不是失望之酒,而是机会之杯。' # 全局变量 print('函数体内:message =',message) # 在函数体内输出全局变量的值 f_demo() # 调用函数 print('函数体外:message =',message) # 在函数体外输出全局变量的值

    运行结果如下:

    函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。 函数体内:message = 命运给予我们的不是失望之酒,而是机会之杯。 函数体外:message = 命运给予我们的不是失望之酒,而是机会之杯。 虽然内部和外部变量可以重名,但是不建议这样做。

    匿名函数

    没有名字的函数,只是用一次,没什么用。。。

    import math # 导入math模块 def circlearea(r): # 计算圆面积的函数 result = math.pi*r*r # 计算圆面积 return result # 返回圆的面积 r = 10 # 半径 print('半径为',r,'的圆面积为:',circlearea(r)) 半径为 10 的圆面积为: 314.1592653589793 import math # 导入math模块 r = 10 # 半径 result = lambda r:math.pi*r*r # 计算圆的面积的lambda表达式 print('半径为',r,'的圆面积为:',result(r)) 在使用lambda表达式时,需要定义一个变量,用于调用lambda,否则会报错上诉两个函数都没有名字,当你不会起名的时候会用得到

    常用python内置函数:

    最新回复(0)