当前位置: 首页 > news >正文

【Python基础入门】第五课 : 函数进阶、作用域、参数详解与Lambda表达式

大家好,欢迎来到Python基础第五课!在前几节课中,我们已经学习了函数的基本概念,知道了如何定义和调用函数。今天我们将深入函数的内部,探索变量的作用域函数的参数传递机制,以及lambda表达式这个简洁强大的工具。学会这些,你就能写出更加灵活、高效的代码!


一、变量的作用域

作用域(Scope)简单来说就是变量能够被访问的范围。理解作用域,能帮你避免很多莫名其妙的错误。

1.1 全局变量 vs 局部变量

  • 全局变量:定义在函数外部的变量,在当前文件的任何地方都可以访问。

  • 局部变量:定义在函数内部(或作为形参)的变量,只能在函数内部使用。

python

# 全局变量 name = '乔峰' def func1(): # 局部变量 age = 38 print(f'全局变量: {name}') # 可以访问全局变量 print(f'局部变量: {age}') # 可以访问局部变量 func1() print(f'全局变量: {name}') # 可以访问 # print(age) # 报错!无法在外部访问局部变量

记忆口诀

  • 全局变量“活”在全文件。

  • 局部变量“死”在函数内。

1.2 global关键字:在函数内修改全局变量

如果你需要在函数内部修改全局变量的值,必须先用global声明。

python

num = 10 def func(): global num # 声明num是全局变量 num = 20 # 现在修改的是全局变量 func() print(num) # 输出 20

如果不加 global 会怎样?

python

num = 10 def func(): num = 20 # 这是在创建一个新的局部变量,不会影响全局变量 print(num) # 输出 20(局部变量) func() print(num) # 输出 10(全局变量没变)

使用原则:除非确实需要,否则尽量避免在函数内修改全局变量,因为这会增加代码的理解难度。更好的做法是把数据作为参数传入,把结果作为返回值传出。


二、可变与不可变类型

这是Python中一个非常重要的概念,也是很多初学者容易踩的坑。

2.1 如何区分可变与不可变?

看修改变量值后,它的内存地址是否改变:

  • 不可变类型:修改后地址改变 → int、float、bool、str、tuple

  • 可变类型:修改后地址不变 → list、set、dict

使用id()函数可以查看变量在内存中的地址。

python

# 不可变类型:int a = 10 print(id(a)) # 假设是 140704877456088 a = 20 print(id(a)) # 变成了另一个地址 140704877456408 # 可变类型:list list1 = [10, 20, 30] print(id(list1)) # 假设是 2798866600256 list1[1] = 200 print(id(list1)) # 地址不变 2798866600256

2.2 这对函数参数意味着什么?

形参是不可变类型→ 形参的改变不影响实参(值传递)
形参是可变类型→ 形参的改变直接影响实参(引用传递)

python

# 场景1:形参是不可变类型(int) num = 10 def change(num): num = 20 # 形参重新赋值,不影响外面的num change(num) print(num) # 仍然是 10 # 场景2:形参是可变类型(list) num_list = [10, 20, 30] def change(num_list): num_list[1] = 200 # 修改列表元素,影响外面的列表 change(num_list) print(num_list) # [10, 200, 30]

理解要点

  • 不可变类型传递的是“值”,函数内部修改不会影响外部。

  • 可变类型传递的是“引用”,函数内部修改会影响外部。


三、函数的参数详解

Python的参数传递非常灵活,我们来逐一拆解。

3.1 实参的传递方式

位置参数

实参的顺序和形参必须一一对应。

python

def user_info(name, age, address): print(f'我叫:{name}, 年龄:{age}, 地址:{address}') user_info('张三', 18, '北京') # 顺序必须一致
关键字参数

实参以“键=值”的形式传递,顺序可以随意。

python

user_info(address='上海', name='李四', age=19)
混合使用

位置参数必须在关键字参数之前。

python

user_info('李白', address='唐朝', age=100) # 正确 # user_info(address='唐朝', '李白', age=100) # 错误!位置参数不能放后面

3.2 形参的定义方式

缺省参数(默认参数)

给形参设置一个默认值,调用时如果不传,就使用默认值。

python

def user_info(name, age, address='北京'): print(f'我叫:{name}, 年龄:{age}, 地址:{address}') user_info('张三', 18) # 地址用默认值“北京” user_info('张三', 18, '上海') # 地址用传入的“上海”

