国庆节10月1日
--


Python变量作用域、参数详解(位置参数、关键字参数、默认参数、不定长参数)、函数作为参数、匿名函数

变量的作用域指的是变量的作用范围(标识这个变量在哪里可以使用,在哪儿不可以使用)。
在函数之外定义的变量,称之为全局变量,在整个文件中(包括函数内)都可以使用(通常定义在文件的顶部)。
在函数内部定义的变量,称之为局部变量,只能在该函数内部使用,外部无法访问(函数执行完毕后,会自动销毁其内部局部变量)。
1# 定义函数2num = 100 # 全局变量3def circle_area(r):4 pi = 3.145 area = pi * r * r # 局部变量6 return area7
8count = 0 # 全局变量9# 调用函数10c_area = circle_area(10)11print(c_area)global 关键字用于明确的告诉Python解释器,在函数中要使用全局变量,使得可以在函数内部修改全局变量的值。
1num1 = 1 # 全局变量2
3def fun1():4 num1 = 100 # 局部变量,只是新建了一个同名的局部变量5 print(num1)6
7fun1() # 1008print(num1) # 1(全局变量未被修改)1num1 = 1 # 全局变量2
3def fun1():4 global num1 # 告诉python解释器,函数中使用全局变量num15 num1 = 100 # 修改全局变量num16 print(num1)7
8fun1() # 1009print(num1) # 100(全局变量被修改)global 声明全局变量时,要先声明,再使用什么是局部变量,全局变量?
global关键字的作用?
global xxx注意事项
global 主要用在程序的状态、配置和计数器等场景中传参方式指的是,在调用函数时,传递实参的方式。
调用函数时根据函数定义时的位置来传递参数。
1# 定义函数2def reg_stu(name, age, gender, city):3 print(f"注册成功,姓名:{name},年龄:{age},性别:{gender},城市:{city}")4 return {"name": name, "age": age, "gender": gender, "city": city}5
6# 调用函数(顺序必须与定义一致)7stu = reg_stu("张三", 18, "男", "北京")8print(stu)要求:调用函数时参数顺序与定义函数时参数顺序完全一致
调用函数时以函数定义时形参名称作为关键字,以 "键=值" 的形式来传递参数(不要求顺序)。
1# 定义函数2def reg_stu(name, age, gender, city):3 print(f"注册成功,姓名:{name},年龄:{age},性别:{gender},城市:{city}")4 return {"name": name, "age": age, "gender": gender, "city": city}5
6# 调用函数(顺序可以不一致)7stu = reg_stu(name="张三", age=18, gender="男", city="北京")8print(stu)9
10stu2 = reg_stu(gender="男", name="王武", city="上海", age=22)11print(stu2)1# 位置参数在前,关键字参数在后2stu = reg_stu("赵四", 28, gender="男", city="上海")3print(stu)要求:如果位置参数与关键字参数混用,关键字参数必须在位置参数之后(关键字参数之间,没有顺序要求)
| 对比项 | 位置参数 | 关键字参数 |
|---|---|---|
| 优点 | 简洁 | 可读性强、易维护和扩展 |
| 缺点 | 可读性差、易出错、维护难 | 代码繁琐 |
| 适用场景 | 参数少(不超过3个),且顺序自然 | 参数较多,或易混淆的场景 |
1# 位置参数(简洁但可读性差)2s = calc(87, 68, 92, 85)3
4# 关键字参数(可读性强)5s = calc(math=87, chinese=68, english=92, computer=85)黄金法则:半年后回头看你今天写的代码,能否一眼看出每个参数的含义,如果不能,就应该使用关键字参数。
位置参数
关键字参数
"形参名=值" 的形式传递参数,顺序没有要求两种传参方式的适用场景
默认参数也称为缺省参数,用于在定义函数时,为参数提供默认值,调用函数时,可以不传递有默认值的参数。
1# 定义函数(city有默认值'北京')2def reg_stu(name, age, gender, city='北京'):3 print(f"注册成功,姓名:{name},年龄:{age},性别:{gender},城市:{city}")4 return {"name": name, "age": age, "gender": gender, "city": city}5
6# 调用函数(不传city,使用默认值)7stu = reg_stu("张三", 18, "男")8print(stu) # 城市:北京9
10# 调用函数(传city,覆盖默认值)11stu = reg_stu("赵四", 22, "男", "深圳")12print(stu) # 城市:深圳当参数个数不确定时,可以使用不定长参数解决这类问题。
传递的所有匹配的位置参数都会被 args 变量收集,这些参数会合并封装为一个元组(注意并不会封装关键字参数)。
1# 定义函数2def calc_data(*args):3 min_data = min(args)4 max_data = max(args)5 avg_data = sum(args) / len(args)6 return min_data, max_data, round(avg_data, 1)7
8# 调用函数9data = calc_data(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)10print(data) # (10, 100, 55.0)11
12data = calc_data(100, 200, 300, 400, 500)13print(data) # (100, 500, 300.0)args 只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如 *data)参数是以 "键=值" 形式传递的关键字参数,这些 "键=值" 参数都会被 kwargs 接受,并合并封装为一个字典类型。
1# 定义函数2def calc_data(*args, **kwargs):3 min_data = min(args)4 max_data = max(args)5 avg_data = sum(args) / len(args)6
7 if kwargs.get('round'):8 avg_data = round(avg_data, kwargs.get('round'))9
10 return min_data, max_data, avg_data11
12# 调用函数(带配置参数)13data = calc_data(100, 200, 300, 400, round=2, count=0)14print(data) # (100, 400, 250.0)15
16# 调用函数(不带配置参数)17data = calc_data(33, 11, 28, 91, 32, 75, 49)18print(data) # (11, 91, 45.6)kwargs 只是约定俗成的变量名,并不是关键字,这里可以使用任何合法的变量名(如 **options)什么是不定长参数?
不定长参数的分类?
*args:不定长位置参数,函数调用时,通过位置参数传递多个参数封装到一个元组(tuple)中**kwargs:不定长关键字参数,函数调用时,通过关键字参数传递多个参数封装到一个字典(dict)中args与kwargs的应用场景?*
*args 适用于处理数量不确定的数据(核心数据)**kwargs 适用于处理数量不确定的选项(函数的配置参数,用来定制函数的行为)1# 核心数据:你要什么2点奶茶("珍珠奶茶")3
4# 选项:你要什么样的5点奶茶("珍珠奶茶", 甜度="少糖", 冰度="去冰", 加料=["布丁", "珍珠"], 大小="大杯")普通参数:数字、布尔、字符串、列表、元组、集合、字典等。
特殊参数:函数。
1def add(x, y):2 return x + y3
4def subtract(x, y):5 return x - y6
7def calc(x, y, oper):8 return oper(x, y)9
10# 传递的是函数中封装的逻辑11result = calc(10, 20, add)12print(result) # 3013
14result = calc(10, 20, subtract)15print(result) # -10匿名函数指的是没有名称的函数,需要通过 lambda 表达式来声明函数,可以简化简单函数的编写(单行表达式)。
1lambda 参数列表 : 函数体1# 命名函数2def out_line():3 print('-------------------------')4
5def add(x, y):6 return x + y7
8out_line()9print(add(10, 20))10
11
12# 匿名函数13out_line = lambda : print('-------------------------')14add = lambda x, y: x + y15
16out_line()17print(add(100, 200))return,表达式的运行结果就是要返回的结果匿名函数的定义方式
1lambda 参数列表 : 函数体命名函数与匿名函数的选择?
代码的可读性和可维护性比简洁性更重要
global 变量名(先声明,再使用)形参名=值,顺序随意、可读性好def reg_stu(name, age, gender, city='北京'):;不传就用默认值,传了就覆盖;默认参数要放在没有默认值的参数后面*args:把多传的位置参数收集成一个元组(args 只是约定名,可以叫别的)**kwargs:把多传的关键字参数收集成一个字典(常用来收配置项,如 round=2)calc(10, 20, add)lambda 参数列表 : 函数体:没有名字、一行写完,适合逻辑简单且只在一处使用的场景;返回结果不用写 return,表达式的值就是结果 2-1 三角形类型判断
定义一个函数 triangle_type(a, b, c),根据传入的三个边长判定三角形类型:
批改(2026-09-28):⚠️ 判断逻辑正确,但只测了
triangle_type(3, 3, 999)(不能构成三角形)一种情况,等边/等腰/普通三种分支都没验证;建议按参考答案把 4 种情况各跑一遍。
一级 · 思路:先过一遍”能不能围成三角形”的关(任意两边之和都要大于第三边),能围成的再按”三边相等 / 有两边相等 / 都不等”往下分
二级 · 方法:外层 if a + b > c and a + c > b and b + c > a:,内层用 if a == b == c: / elif a == b or a == c or b == c: / else:,各分支 return 对应的字符串
三级 · 骨架:if a + b > ____ and a + c > b and b + c > a: / if a == b == ____: / elif a == b ____ a == c ____ b == c: / else: return "不能构成三角形"
1# 2-12def triangle_type(a, b, c):3 if a + b > c and a + c > b and b + c > a:4 if a == b == c:5 return "等边三角形"6 elif a == b or a == c or b == c:7 return "等腰三角形"8 else:9 return "普通三角形"10 else:11 return "不能构成三角形"12
13print(triangle_type(3, 4, 5)) # 普通三角形14print(triangle_type(3, 3, 5)) # 等腰三角形15print(triangle_type(8, 8, 8)) # 等边三角形16print(triangle_type(3, 4, 7)) # 不能构成三角形 2-2 成绩统计函数
定义一个函数 calc_stats(*scores),接收任意数量的成绩,返回最高分、最低分、平均分。
批改(2026-09-28):✅ 正确(最高分 96、最低分 78、平均分 87.8,输出与预期一致)。代码与文件末尾注释答案高度相似(连那组测试数据都一样),建议重做一遍确认掌握。
一级 · 思路:参数个数不定,就把它收成一包整体处理:最高、最低、平均值各用现成函数算出来,一起返回
二级 · 方法:定义时用不定长位置参数 *scores(收集成元组);最高 max(scores)、最低 min(scores)、平均 sum(scores) / len(scores)(要保留一位小数可以再套 round(值, 1));return 最高, 最低, 平均 一次返回三个值
三级 · 骨架:def calc_stats(____scores): / return ____(scores), min(scores), round(sum(scores) / ____(scores), 1)
1# 2-22def calc_stats(*scores):3 return max(scores), min(scores), round(sum(scores) / len(scores), 1)4
5highest, lowest, avg = calc_stats(85, 92, 78, 96, 88)6print(f"最高分: {highest}, 最低分: {lowest}, 平均分: {avg}") 2-3 学生信息注册
定义一个函数 register(name, age, gender, city='北京'),使用默认参数,返回学生信息字典。
批改(2026-09-28):✅ 正确(默认值
城市=北京、传参覆盖成城市=上海两组输出都对)。与文件末尾注释答案高度相似(注释和测试数据都一致),建议重做一遍确认掌握。
一级 · 思路:其中一个参数在定义时就给好默认值——调用时不传就是默认的,传了就按传的来
二级 · 方法:默认参数写在参数列表最后,如 city='北京';函数里把参数装进字典 return {"name": name, "age": age, "gender": gender, "city": city}
三级 · 骨架:def register(name, age, gender, ____='北京'): / return {"name": ____, "age": age, "gender": gender, "city": city}
1# 2-32def register(name, age, gender, city='北京'):3 return {"name": name, "age": age, "gender": gender, "city": city}4
5# 使用默认值6stu1 = register("张三", 18, "男")7print(stu1) # {'name': '张三', 'age': 18, 'gender': '男', 'city': '北京'}8
9# 覆盖默认值10stu2 = register("李四", 20, "女", "上海")11print(stu2) # {'name': '李四', 'age': 20, 'gender': '女', 'city': '上海'}如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"生活不是等待暴风雨过去,而是学会在雨中跳舞。"—— 塞维涅夫人


