Python-核心语法-函数
函数基础
函数定义
函数是组织好的、可重复使用的,用来实现特定功能的代码片段
函数的定义与调用
# 定义函数
def 函数名(参数列表):
函数体
......
return 返回值
# 调用函数
函数名(参数)# 定义一个最简单的函数:打招呼
def say_hello():
print("你好!")
print("欢迎来到 Python 世界!")
say_hello() # 输出:你好! 和 欢迎来到 Python 世界!
say_hello() # 可以反复调用- 函数必须先定义,在调用
- 函数定义时,并不会执行。只有在调用函数时。函数体的逻辑才会执行
- 函数中通过缩进来描述归属关系
函数的参数与返回值
在定义函数时,根据业务需要,可以指定函数与返回值,具体格式如下:
# 定义函数
def 函数名(参数列表):
函数体
......
return 返回值
# 调用函数
函数名(参数)def greet(name):
print(f"嗨,{name}!")
msg = greet("小明") # 打印:嗨,小明!
print(msg) # 输出:None,因为函数没有 return 东西出来- 参数:写在圆括号里,相当于榨汁机的水果入口,是函数的输入。
- 返回值:用
return把结果“扔”出来,可以存到一个变量里继续使用。如果没有return,函数默认返回None(空)。
# 有参数、有返回值的函数:两数相加
def add(a, b):
result = a + b
return result
# 调用时,传入实际的值(实参)
sum1 = add(3, 5) # sum1 得到 8
sum2 = add(10, 20) # sum2 得到 30
print(sum1, sum2) # 输出:8 30a和b是形参(占位置的),等着接收真正的数据。3和5是实参,调用时给进去的真实值。return就是这台机器的“出货口”。一旦执行到return,函数立刻结束,并把值送出去。
扩展
函数可以有多个返回值
def circle_area_len(r):
return 3.14 * r * r, 2 * 3.14 * r
al = circle_area_len(10) #封装到元祖中
print(al)
area, len = circle_area_len(10)#元祖解包
print(area,len)函数说明文档
函数的说明文档(Docstring)是写在函数开头,用三个引号包裹的字符,用于解释函数的功能、参数、返回值等信息,方便调用者清楚函数的具体作用及细节
def multiply(x, y):
"""
返回两个数字的乘积。
参数:
x -- 第一个乘数
y -- 第二个乘数
返回值:
两个数的乘积累
"""
return x * y你可以用内置函数 help() 来查看这份说明书:
help(multiply)运行后会打印出你在 """ """ 里写的所有内容。
养成写文档的好习惯,会让你的代码更专业。
函数的嵌套调用

练习
🤔定义一个函数,根据传入的分数,计算对应的分数等级并返回。
分数 >= 90:A
分数 >= 75:B
分数 >= 60:C
分数 < 60:D
def get_grade(score):
if score >= 90:
return "A"
elif score >= 75:
return "B"
elif score >= 60:
return "C"
else:
return "D"
print(get_grade(93))
print(get_grade(80))
print(get_grade(65))
print(get_grade(40))🤔定义一个函数:完成时间转换功能,将传入的秒转换为小时、分钟、秒。
# 定义一个函数:完成时间转换功能,将传入的秒转换为小时、分钟、秒。
def time_convert(seconds):
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = (seconds % 3600) % 60
return f"{seconds} 转换为 {hours} 小时 {minutes} 分钟 {seconds} 秒"
print(time_convert(3772))函数进阶
函数变量的作用域
作用域决定了变量在程序的作用范围(标识这个变量在哪里可以使用,在哪儿不可以使用)
局部变量
在函数内部定义的变量,就叫局部变量。它只能在这个函数内部使用,函数外面不认识它。(函数执行完毕后,会自动销毁其中的局部变量)
def my_func():
x = 10 # x 是局部变量
print("内部:", x)
my_func()
print(x) # 报错!NameError: name 'x' is not defined全局变量
在函数外部(顶层)定义的变量,叫全局变量。整个文件里都能读它,但如果在函数内部想修改它,需要用 global 声明一下(不声明直接赋值会变成创建一个新的局部变量,而不是修改全局的)。
count = 0 # 全局变量
def increase():
global count # 告诉 Python:我要用外面那个 count
count = count + 1
print("加1后:", count)
increase() # 输出:加1后: 1
increase() # 输出:加1后: 2
print(count) # 输出:2global关键字
global关键字用于明确的告诉Python解释器,在函数中要使用全局变量,使得可以在函数内部修改全局变量的值