注意:缺省参数必须放在普通参数后面,不定长参数前面

不定长参数(可变参数)

有时候我们不知道调用者会传入多少个参数,这时可以用不定长参数。

*args:接收任意个位置参数,打包成元组

python

def fun01(*args): print(args) # (1, 10, False, 'abc') print(type(args)) # <class 'tuple'> fun01(1, 10, False, 'abc')

**kwargs:接收任意个关键字参数,打包成字典

python

def fun02(**kwargs): print(kwargs) # {'name': '张三', 'age': 18, 'address': '北京'} print(type(kwargs)) # <class 'dict'> fun02(name='张三', age=18, address='北京')
完全体函数

把普通参数、缺省参数、不定长参数放在一起:

python

def fun03(name, age, address='北京', *args, **kwargs): print(f'我叫:{name}, 年龄:{age}, 地址:{address}') print(f'args: {args}') # 额外的位置参数 print(f'kwargs: {kwargs}') # 额外的关键字参数 fun03('乔峰', 38, '上海', 10, 20, 30, aa='11', bb=22, cc='降龙十八掌')

输出:

text

我叫:乔峰, 年龄:38, 地址:上海 args: (10, 20, 30) kwargs: {'aa': '11', 'bb': 22, 'cc': '降龙十八掌'}

3.3 实战:任意个整数求和

python

def get_sum(*args): return sum(args) # sum() 是Python内置求和函数 print(get_sum()) # 0 print(get_sum(10, 20)) # 30 print(get_sum(1, 2, 3, 4, 5)) # 15

如果需要同时处理位置参数和关键字参数:

python

def get_sum(*args, **kwargs): return sum(args) + sum(kwargs.values()) result = get_sum(1, 2, 3, a=10, b=20, c=30) print(result) # 66

四、lambda表达式:匿名函数

有些函数非常简单,只做一件事,只有一行代码。我们不想专门用def定义一个函数,这时可以用lambda表达式(匿名函数)。

4.1 lambda的基本格式

python

lambda 形参列表 : 表达式

等价于:

python

def 函数名(形参列表): return 表达式

4.2 案例对比

无参lambda

python

def func01(): return 100 my_lambda1 = lambda: 100 print(my_lambda1()) # 100
有参lambda

python

def func02(a, b): return a + b my_lambda2 = lambda a, b: a + b print(my_lambda2(11, 22)) # 33
带默认参数的lambda

python

def func03(a, b, c=100): return a + b + c my_lambda3 = lambda a, b, c=100: a + b + c print(my_lambda3(11, 22)) # 133
带if判断的lambda

python

def func04(a): return True if a % 2 == 0 else False my_lambda4 = lambda a: True if a % 2 == 0 else False print(my_lambda4(11)) # False print(my_lambda4(12)) # True

4.3 lambda的应用场景

lambda最常见的用途是作为函数的参数,比如sort()key参数。

案例1:对列表嵌套字典进行排序

python

students = [ {'name': 'Tom', 'age': 20}, {'name': 'Rose', 'age': 19}, {'name': 'Jack', 'age': 22} ] # 按 name 排序 students.sort(key=lambda x: x['name']) print(students) # [{'name': 'Jack', 'age': 22}, {'name': 'Rose', 'age': 19}, {'name': 'Tom', 'age': 20}] # 按 age 排序 students.sort(key=lambda x: x['age']) print(students) # [{'name': 'Rose', 'age': 19}, {'name': 'Tom', 'age': 20}, {'name': 'Jack', 'age': 22}]
案例2:模拟计算器

定义一个函数,接收两个数和一条计算规则(lambda),返回计算结果。

python

def my_calculate(a, b, rule): """模拟计算器,按规则计算结果""" return rule(a, b) # 加法 print(my_calculate(10, 3, lambda a, b: a + b)) # 13 # 减法 print(my_calculate(10, 3, lambda a, b: a - b)) # 7 # 乘法 print(my_calculate(10, 3, lambda a, b: a * b)) # 30 # 除法 print(my_calculate(10, 3, lambda a, b: a / b)) # 3.333... # 取最大值 print(my_calculate(10, 3, lambda a, b: a if a > b else b)) # 10

这样写的好处是:my_calculate函数本身不需要知道具体做什么计算,计算规则由调用者灵活传入。这就是策略模式的简单体现。


五、总结与作业

