零基础学Python:Day9!函数:封装代码,方便复用
昨天我们学习了Python中超级实用的字典数据结构,可以用键值对轻松管理结构化数据,实际开发天天用。老规矩,先公布昨天的作业答案,看看你都做对了没~
📋 昨日作业答案
1. 定义一个字典存储你个人信息,然后分别输出这些信息
示例代码:
# 定义个人信息字典my_info = {"name": "张三","age": 20,"height": 1.80,"hobby": "编程、打篮球"}# 分别输出信息print(f"我叫:{my_info['name']}")print(f"今年:{my_info['age']}岁")print(f"身高:{my_info['height']}米")print(f"爱好:{my_info['hobby']}")
运行结果:
我叫:张三今年:20岁身高:1.8米爱好:编程、打篮球
根据自己的信息填就行,只要格式正确就OK~
2. 添加体重、修改年龄、删除身高
接着上面的字典操作:
# 添加体重my_info["weight"] = 70print("添加体重后:", my_info)# 修改年龄my_info["age"] = 21print("修改年龄后:", my_info)# 删除身高del my_info["height"]print("删除身高后:", my_info)
运行结果:
添加体重后: {'name': '张三', 'age': 20, 'height': 1.8, 'hobby': '编程、打篮球', 'weight': 70}修改年龄后: {'name': '张三', 'age': 21, 'height': 1.8, 'hobby': '编程、打篮球', 'weight': 70}删除身高后: {'name': '张三', 'age': 21, 'hobby': '编程、打篮球', 'weight': 70}
完美,增删改操作都完成了,你做对了吗?
3. 计算所有学生的平均分,找出最高分
给定字典:scores = {"小明":90, "小红":88, "小刚":95, "小丽":92}
代码:
scores = {"小明":90, "小红":88, "小刚":95, "小丽":92}total = 0max_score = -1max_name = ""for name, score in scores.items(): total += score# 如果当前分数比最高分还高,更新最高分if score > max_score: max_score = score max_name = nameavg = total / len(scores)print(f"平均分:{avg:.2f}")print(f"最高分是:{max_name},分数:{max_score}")
运行结果:
平均分:91.25最高分是:小刚,分数:95
计算一下:90+88+95+92 = 365,365÷4=91.25,完全正确。
4. 列表存储三个学生信息,遍历输出总分
示例代码:
students = [ {"name": "小明", "yuwen": 90, "shuxue": 85, "yingyu": 95}, {"name": "小红", "yuwen": 95, "shuxue": 92, "yingyu": 88}, {"name": "小刚", "yuwen": 82, "shuxue": 88, "yingyu": 90}]# 遍历每个学生计算总分for student in students: total = student["yuwen"] + student["shuxue"] + student["yingyu"]print(f"{student['name']}的总分是:{total}")
运行结果:
小明的总分是:270小红的总分是:275小刚的总分是:260
太简单了吧,列表加字典嵌套,处理起来非常顺手,这就是数据结构的威力~
好啦,对完答案,我们开始今天的正题:函数!我们现在写代码都是把所有代码堆在一起,同样的功能如果要用到好几次,就得复制粘贴好几次,改起来还要改好几遍,太麻烦了。有了函数,我们就可以把一段功能封装成一个整体,想用就直接调用,不用重复写代码,改的时候只要改封装好的函数就行,大大提高代码复用性和可维护性,这是编程中非常重要的知识点,赶紧学起来吧~
🤔 什么是函数?为什么需要函数?
简单来说:函数就是把一段实现特定功能的代码封装起来,给它起个名字,需要用的时候直接喊名字就能用,不用重复写代码。
举个最简单的例子:我们经常需要计算两个数的和,如果不用函数,每次算都要写一遍加法:
a = 1 + 2b = 10 + 20c = 100 + 200
如果我们把加法封装成函数,用的时候直接调用就行:
def add(x, y):return x + ya = add(1, 2)b = add(10, 20)c = add(100, 200)
是不是简洁多了?以后我们想改加法逻辑,只要改函数里面就行,所有调用的地方自动生效,不用一个个改。
总结一下函数的好处:
- 方便维护修改:改功能只要改函数内部,不影响外面调用
- 功能拆分:把复杂大功能拆成多个小函数,逻辑清晰,方便开发调试
Python函数定义和调用
Python中定义函数用def关键字,基本语法:
def 函数名(参数1, 参数2, ...):"""函数说明文档,写一下这个函数干嘛的""" 函数体代码(实现功能)return 返回值 # 如果不需要返回值可以不写return
注意几点:
def关键字后面跟函数名,函数名命名规则和变量一样,见名知意,一般用下划线分隔- 参数列表放在括号里,多个参数用逗号分隔,如果不需要参数括号空着就行
return用来把函数的结果返回给调用者,如果不写return,默认返回None
我们来定义一个最简单的函数:打招呼函数:
def say_hello(name):"""打招呼,输入名字输出问候语"""print(f"你好,{name}!欢迎学Python!")
这样我们就定义好了函数,定义完不会自动执行,需要我们调用它才会执行,调用方式很简单:函数名(参数值)
调用上面的打招呼函数:
say_hello("小明")say_hello("小龙虾")
运行结果:
你好,小明!欢迎学Python!你好,小龙虾!欢迎学Python!
完美,我们只写了一遍打招呼逻辑,调用多少次都行,太方便了。
参数和返回值
函数最核心的两个东西就是参数和返回值:
- 参数:调用者给函数传递的数据,让函数可以处理不同的数据
- 返回值:函数处理完之后,把结果返回给调用者,让调用者可以继续用这个结果
形参和实参
- 定义函数时候写的参数叫形参,只是一个占位符,代表这里需要接收一个数据
- 调用函数时候传的具体值叫实参,就是实际传给函数的数据
比如上面的def say_hello(name)中,name是形参,调用say_hello("小明")中,"小明"是实参。
返回值
函数用return返回结果,我们写一个加法函数,返回两个数的和:
def add(x, y):"""计算两个数的和,返回结果""" result = x + yreturn result# 调用函数,把结果保存到sum变量中sum_result = add(10, 20)print(sum_result) # 输出30
非常直观,调用add得到结果30,我们把结果存起来想干嘛就干嘛。如果不需要返回值,比如只打印不结果给外面,就可以不写return。
默认参数
我们定义函数的时候,可以给参数设置默认值,调用的时候如果不传这个参数,就用默认值:
def greet(name, greeting="你好"):print(f"{greeting},{name}")greet("小明") # 不传递greeting,用默认值 → 输出:你好,小明greet("小明", "早上好") # 传了greeting,用传的值 → 输出:早上好,小明
默认参数非常实用,可以简化函数调用,常用的参数默认值帮用户设好,不用每次都传。
不定长参数(*args和**kwargs)
如果我们不知道函数会接收多少个参数,可以用不定长参数:
**kwargs:接收所有多余的关键字参数,打包成字典
举个例子,写一个函数可以计算任意多个数的和:
def add_all(*args): total = 0for num in args: total += numreturn totalprint(add_all(1, 2, 3)) # 输出6print(add_all(10, 20, 30, 40, 50)) # 输出150
太方便了,你传多少个数我都能算,完美适配不同场景。
函数嵌套和作用域
函数里面可以再定义函数,也就是函数嵌套,这个很简单:
def outer():print("我是外层函数")def inner():print("我是内层函数") inner() # 调用内层函数outer()
运行之后会依次输出外层和内层,没问题。
那这里就有一个问题:变量的作用域,也就是变量在哪里可以用,在哪里不能用?
Python中变量分两种:
- 局部变量:定义在函数内部的变量,只有函数内部可以用,外面不能访问
举个例子:
# 全局变量global_num = 100def test():# 局部变量 local_num = 200print(global_num) # 函数内部可以访问全局变量 → 输出100print(local_num) # 输出200test()print(global_num) # 外面可以访问全局变量 → 输出100print(local_num) # 报错!外面不能访问函数内部的局部变量
如果想要在函数内部修改全局变量,需要用global关键字声明一下:
count = 0def add_count():global count count += 1add_count()print(count) # 输出1,修改成功了,如果不加global会报错
🎯 实战小案例
我们写两个实用小案例,巩固一下今天学的函数知识点:
案例1:写一个函数判断是不是闰年
我们之前判断闰年写过代码,现在封装成函数,方便复用:
def is_leap_year(year):"""判断是不是闰年,是返回True,不是返回False"""if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):return Trueelse:return False# 测试一下print(is_leap_year(2024)) # 输出True,是闰年print(is_leap_year(1900)) # 输出False,不是闰年
封装成函数之后,以后我们想判断哪个年份直接调用就行,不用再写一遍判断逻辑了,完美复用。
案例2:写一个函数计算BMI指数,返回体重等级
我们之前写过BMI判断,现在封装成函数:
def calc_bmi(height, weight):""" 计算BMI指数,返回体重等级 height: 身高,单位米 weight: 体重,单位公斤 """ bmi = weight / (height * height)if bmi < 18.5:return "过轻", bmielif bmi < 24:return "正常", bmielif bmi < 28:return "过重", bmielse:return "肥胖", bmi# 测试level, bmi_val = calc_bmi(1.75, 70)print(f"你的BMI指数是{bmi_val:.1f},体重等级:{level}")
运行结果:你的BMI指数是22.9,体重等级:正常,结果正确,以后我们想算BMI直接调用就行。
📝 今日小结
今天我们学习了Python中非常重要的函数,学会了封装复用代码,总结一下核心知识点:
- 定义函数:用
def关键字,语法def 函数名(参数):,缩进写函数体,return返回值 - 参数:形参是占位符,实参是实际传入的值,支持默认参数和不定长参数
*args/**kwargs - 返回值:
return返回结果,不写return默认返回None,可以返回多个值(会自动打包成元组) - 作用域:全局变量在整个文件可用,局部变量只能在函数内部用,函数内部修改全局变量需要
global关键字
函数是代码复用的基础,以后我们写项目都会用到函数,一定要掌握。
🏋️ 今日作业
一定要动手写,练一遍就会了,今天的作业也不难:
1. 写一个函数,接收一个数字n,返回1到n的和
2. 写一个函数,接收三个参数a,b,c,判断能不能组成三角形,返回True/False(规则:任意两边之和大于第三边)
3. 写一个函数,接收一个列表,返回列表中最大的元素
4. 写一个函数,接收一个整数n,打印n行的九九乘法表
好啦,今天我们学会了函数封装代码,明天我们学习Python中非常重要的知识点:模块和包,学会怎么用别人写好的代码,不用重复造轮子,敬请期待~