第三章 · 函数

定义函数

本节目标

学完这一节,你会知道:

  1. 为什么程序需要函数
  2. 如何用 def 定义函数
  3. 如何给函数传参数
  4. 如何用 return 返回结果
  5. 如何把重复代码整理成更清楚的函数

函数可以把一段代码打包起来,需要时再调用。它是代码从“能跑”走向“好维护”的第一步。

先跑一个例子

新建文件 function_demo.py,写入:

def greet(name):
    print(f"你好,{name}!")
    print("欢迎学习 Python。")


greet("小明")
greet("小红")

运行:

python3 function_demo.py

你会看到:

你好,小明!
欢迎学习 Python。
你好,小红!
欢迎学习 Python。

函数定义一次,可以调用多次。

为什么需要函数?

如果没有函数,重复的代码只能复制粘贴:

print("=" * 20)
print("欢迎光临")
print("=" * 20)

print("=" * 20)
print("谢谢惠顾")
print("=" * 20)

用函数整理后:

def show_banner(title):
    print("=" * 20)
    print(title)
    print("=" * 20)


show_banner("欢迎光临")
show_banner("谢谢惠顾")

好处是:

  • 少写重复代码
  • 修改时只改一处
  • 代码更容易看懂
  • 大程序可以拆成小步骤

定义和调用函数

基本语法:

def 函数名():
    函数体

例子:

def say_hello():
    print("Hello")


say_hello()

def 是定义函数,say_hello() 是调用函数。

注意:函数体需要缩进。

参数:把数据传给函数

函数可以接收参数:

def greet(name):
    print(f"你好,{name}!")


greet("小明")
greet("马哥")

多个参数:

def introduce(name, age, city):
    print(f"我叫{name},今年{age}岁,来自{city}")


introduce("小明", 18, "成都")

调用时也可以写参数名,这叫关键字参数:

introduce(name="小红", age=20, city="上海")

关键字参数让代码更清楚。

返回值:把结果交回来

有些函数不只是输出,还要把计算结果返回给外面。

def add(a, b):
    return a + b


result = add(3, 5)
print(result)

输出:

8

return 的意思是:把结果返回,并结束函数。

如果函数没有写 return,默认返回 None

def say_hi():
    print("Hi")


result = say_hi()
print(result)

最后会输出 None

默认参数

参数可以设置默认值:

def greet(name, message="你好"):
    print(f"{message}{name}!")


greet("小明")
greet("Alex", "Hello")

输出:

你好,小明!
Hello,Alex!

默认参数适合给常用情况一个默认选择。

文档字符串

函数开头可以写一段说明,这叫文档字符串。

def calculate_area(width, height):
    """计算长方形面积。"""
    return width * height

文档字符串能帮助自己和别人快速理解这个函数是做什么的。

类型提示

类型提示可以让函数更容易读:

def add(a: int, b: int) -> int:
    return a + b

它表示:ab 期望是整数,返回值也是整数。

注意:类型提示主要是提示,Python 默认不会在运行时强制检查。

逐行拆解

再看开头的例子:

def greet(name):

定义一个函数,函数名是 greet,它需要一个参数 name

print(f"你好,{name}!")

使用传进来的 name 拼出一句问候语。

greet("小明")

调用函数,并把 "小明" 传给 name

自己改一改

function_demo.py 改成:

def make_card(name, age, city):
    return f"姓名:{name},年龄:{age},城市:{city}"


card = make_card("小明", 18, "成都")
print(card)

然后继续改:

  1. 增加一个参数 goal
  2. 让返回结果里包含学习目标
  3. 多调用几次,生成不同人的信息卡片

实战:成绩报告函数

新建文件 score_report.py

def get_average(scores):
    return sum(scores) / len(scores)


def get_grade(avg):
    if avg >= 90:
        return "A"
    elif avg >= 80:
        return "B"
    elif avg >= 60:
        return "及格"
    else:
        return "不及格"


def print_report(name, scores):
    avg = get_average(scores)
    grade = get_grade(avg)

    print(f"姓名:{name}")
    print(f"成绩:{scores}")
    print(f"平均分:{avg:.1f}")
    print(f"等级:{grade}")


print_report("小明", [85, 92, 78])

这个例子把“算平均分”“判断等级”“打印报告”拆成了三个函数。

常见错误

1. 忘记冒号

错误写法:

def greet(name)
    print(name)

正确写法:

def greet(name):
    print(name)

2. 调用函数时少传参数

def add(a, b):
    return a + b


print(add(1))

这会报 TypeError,因为 b 没有传。

3. 把 print 当成 return

def add(a, b):
    print(a + b)


result = add(1, 2)
print(result)

函数会打印 3,但 resultNone。如果要拿到结果,需要 return

def add(a, b):
    return a + b

4. 函数还没定义就调用

say_hi()

def say_hi():
    print("Hi")

Python 从上到下执行,调用前要先定义函数。

小练习

练习 1:计算面积

定义函数 rectangle_area(width, height),返回长方形面积。

练习 2:生成问候语

定义函数 welcome(name, course),返回:

你好,XXX,欢迎学习 YYY!

练习 3:判断及格

定义函数 is_pass(score),如果分数大于等于 60,返回 True,否则返回 False

参考答案

练习 1:

def rectangle_area(width, height):
    return width * height


print(rectangle_area(3, 5))

练习 2:

def welcome(name, course):
    return f"你好,{name},欢迎学习 {course}!"


print(welcome("小明", "Python 函数"))

练习 3:

def is_pass(score):
    return score >= 60


print(is_pass(80))
print(is_pass(50))

小结

这一节你学会了:

  1. 函数可以封装一段可重复使用的代码
  2. def 用来定义函数
  3. 参数可以把数据传进函数
  4. return 可以把结果返回给调用者
  5. 函数能让程序更清楚、更容易维护

下一节我们会继续学习函数参数,让函数变得更灵活。

函数让代码开始有了分工,像个小团队

能把重复代码整理成函数,说明你已经不只是让代码能跑,而是在让代码更好维护。先从问候语、面积计算、成绩报告这些小函数练起。马哥的小建议:函数名写清楚,代码会显得很懂事。

讨论 (0)

还没有评论,来抢沙发吧!