今天我们学习了:

  • 变量的作用域:全局变量和局部变量,以及用global修改全局变量。

  • 可变与不可变类型:int、str、tuple 不可变;list、set、dict 可变。

  • 参数传递机制:位置参数、关键字参数、缺省参数、不定长参数(*args**kwargs)。

  • lambda表达式:匿名函数的定义与应用,特别是在排序和灵活计算场景中的使用。

函数是Python编程的核心,掌握这些进阶知识,你就能写出更简洁、更灵活、更专业的代码。

课后作业

  1. 写一个函数create_counter(),返回一个内部函数,每次调用内部函数时计数加1(使用nonlocal或全局变量实现)。

  2. *args写一个函数find_max,返回传入的任意个整数中的最大值(不能使用内置max)。

  3. **kwargs写一个函数print_info,接收任意个关键字参数,按格式打印每个键值对。

  4. 有一个列表[('apple', 5), ('banana', 2), ('cherry', 8)],请用sort()结合 lambda 按第二个元素排序。

  5. 用 lambda 表达式定义一个函数is_palindrome,判断一个字符串是否是回文(正反读一样),如 "aba" 返回 True,"abc" 返回 False。

欢迎在评论区分享你的代码或疑问!


📢 预告:下一节课我们将学习模块和包,让Python代码真正走向工程化!

http://www.jsqmd.com/news/528083/

相关文章:

  • TC397 freeRTOS多核工程包:支持CAN、TCP/IP及SPI通信,6核同步调度运行...
  • 2026年光刻胶冷库厂家推荐:无锡凌洋新能源设备,半导体防爆冷库/电解液冷库/电子芯片冷库厂家精选 - 品牌推荐官
  • 市面上 AI SEO 工具测评(2026):如何选择最适合你的方案?
  • 选购旧房翻新改造服务,昆明哪家口碑好又专业 - 工业品牌热点
  • OpCore Simplify:实现OpenCore EFI配置自动化的3个核心步骤
  • AI写测试代码真的靠谱吗?揭秘字节/阿里内部正在用的Python智能用例生成框架,附可运行GitHub仓库
  • Imatest 3.7 工具下载
  • JAVA剪辑接单报价比价系统源码支持小程序+公众号+H5
  • 支付宝立减金回收如何找到正规回收平台,回收步骤解析 - 京回收小程序
  • 品创共振科技联系方式:关于其全网获客服务的客观评估与通用联系方式 - 品牌推荐
  • 3分钟掌握FigmaCN:让设计师效率提升40%的中文界面解决方案
  • 2026年上海靠谱的墓地陵园服务排名:墓地陵园服务找哪家 - 工业品网
  • 2026年文旅酒店投资怎么选?拆解成都一家酒店如何通过多业态融合实现旺季日营业额破8万 - 速递信息
  • OpenClaw 视频会议应用指南:从会议纪要到自动待办
  • 2026北京茅台酒回收全指南:三大靠谱渠道深度解析 - 资讯焦点
  • 2026反应釜厂家趋势:三大核心变革重塑格局 - 速递信息
  • 柔性防火包裹高性价比优质厂商推荐 - 资讯焦点
  • 飞书机器人集成实战:OpenClaw调用Qwen3.5-4B-Claude处理工单
  • Python入门第2章:变量和简单的数据类型
  • 2026铝镁质保温板行业深度评测报告 - 资讯焦点
  • 记一次SQL注入流量分析 | 添柴不加火
  • 长城汽车消息总线全面升级,基于 RocketMQ Serverless 实现跨云双活容灾
  • 2026年实测!卫康沃伦勒夫时尚运动手环体验如何?目前卫康沃伦勒夫生产厂家沃伦勒夫显著提升服务 - 品牌推荐师
  • 2026年重庆口碑好的GEO优化服务公司推荐,细聊GEO优化对网站流量的好处 - mypinpai
  • Llama-3.2V-11B-cot 数据预处理教程:图像格式、尺寸与标准化操作
  • 北京地区老酒名酒回收避坑指南:亲测的三大五星回收行深度体验 - 资讯焦点
  • 手头闲置分期乐京东e卡套装怎么处理?这份零门槛换现金指南请收好 - 猎卡回收公众号
  • C语言log10:解析指针与内存管理(上)
  • 聊天总接不上话?这5个技巧让你秒变社交达人!
  • 北京地区老酒回收专业解析|不同需求怎么选?3 家回收行的适配人群精准定位 - 资讯焦点