AI摘要

本章用踩坑经历讲透Python函数:定义语法、位置/默认参数、返回值与多值返回、函数嵌套及全局变量使用,提醒勿重名内置函数、参数数量要对。附BMI、质数、偶数和练习。 此内容根据文章生成,不代表个人观点,仅用于文章内容的解释与总结

第四章 函数——自学时觉得“多此一举”,后来香到爆4.0 写在前面刚学循环那会儿,我还觉得“重复代码复制粘贴就行”,直到要写3次“计算两个数加减乘除”的逻辑,复制粘贴完发现要改个细节得改3处,手忙脚乱还容易错。后来翻资料看到“函数”,一开始觉得“还要定义半天,不如直接写”,结果用了一次就真香——这章全是我自学函数时的“真香时刻”和踩过的坑(比如把参数顺序搞反,算错结果),新手别再像我一样抵触函数啦!

4.1 函数是什么?能“打包”代码的“工具盒”最开始我理解的函数,就是把一段常用代码“装起来”,下次用的时候不用再写一遍,直接“喊个名字”就行。比如每次要算两个数的和,不用每次都写a + b,把这段逻辑装成函数,用的时候叫一下就好。

4.1.1 基本语法:定义函数=“造工具”定义函数的格式要记牢,我自学时因为漏了冒号、没缩进,报错了好几次:

def 函数名(参数1, 参数2, ...):

"""函数说明(可选,相当于工具说明书)"""

函数里要执行的代码(必须缩进!)

return 返回值(可选,相当于工具输出的结果)比如造一个“计算加法”的工具:

def add_num(a, b):

"""计算两个数的和"""

result = a + b # 函数里的逻辑

return result # 把结果“吐出来”def:是“define”的缩写,告诉Python“我要定义函数啦”;add_num:是我给函数起的名字,要符合变量命名规则(不能用关键字、字母开头);(a, b):是函数需要的“原材料”(参数),相当于计算加法需要的两个数;return result:是函数输出的“成品”(返回值),没有return的话,函数执行完不会给结果。4.1.2 调用函数=“用工具”造好工具就得用,调用函数超简单:函数名(实际参数1, 实际参数2),比如用刚才的add_num算3+5:

sum_result = add_num(3, 5) # 把3和5传给a和b,结果存到sum_result里

print(sum_result) # 输出8我踩的坑:第一次调用时写成add_num(a=3, b=5),以为必须写参数名,后来发现不用——只要实际参数的顺序和定义时的参数顺序一致就行(这叫“位置参数”);当然写参数名也可以(叫“关键字参数”),甚至可以换顺序,比如add_num(b=5, a=3),结果也是8。

4.2 函数的核心:参数和返回值自学函数时,我最懵的就是“参数”和“返回值”,总搞不清“要传几个参数”“怎么拿到结果”,后来拆成小问题才搞懂。

4.2.1 参数:函数的“原材料”,有多种“配方”参数不止一种,我常用的有两种,每种都有坑:

位置参数:必须按定义时的顺序传,数量还得对比如定义一个“算长方形面积”的函数calc_area(length, width)(长在前,宽在后):

def calc_area(length, width):

return length * width

# 对的:顺序对,数量对

area1 = calc_area(5, 3)

print(area1) # 输出15(5是长,3是宽)

# 我踩的错:顺序反了

area2 = calc_area(3, 5)

print(area2) # 输出15?哦,面积刚好一样,这次没发现错

# 后来算周长函数才暴露问题:def calc_perim(length, width): return 2*(length+width)

# 传反后calc_perim(3,5)结果还是2*(3+5)=16,哦,周长也一样…(这次纯属巧合)重点:位置参数一旦顺序错,要是参数类型不同(比如一个是数字一个是字符串),直接报错;就算类型对,结果也可能错(比如算“姓名+年龄”的函数,把年龄放前面就会变成“20张三”)。

默认参数:给参数设个“默认值”,传参时可以省比如写一个“打招呼”的函数,默认对“朋友”打招呼,想对“老师”打招呼再传参数:

def say_hi(name, role="朋友"): # role的默认值是“朋友”

print(f"你好,{name}!我是你的{role}")

# 省了role参数,用默认值

say_hi("张三") # 输出:你好,张三!我是你的朋友

# 传了role参数,覆盖默认值

say_hi("李老师", "学生") # 输出:你好,李老师!我是你的学生自学时的大错:我一开始把默认参数放前面,写成def say_hi(role="朋友", name),直接报错!后来才知道:默认参数必须放在位置参数后面,不然Python分不清哪个是默认参数、哪个是位置参数。

4.2.2 返回值:函数的“成品”,没它拿不到结果最开始我写函数忘了加return,比如:

def add_num(a, b):

