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

python自学笔记第四节---函数 + 匿名函数 + 内置高阶函数 + 模块


---

## 一、函数基础

```python
# 定义
def login():
print("系统登录成功")
login() # 系统登录成功

# return 返回值
def login():
return
print(login()) # None

def login():
return 111
print(login()) # 111

def login():
return 111, "你好"
print(login()) # (111, '你好')
```

**总结:** 无返回值返回 `None`,一个返回值直接返回,多个返回值以 `tuple` 返回。

- Python 函数多返回值是天然支持的,Java 要返回多个值得用对象、数组或 `Map` 包装。

## 二、函数参数的五种形式

### 2.1 必备参数

```python
# 传参个数和类型要一致
def sum(num1, num2, num3):
return num1 + num2 + num3
print(sum(11, 22, 33)) # 66
```

### 2.2 默认参数

```python
# 注:默认参数必须在位置参数之后
# def sum(num=3, num2): ... 会报错
def sum(num1, num2, num3=10):
return num1 + num2 + num3
print(sum(11, 22)) # 43
print(sum(11, 22, 33)) # 66
```

### 2.3 可变参数 `*args`

```python
# 传入的值数量可变化,可不传、可传1个、可传多个
def sum(*args): # 以 tuple 接收
sumNum = 0
for arg in args:
sumNum += arg
return sumNum
print(sum(11, 22)) # 33
print(sum(11, 22, 33)) # 66
```

### 2.4 关键字参数 `**kwargs`

```python
def fun1(**kwargs):
print(kwargs, type(kwargs))
fun1(name="wxy", age=18) # {'name': 'wxy', 'age': 18} <class 'dict'>
```

- `*args` 收集成 `tuple`,`**kwargs` 收集成 `dict`,这是 Python 函数的灵活性来源。
- Java 没有等价语法,最接近的是可变参数 `Object... args`,但只支持位置参数。

## 三、作用域

```python
# 全局变量
str = "hello"
def hello():
print(str)
hello() # hello

# 局部变量
def hello():
str = "你好"
print(str)
hello() # 你好

# global 修改全局变量
print(str) # hello
def hello():
global str
str = "你好"
print(str)
hello() # 你好
print(str) # 你好

def study():
global score # 加上 global,局部变量变成全局变量
score = 80
study()
print(score) # 80
```

### nonlocal:声明外层的局部变量

```python
# 只能在嵌套函数中使用,影响上一级函数的值
in1 = 10
def outer():
in1 = 20
def inner():
nonlocal in1
in1 = 30
def inner1():
in1 = 40
print("inner1 局部变量:", in1)
inner1()
print("inner 局部变量:", in1)
inner()
print("outer nonlocal 局部变量:", in1)
outer()
print("全局变量:", in1)
```

- `global` 影响全局,`nonlocal` 影响上一层函数作用域,Java 没有这种细分。

## 四、匿名函数(lambda)

```python
# 语法:函数名 = lambda 形参 : 返回值(表达式)
# 普通函数
def sum(a, b, c):
return a + b + c
print(sum(1, 2, 3)) # 6

# 简化为 lambda
sum = lambda a, b, c: a + b + c
print(sum(1, 2, 3)) # 6

# 无参数
name = lambda: "wxy"
print(name()) # wxy

# 1个参数
name = lambda name: name
print(name("wxy1")) # wxy1

# 默认参数
name = lambda name, age=18: (name, age)
print(name("wxy2")) # ('wxy2', 18)
print(name("wxy2", 20)) # ('wxy2', 20)

# 关键词参数
name = lambda **kwargs: print(kwargs)
name(name="wxy2", age=20) # {'name': 'wxy2', 'age': 20}

# 结合 if else
comp = lambda a, b: "a比b大" if a > b else "a比b小"
print(comp(8, 10)) # a比b小
```

- Python 的 `lambda` 只能写一个表达式,类似 Java 的 `()->` 箭头函数,但限制更多(不能写多行)。

## 五、内置函数与高阶函数

```python
print(abs(-10)) # 10 绝对值
print(sum([1, 2, 3])) # 6 求和(支持 list/tuple/set)
print(max(1, 2, 3)) # 3
print(max(1, 2, 3, key=abs)) # 3
print(min(1, 2, 3, key=abs)) # 1
```

### 5.1 zip:打包成 tuple

```python
li1 = [1, 2, 3]
li2 = [4, 5, 6]
li3 = [4, 5]
print(zip(li1, li2)) # <zip object at 0x...>
for key in zip(li1, li2):
print(key) # (1, 4) (2, 5) (3, 6)
print(list(zip(li1, li2))) # [(1, 4), (2, 5), (3, 6)]

# 元素不一致,按短的返回
print(list(zip(li1, li3, li2))) # [(1, 4, 4), (2, 5, 5)]
```

### 5.2 map:每个元素执行函数

```python
se1 = {1, 2, 3}
mapDef = lambda a: a + 1
print(list(map(mapDef, se1))) # [2, 3, 4]
```

### 5.3 reduce:累计计算

```python
from functools import reduce
li1 = [1, 2, 3]
add = lambda a, b: a + b
print(reduce(add, li1)) # 6 计算过程:1+2=3 -> 3+3=6
```

- `map / reduce / filter` 是函数式编程三件套,对应 Java 8 的 `Stream.map / reduce / filter`。
- `zip` 是 Python 独有的多可迭代对象打包能力,Java 没有直接对应。

## 六、拆包

