函数——我终于能把重复的代码“打包”起来了

一、函数快速体验
想象一下食堂的打饭窗口。师傅不会每次给你打饭都重新学一遍“怎么打饭”,而是早就把“打饭”这个动作练熟了。你只需要说一句“我要一份饭”,师傅就知道怎么做。

函数就是程序里的“打饭师傅”——把一段经常用到的代码打包成一个整体,给它起个名字,以后需要的时候直接喊它的名字就行了。

看一个最简单的体验:

print(“你好!”)
print(“欢迎来到我的程序!”)
如果这两行代码要在多个地方使用,每次都重新写一遍。用函数可以这样做:

def say_hello():
print(“你好!”)
print(“欢迎来到我的程序!”)
定义完函数之后,只需要调用它就能执行里面的代码。这就是函数的快速体验————先把代码打包,然后随时调用。

二、函数定义
定义一个函数的基本格式是:

def 函数名():
要执行的代码
举一个最简单的例子:

def say_hello():
print(“你好!”)
print(“欢迎来到我的程序!”)
这段代码定义了say_hello这个函数,它包含了两行print。但定义函数不等于执行函数,你只是告诉Python"有这么一回事",但Python还不会真的去运行它。

想让它运行,需要"调用"它。调用函数很简单,写上函数名加括号就行:

def say_hello():
print(“你好!”)
print(“欢迎来到我的程序!”)

调用函数

say_hello()
运行结果:

你好!
欢迎来到我的程序!
每次调用say_hello(),里面的两行print都会执行一遍:

say_hello()
say_hello()
say_hello()
运行结果:

你好!
欢迎来到我的程序!
你好!
欢迎来到我的程序!
你好!
欢迎来到我的程序!
这就是函数最核心的价值:写一次,用多次。

三、函数的参数
上面的say_hello()每次输出都是固定的内容。如果我想让函数根据不同的人输出不同的问候语呢?这时候就需要参数。

举个例子:

def say_hello(name):
print(f"你好,{name}!")
print(“欢迎来到我的程序!”)

say_hello(“张三”)
say_hello(“李四”)
运行结果:

你好,张三!
欢迎来到我的程序!
你好,李四!
欢迎来到我的程序!
name就是参数。调用函数时传入的值(“张三”、“李四”)会传递给name,函数内部就可以使用这个值。

参数可以用多个:

def greet(name, age):
print(f"我叫{name},今年{age}岁。")

greet(“张三”, 25)
greet(“李四”, 30)
运行结果:

我叫张三,今年25岁。
我叫李四,今年30岁。
练习案例:写一个函数,接收体温值,输出体温判断结果。

def check_temp(temp):
if temp <= 37.5:
print(f"体温{temp}度,正常")
else:
print(f"体温{temp}度,异常")

check_temp(36.5)
check_temp(38.0)
四、函数的返回值
有时候,函数不只是执行一些操作,还需要把处理结果"还"给调用它的方法。用return就可以实现。

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

sum = add(3, 5)
print(sum) # 8
add(3, 5)的返回值是8,被赋值给了变量sum。

再看一个例子:

def is_adult(age):
if age >= 18:
return True
else:
return False

result = is_adult(20)
print(result) # True
那return 和 print 到底有什么区别?简单举个例子:

def add(a, b):
print(a + b) # 只打印,不返回

def add(a, b):
return a + b # 不打印,只返回
这样是不是就能理解"打印"和"返回"是两回事了。

并且要注意的是,调用带返回值的函数也需要括号,比如:

add # 这是函数本身,不会执行任何操作
add() # 这才是调用函数,会执行并返回结果
五、None:特殊的空值
在Python里,None表示"什么都没有"或"空"。如果一个函数没有写 return,或者写了 return 但后面不跟任何值,它默认返回的就是 None。

def say_hello():
print(“你好!”)

result = say_hello()
print(result) # None
say_hello()只打印了"你好!",但没有返回任何值,所以result的值是None。

什么时候用None?

