定义函数
本节目标
学完这一节,你会知道:
- 为什么程序需要函数
- 如何用
def定义函数 - 如何给函数传参数
- 如何用
return返回结果 - 如何把重复代码整理成更清楚的函数
函数可以把一段代码打包起来,需要时再调用。它是代码从“能跑”走向“好维护”的第一步。
先跑一个例子
新建文件 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
它表示:a 和 b 期望是整数,返回值也是整数。
注意:类型提示主要是提示,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)
然后继续改:
- 增加一个参数
goal - 让返回结果里包含学习目标
- 多调用几次,生成不同人的信息卡片
实战:成绩报告函数
新建文件 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,但 result 是 None。如果要拿到结果,需要 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))
小结
这一节你学会了:
- 函数可以封装一段可重复使用的代码
def用来定义函数- 参数可以把数据传进函数
return可以把结果返回给调用者- 函数能让程序更清楚、更容易维护
下一节我们会继续学习函数参数,让函数变得更灵活。
函数让代码开始有了分工,像个小团队
能把重复代码整理成函数,说明你已经不只是让代码能跑,而是在让代码更好维护。先从问候语、面积计算、成绩报告这些小函数练起。马哥的小建议:函数名写清楚,代码会显得很懂事。
还没有评论,来抢沙发吧!