函数——我终于能把重复的代码“打包”起来了 一、函数快速体验想象一下食堂的打饭窗口。师傅不会每次给你打饭都重新学一遍“怎么打饭”而是早就把“打饭”这个动作练熟了。你只需要说一句“我要一份饭”师傅就知道怎么做。函数就是程序里的“打饭师傅”——把一段经常用到的代码打包成一个整体给它起个名字以后需要的时候直接喊它的名字就行了。看一个最简单的体验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 breturn resultsum add(3, 5)print(sum) # 8add(3, 5)的返回值是8被赋值给了变量sum。再看一个例子def is_adult(age):if age 18:return Trueelse:return Falseresult 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) # Nonesay_hello()只打印了你好!但没有返回任何值所以result的值是None。什么时候用None占位暂时还不知道放什么值先用None占着判断检查某个变量是否为空name Noneif 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 10def 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, standard37.5):“”判断体温是否正常:param temp: 体温值:param standard: 标准温度默认37.5:return: True 表示正常False 表示异常“”return temp standarddef 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 bNone 表示空值 return None说明文档 解释函数的作用 “” 函数说明 “”嵌套调用 函数内部调用另一个函数 def a(): b()局部变量 函数内部定义只能在内部使用 x 10 在函数内全局变量 函数外部定义任何地方可用 x 10 在函数外global 在函数内修改全局变量 global x什么时候用函数一段代码在多个地方重复出现 → 封装成函数