Skip to content

Python-核心语法-函数

函数基础

函数定义

函数是组织好的、可重复使用的,用来实现特定功能的代码片段

函数的定义与调用

python
# 定义函数
def 函数名(参数列表):
		函数体
		......
		return 返回值
# 调用函数
函数名(参数)
python
# 定义一个最简单的函数:打招呼
def say_hello():
    print("你好!")
    print("欢迎来到 Python 世界!")
    
say_hello()   # 输出:你好! 和 欢迎来到 Python 世界!
say_hello()   # 可以反复调用
  • 函数必须先定义,在调用
  • 函数定义时,并不会执行。只有在调用函数时。函数体的逻辑才会执行
  • 函数中通过缩进来描述归属关系

函数的参数与返回值

在定义函数时,根据业务需要,可以指定函数与返回值,具体格式如下:

python
# 定义函数
def 函数名(参数列表):
		函数体
		......
		return 返回值

# 调用函数
函数名(参数)
python
def greet(name):
    print(f"嗨,{name}!")

msg = greet("小明")   # 打印:嗨,小明!
print(msg)   # 输出:None,因为函数没有 return 东西出来
  • 参数:写在圆括号里,相当于榨汁机的水果入口,是函数的输入。
  • 返回值:用 return 把结果“扔”出来,可以存到一个变量里继续使用。如果没有 return,函数默认返回 None(空)。
python
# 有参数、有返回值的函数:两数相加
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 30
  • a 和 b 是形参(占位置的),等着接收真正的数据。
  • 3 和 5 是实参,调用时给进去的真实值。
  • return 就是这台机器的“出货口”。一旦执行到 return,函数立刻结束,并把值送出去。

扩展

函数可以有多个返回值

python
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)是写在函数开头,用三个引号包裹的字符,用于解释函数的功能、参数、返回值等信息,方便调用者清楚函数的具体作用及细节

python
def multiply(x, y):
    """
    返回两个数字的乘积。
    
    参数:
    x -- 第一个乘数
    y -- 第二个乘数
    
    返回值:
    两个数的乘积累
    """
    return x * y

你可以用内置函数 help() 来查看这份说明书:

python
help(multiply)

运行后会打印出你在 """ """ 里写的所有内容。

养成写文档的好习惯,会让你的代码更专业。

函数的嵌套调用

练习

🤔定义一个函数,根据传入的分数,计算对应的分数等级并返回。

分数 >= 90:A

分数 >= 75:B

分数 >= 60:C

分数 < 60:D

python
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))

🤔定义一个函数:完成时间转换功能,将传入的秒转换为小时、分钟、秒。

python
# 定义一个函数:完成时间转换功能,将传入的秒转换为小时、分钟、秒。
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))

函数进阶

函数变量的作用域

作用域决定了变量在程序的作用范围(标识这个变量在哪里可以使用,在哪儿不可以使用)

局部变量

在函数内部定义的变量,就叫局部变量。它只能在这个函数内部使用,函数外面不认识它。(函数执行完毕后,会自动销毁其中的局部变量)

python
def my_func():
    x = 10          # x 是局部变量
    print("内部:", x)

my_func()
print(x)            # 报错!NameError: name 'x' is not defined

全局变量

在函数外部(顶层)定义的变量,叫全局变量。整个文件里都能读它,但如果在函数内部想修改它,需要用 global 声明一下(不声明直接赋值会变成创建一个新的局部变量,而不是修改全局的)。

python
count = 0   # 全局变量

def increase():
    global count      # 告诉 Python:我要用外面那个 count
    count = count + 1
    print("加1后:", count)

increase()   # 输出:加1后: 1
increase()   # 输出:加1后: 2
print(count) # 输出:2

global关键字

global关键字用于明确的告诉Python解释器,在函数中要使用全局变量,使得可以在函数内部修改全局变量的值

注意: 在基于global声明全局变量时,要先声明,再使用

函数参数详解

位置参数

最常用的方式,按顺序一一对应传值。

python
def sub(a, b):
    return a - b

sub(10, 4)   # 10传给a,4传给b → 6
sub(4, 10)   # 顺序不同,结果不同 → -6

默认参数

给参数一个默认值,调用时如果不传就使用默认值,传了就覆盖。

python
def power(x, n=2):       # n 默认为 2,求平方
    return x ** n

print(power(5))          # 不传 n,n=2 → 25
print(power(5, 3))       # 传了 n=3 → 125

关键字参数

调用时直接指定参数名,不用管顺序,清晰不易错。

python
def user_info(name, city, job):
    print(f"{name} 住在 {city},职业是 {job}")

user_info(city="北京", job="工程师", name="李雷")
# 输出:李雷 住在 北京,职业是 工程师

不定长参数:*args 和 **kwargs

  • args :接收任意多个位置参数,把它们打包成一个元组
  • *kwargs :接收任意多个关键字参数,把它们打包成一个字典

名字 args 和 kwargs 是惯例,你也可以换别的名,但星号 * / ** 是必须的。

python
# *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

python
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表达式来声明函数,可以简化简单函数的编写

python
#定义匿名函数

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))   # 7

lambda 常配合 map()filter()sorted() 等内建函数一起使用,作为临时的“小工具”。

python
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. 退出购物车

python
# 商品类
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()