注意: 在基于global声明全局变量时,要先声明,再使用
函数参数详解
位置参数
最常用的方式,按顺序一一对应传值。
def sub(a, b):
return a - b
sub(10, 4) # 10传给a,4传给b → 6
sub(4, 10) # 顺序不同,结果不同 → -6默认参数
给参数一个默认值,调用时如果不传就使用默认值,传了就覆盖。
def power(x, n=2): # n 默认为 2,求平方
return x ** n
print(power(5)) # 不传 n,n=2 → 25
print(power(5, 3)) # 传了 n=3 → 125关键字参数
调用时直接指定参数名,不用管顺序,清晰不易错。
def user_info(name, city, job):
print(f"{name} 住在 {city},职业是 {job}")
user_info(city="北京", job="工程师", name="李雷")
# 输出:李雷 住在 北京,职业是 工程师不定长参数:*args 和 **kwargs
args:接收任意多个位置参数,把它们打包成一个元组。*kwargs:接收任意多个关键字参数,把它们打包成一个字典。
名字 args 和 kwargs 是惯例,你也可以换别的名,但星号 * / ** 是必须的。
# *args:不限制传入几个值
def total_sum(*numbers):
total = 0
for num in numbers:
total += num
return total
print(total_sum(1, 2, 3)) # 6
print(total_sum(10, 20, 30, 40)) # 100
# **kwargs:不限制传入几个带名字的参数
def build_profile(**info):
for key, value in info.items():
print(f"{key}: {value}")
build_profile(name="韩梅梅", school="北京大学", grade="大二")参数混合顺序
当这几种参数同时出现时,必须遵守:
位置参数 → 默认参数 → *args → **kwargs
def demo(a, b=1, *args, **kwargs):
print("a=", a, "b=", b)
print("args=", args)
print("kwargs=", kwargs)
demo(10, 20, 30, 40, x=100, y=200)
# a= 10 b= 20
# args= (30, 40)
# kwargs= {'x': 100, 'y': 200}函数的参数类型