result = a + b # 只算不返回

sum_result = add_num(3, 5)

print(sum_result) # 输出None(相当于“没结果”)当时以为函数坏了,后来才明白:没有return的函数,执行完只会“默默干活”,不会给你任何结果。return还有两个小技巧:

可以返回多个结果,用逗号分隔,接收时用多个变量接:

def calc(a, b):

sum_ab = a + b

sub_ab = a - b

return sum_ab, sub_ab # 返回两个结果

sum_r, sub_r = calc(5, 3)

print(sum_r) # 输出8

print(sub_r) # 输出2return会直接终止函数,后面的代码不会执行:

def check_age(age):

if age < 18:

return "未成年" # 执行到这,函数直接停

print("这句不会执行") # 永远不会被打印

return "成年"

print(check_age(16)) # 输出“未成年”4.3 函数的“进阶”:嵌套和全局变量自学时看到“函数里套函数”“函数用外面的变量”,一开始懵了,后来拆成小例子才懂。

4.3.1 函数嵌套:函数里“藏”另一个函数就是在一个函数里定义另一个函数,一般是“里面的函数只给外面的函数用”。比如写一个“算圆的面积和周长”的函数,里面藏一个“算圆周率”的小函数(不用每次写3.1416):

def calc_circle(radius):

# 里面的小函数,只给calc_circle用

def get_pi():

return 3.1416 # 圆周率

area = get_pi() * radius **2 # 调用里面的函数

perim = 2 * get_pi() * radius

return area, perim

circle_area, circle_perim = calc_circle(5)

print(f"面积:{circle_area},周长:{circle_perim}")

# 输出:面积:78.54,周长:31.416我踩的坑:一开始想在calc_circle外面调用get_pi(),结果报错“name 'get_pi' is not defined”——里面的函数只能在“外面的函数肚子里”用,外面用不了。

4.3.2 全局变量:函数外面的“公共材料”如果函数想用到外面定义的变量,有两种情况:

只是“读”外面的变量,直接用就行:

global_num = 10 # 外面的全局变量

def add_global(a):

return a + global_num # 直接读global_num

print(add_global(5)) # 输出15想“改”外面的变量,必须加global声明,不然会变成函数里的“局部变量”:

global_num = 10

def change_global():

global global_num # 声明“我要改外面的global_num”

global_num = 20 # 现在改的是外面的变量

change_global()

print(global_num) # 输出20(改成功了)

# 我踩的错:没加global

def wrong_change():

global_num = 30 # 这是函数里的新变量,不是外面的

wrong_change()

print(global_num) # 还是20,没改到4.4 自学函数的“坑”:我踩过的雷,你别踩4.4.1 函数名和内置函数重名我一开始想写个“打印列表”的函数,起名叫print_list嫌长,直接写成print,结果:

def print(lst):

for item in lst:

print(item) # 这里调用的是自己写的print,不是Python自带的!

print([1,2,3]) # 报错:RecursionError(递归错误,自己调用自己没完了)后来才知道,Python有很多“内置函数”(比如print、len、max),函数名不能和它们重名,不然会“覆盖”内置函数,导致原来的功能用不了。

4.4.2 参数数量不匹配比如函数定义时要2个参数,调用时只传1个,直接报错:

def add_num(a, b):

return a + b

add_num(3) # 报错:TypeError: add_num() missing 1 required positional argument: 'b'自学时我总犯这种“粗心错”,后来养成习惯:调用前先看函数定义“要几个参数”,传参时数清楚。

4.5 本章小结(自学函数的真香总结)函数是“打包代码的工具盒”,重复代码用函数,改的时候只改一处,超省心;定义函数要记def 函数名(参数):+缩进,调用时按顺序传参(或用关键字参数);参数分位置参数(按顺序)和默认参数(放后面,有默认值),返回值用return,能返回多个结果;函数嵌套里的内层函数只能内层用,改全局变量要加global声明;别用内置函数名当函数名,传参数量要和定义时一致。自己练的小题目(用函数解决才高效)写一个函数calc_bmi(weight, height),计算BMI指数(BMI=体重kg / 身高m的平方),并返回“偏瘦”(<18.5)、“正常”(18.5-23.9)、“超重”(≥24)的判断结果;写一个函数is_prime(num),判断一个数是不是质数(只能被1和自己整除的大于1的整数),返回True或False;写一个函数sum_even(n),用嵌套函数的方式,计算1到n之间所有偶数的和(比如n=10,和是2+4+6+8+10=30)。现在写代码遇到重复逻辑,我第一反应就是“能不能用函数”,比之前复制粘贴高效太多了!你们练的时候要是分不清参数顺序,就先写关键字参数(比如a=3, b=5),熟练了再用位置参数~

2025-11-30 12:09:24