占位:暂时还不知道放什么值,先用None占着;
判断:检查某个变量是否为空
name = None
if name is None:
print(“还没有设置名字”)
六、函数的说明文档
写好函数之后,最好加上说明文档,告诉别人(以及未来的自己)这个函数是干什么的、参数是什么、返回值是什么。

在函数内部第一行用三个引号写说明:

def add(a, b):
“”"
计算两个数的和
:param a: 第一个数字
:param b: 第二个数字
:return: a 和 b 的和
“”"
return a + b
查看说明文档可以用help():

help(add)
或者查看__doc__属性:

print(add.doc)
写说明文档是一个好习惯,尤其是代码量变大之后,它会帮你快速回忆“这个函数是干嘛的”。

七、函数的嵌套调用
函数内部可以调用另一个函数,这叫嵌套调用。

举个例子:

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

def welcome(name):
greet(name) # 调用 greet 函数
print(“欢迎来到我的程序!”)

welcome(“张三”)
运行结果:

你好,张三!
欢迎来到我的程序!
welcome函数内部调用了greet函数。先执行greet,打印"你好,张三!“,然后再打印"欢迎来到我的程序!”。

嵌套调用的好处:可以把大任务拆分成小任务,每个小任务用一个函数完成,然后组合起来。

八、变量的作用域
变量的作用域是指变量在哪些地方可以被访问到。

局部变量:在函数内部定义的变量,只能在函数内部使用。

def test():
x = 10 # 局部变量
print(x)

test()
print(x) # 报错!x 在函数外部访问不到
全局变量:在函数外部定义的变量,可以在任何地方访问。

x = 10 # 全局变量

def test():
print(x) # 可以访问全局变量

test()
print(x) # 也可以访问
如果在函数内部要修改全局变量,需要用global声明:

x = 10

def test():
global x # 声明 x 是全局变量
x = 20 # 修改全局变量

test()
print(x) # 20
如果不加global,在函数内部修改全局变量会被Python当成创建了一个新的局部变量,不会影响到外部的全局变量。

九、一个我踩过的坑:忘记写括号
这是新手最容易犯的错误,我刚开始学函数的时候,有一次这样写:

def say_hello():
print(“你好!”)

say_hello # 忘记加括号了
运行后什么都没有输出,也没有报错,什么都没有发生。我当时还以为是Python坏了,后来才发现调用函数必须加括号。say_hello只是函数本身,say_hello()才是调用它。

十、综合示例:把体温检测改写成函数
把之前写的体温检测程序改写成函数,加上说明文档和嵌套调用:

这个函数负责获取体温,返回给调用者

def get_temperature():
“”"
获取用户输入的体温
:return: 浮点数体温
“”"
return float(input(“请测量并输入您的体温:”))

def check_temperature(temp, standard=37.5):
“”"
判断体温是否正常
:param temp: 体温值
:param standard: 标准温度,默认37.5
:return: True 表示正常,False 表示异常
“”"
return temp <= standard

def print_result(temp, is_normal):
“”"
打印体温检测结果
:param temp: 体温值
:param is_normal: 是否正常
“”"
print(f"体温测量中,您的体温是:{temp}度")
if is_normal:
print(“体温正常请进!”)
else:
print(“需要隔离!”)

def main():
print(“欢迎来到辽宁!请出示您的健康码以及72小时核酸证明,并配合测量体温。”)
temp = get_temperature()
result = check_temperature(temp)
print_result(temp, result)

main()
一次定义可以反复使用,每个函数只做一件事,代码清晰易读。以后如果想修改体温检测的逻辑,只需要改对应的函数就行了。

小结
今天学的东西,整理成一张速查表:

知识点 作用 示例
def 定义函数 def say_hello():
参数 让函数接收外部数据 def greet(name):
return 返回值给调用者 return a + b
None 表示空值 return None
说明文档 解释函数的作用 “”" 函数说明 “”"
嵌套调用 函数内部调用另一个函数 def a(): b()
局部变量 函数内部定义,只能在内部使用 x = 10 在函数内
全局变量 函数外部定义,任何地方可用 x = 10 在函数外
global 在函数内修改全局变量 global x
什么时候用函数?

一段代码在多个地方重复出现 → 封装成函数