匿名函数
匿名函数指的是没有名称的函数,需要通过lambda表达式来声明函数,可以简化简单函数的编写
#定义匿名函数
lambda 参数列表 :函数体
lambda :print('----------------')
lambda x,y : x + y
# 普通写法
def add(x, y):
return x + y
# 等价的 lambda 写法
add_lambda = lambda x, y: x + y
print(add_lambda(3, 4)) # 7lambda 常配合 map()、filter()、sorted() 等内建函数一起使用,作为临时的“小工具”。
nums = [1, 2, 3, 4, 5]
# 1. map:对每个元素做处理
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9, 16, 25]
# 2. filter:筛选出满足条件的元素
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]
# 3. sorted:按某个规则排序
students = [
{'name': '小明', 'score': 88},
{'name': '小红', 'score': 95},
{'name': '小刚', 'score': 72}
]
# 按分数从高到低排序
ranked = sorted(students, key=lambda s: s['score'], reverse=True)
print(ranked)
# [{'name': '小红', 'score': 95}, {'name': '小明', 'score': 88}, {'name': '小刚', 'score': 72}]练习
🤔采用面向对象的编程思想,开发一个购物车管理系统,实现商品信息的添加、修改、删除、查询功能。系统使用自定义对象存储商品数据,通过控制台菜单与用户交互。具体功能如下:
1. 添加购物车:用户根据提示录入商品名称、以及该商品的价格、数量,保存该商品信息到购物车。
2. 修改购物车:要求用户输入要修改的购物车商品名称,然后再提示输入该商品的价格、数量,输入完成后修改该商品信息。
3. 删除购物车:要求用户输入要删除的购物车名称,根据名称删除购物车中的商品。
4. 查询购物车:将购物车中的商品信息展示出来,格式为:"商品名称: xxx, 商品价格: xxx, 商品数量: xxx"。
5. 退出购物车
# 商品类
class Goods:
def __init__(self, name, price, num):
"""
初始化方法
:param name: 商品名
:param price: 商品价格
:param num:
"""
self.name = name
self.price = price
self.num = num
def __str__(self):
return f"商品名称: {self.name}, 商品价格: {self.price}, 商品数量: {self.num}"
# 修改商品信息
def update_info(self, price=None, num=None):
if price is not None:
self.price = price
if num is not None:
self.num = num
# 购物车系统类
class ShoppingCart:
system_version = "1.0"
system_name = "购物车管理系统"
def __init__(self):
self.goods_list = [] # 列表,存储购物车中的商品信息
# 添加商品到购物车
def add_goods(self):
name = input("请输入商品名称: ")
# 判断商品是否已存在(根据名称判断)
for goods in self.goods_list:
if goods.name == name:
print("该商品已在购物车中,添加失败!")
return
price = float(input("请输入商品价格: "))
num = int(input("请输入商品数量: "))
# 验证价格和数量是否有效
if price >= 0 and num >= 0:
goods = Goods(name, price, num)
self.goods_list.append(goods)
print("商品添加成功 ~")
else:
print("价格和数量必须为非负数!")
# 修改购物车中的商品信息
def update_goods(self):
name = input("请输入要修改的商品名称: ")
# 根据商品名称找到该商品
for goods in self.goods_list:
if goods.name == name:
print(f"当前商品信息: {goods}")
price = float(input("请输入修改后的商品价格: "))
num = int(input("请输入修改后的商品数量: "))
# 验证价格和数量是否有效
if price >= 0 and num >= 0:
goods.update_info(price, num)
print("商品信息修改成功 ~")
print(f"修改后的商品信息: {goods}")
else:
print("价格和数量必须为非负数!")
return
print("未找到该商品,修改失败!")
# 删除购物车中的商品
def delete_goods(self):
name = input("请输入要删除的商品名称: ")
for goods in self.goods_list:
if goods.name == name:
self.goods_list.remove(goods)
print("商品删除成功 ~")
return
print("未找到该商品,删除失败!")
# 查询购物车中的所有商品
def query_all_goods(self):
if not self.goods_list:
print("购物车为空!")
return
print("购物车中的商品信息:")
print("-" * 40)
for goods in self.goods_list:
print(goods)
print("-" * 40)
print(f"总计商品数量: {len(self.goods_list)}")
# 运行购物车系统
def run(self):
print(f"欢迎使用{ShoppingCart.system_name} V{ShoppingCart.system_version}")
while True:
print()
print("# " * 35)
print("# 1.添加商品 2.修改商品 3.删除商品 4.查询购物车 5.退出系统 #")
print("# " * 35)
print()
choice = input("请选择要执行的操作,输入1-5: ")
try:
match choice:
case "1": # 添加商品
self.add_goods()
case "2": # 修改商品
self.update_goods()
case "3": # 删除商品
self.delete_goods()
case "4": # 查询购物车
self.query_all_goods()
case "5": # 退出系统
print("感谢使用购物车管理系统,再见!")
break
case _: # 其他情况
print("输入错误,请选择1-5之间的菜单功能!")
except ValueError :
print("输入的数据有问题, 请检查后, 重新输入!!")
except Exception:
print("对不起, 程序运行异常, 请重新选择!")
# 测试
if __name__ == '__main__':
shopping_cart = ShoppingCart()
shopping_cart.run()