```python
# 含义:对于函数中的多个返回数据,去掉 tuple/list/dict,直接获取里面的数据
tua = (1, 2, 3, 4)
a, b, c, d = tua
print(a, b, c, d) # 1 2 3 4

# * 取多个元素
a, *b = tua
print(a, b) # 1 [2, 3, 4]

def fun(a, b, *args):
print(a, b, args) # 1 2 (3, 4, 5, 6, 7)
print(a, b, *args) # 1 2 3 4 5 6 7
a, b, *c = args
print(a, b, c) # 3 4 [5, 6, 7]
fun(1, 2, 3, 4, 5, 6, 7)

# 传参时拆包
dep1 = (1, 2, 3, 4, 5, 6, 7)
fun(*dep1)
```

- 拆包是 Python 独有的语法糖,Java 想做同样的事得手写下标。

## 七、异常处理

```python
# raise 自定义异常
# raise Exception("wxy抛出异常") # Exception: wxy抛出异常

# 捕获异常:遇到异常时,代码还会继续执行,程序不会终止
try:
raise Exception("wxy抛出异常")
except Exception as e:
print(e) # wxy抛出异常
print(111) # 111
```

- Python 的 `try/except` 对应 Java 的 `try/catch`,`raise` 对应 `throw`。
- Python 异常不强制声明(无 `throws` 关键字),更灵活但也更容易漏处理。

## 八、模块

```python
# 含义:一个 .py 文件就是一个模块,导入一个模块本质上就是执行一个 py 文件
# 分类:内置模块、第三方模块、自定义模块

# 导入模块
import py02
print(py02.age) # 22

# 指定导入模块中的变量或方法
from py03 import dic
print(py03.dic) # {'name': 'wxy', 'age': 18, 'tel': 123456}
print(dic) # {'name': 'wxy', 'age': 18, 'tel': 123456}

# 常用内置模块:random、time、os、logging
# 第三方模块安装:pip install pygame
# 卸载:pip uninstall pygame
# 查看已安装:pip list
```

- Python 的模块系统比 Java 的 `import` 灵活,可以导入变量、函数,不只是类。
- ⚠️ 不要过多使用 `from ... import`,可能造成命名冲突,有冲突时使用最后一个模块导入的值。

---

## 📌 与 Java 的对比

| 概念 | Java | Python |
|------|------|--------|
| 函数定义 | `[修饰符] 返回类型 方法名()` | `def 函数名():` |
| 多返回值 | 用对象/数组包装 | 直接 `return a, b` |
| 可变参数 | `int... nums` | `*args` |
| 关键字参数 | 不支持 | `**kwargs` |
| 匿名函数 | Lambda(可多行) | `lambda`(单表达式) |
| 异常 | `try/catch/finally` + `throws` | `try/except/finally` |
| 模块导入 | `import 包.类` | `import 模块` / `from 模块 import *` |
| 包管理 | Maven / Gradle | pip |

---
http://www.jsqmd.com/news/1263565/

相关文章:

  • Grok AI助手深度解析:从技术原理到开发实践的全方位指南
  • Apple无环境合成数据生成:API调用型LLM智能体训练新范式
  • PyMeasure性能优化:提升大规模实验数据处理速度的终极指南
  • Unity游戏实时翻译终极方案:XUnity.AutoTranslator从原理到实战
  • 从源码到插件:深入理解sbt-eclipse的工作原理与实现机制
  • 龙泉真武山公墓环境价格,真武山憩园怎么样 - 速递信息
  • 知名的国际EMBA择校指南,适配企业创始人 - 品牌2026推荐
  • 中考落档重塑人生赛道 武汉科谷宠物医疗专业技术学历双丰收 - 湖北升学规划
  • Stylo富文本编辑器完全指南:重新定义现代Web内容创作体验
  • 武汉科谷技工学校无人机应用技术专业招生 航拍测绘新兴行业 落档生好就业 - 湖北找学校
  • 南昌本地觅食指南:现熬骨汤锅底的火锅门店全盘点 - 品牌2026推荐
  • Scholarsome本地部署教程:在Ubuntu服务器上搭建私人学习平台
  • 普通笔记本实现大语言模型训练:从预训练到指令微调完整流程
  • React.Fragment与react-hyperscript:无额外DOM节点的组件渲染终极指南
  • AI内容检测挑战与人工干预解决方案
  • 建筑设计AI标准化框架:解决行业痛点的关键技术
  • python自学笔记第二节---流程控制 + 四大数据结构
  • 专科能申请EMBA吗?民营企业家择校选择指南 - 品牌2026推荐
  • 为什么选择laravel-soft-cascade?解决Laravel软删除级联难题
  • 大模型与智能体核心技术解析:50个关键概念实战指南
  • AI编程实战:1天构建企业级电商系统,掌握Vibe Coding与上下文工程
  • 迪奥999大牌同款包材定制:避开这3个坑,私域复购率翻倍
  • 武汉科谷技工学校电子商务专业招生 直播短视频运营 零基础落档生易上手 - 湖北找学校
  • Wan2.2工作流:AI视频生成中的闪烁抑制与镜头控制实践
  • LTX2.3图生视频模型在ComfyUI中的本地部署与优化指南
  • Python偏微分方程求解终极指南:用FiPy实现科学计算的完整方案
  • InvaderZ部署教程:如何在本地搭建会进化的太空侵略者游戏
  • AI信任危机破局:Agent技术如何跨越1%墙
  • AI教材生成技术:降重与高效编写的实践指南
  • 香港清水湾授课!港科大EMBA民营企业家选择指南 - 品牌2026推荐