Author: admin

  • 并发编程:多线程、协程和asyncio

    1|# 并发编程:多线程、协程和asyncio
    2|
    3|## Python并发编程的特殊性
    4|
    5|Java程序员写并发很直接——多线程就是真并行。但Python因为**GIL**的存在,多线程的行为和Java完全不同。
    6|
    7|## 一、GIL:Python并发最大的坑
    8|
    9|### 什么是GIL?
    10|
    11|GIL(Global Interpreter Lock,全局解释器锁)是CPython解释器中的一个互斥锁。**同一时刻,只有一个线程能执行Python字节码。**
    12|
    13|“`
    14|Java多线程:
    15|线程1: ████ ████ ████ ████ (真并行)
    16|线程2: ████ ████ ████ ████
    17|
    18|Python多线程(CPU密集型):
    19|线程1: ████____████____████ (交替执行)
    20|线程2: ____████____████____ (同一时刻只有一个)
    21|“`
    22|
    23|### 为什么有GIL?
    24|
    25|1. **引用计数垃圾回收的线程安全**:Python用引用计数管理内存,多线程同时修改引用计数会导致内存泄漏
    26|2. **C扩展兼容性**:很多C库(如NumPy底层)不是线程安全的,GIL简化了集成
    27|3. **简化CPython实现**:不需要在每个对象上加锁
    28|
    29|### GIL的释放时机
    30|
    31|GIL不是一直持有,以下情况会释放:
    32|- **IO操作**:文件读写、网络请求、time.sleep()
    33|- **C扩展执行**:NumPy的矩阵运算、Cython代码
    34|- **字节码指令计数**:每执行一定数量字节码就会检查是否释放
    35|
    36|### CPU密集型:多线程没用
    37|
    38|“`python
    39|import threading, time
    40|
    41|def cpu_bound():
    42| total = 0
    43| for i in range(10_000_000):
    44| total += i
    45|
    46|start = time.time()
    47|t1 = threading.Thread(target=cpu_bound)
    48|t2 = threading.Thread(target=cpu_bound)
    49|t1.start(); t2.start()
    50|t1.join(); t2.join()
    51|print(f”多线程: {time.time()-start:.2f}秒”) # 比单线程还慢!
    52|“`
    53|
    54|### GIL的未来
    55|
    56|- Python 3.12+:子解释器可以有独立GIL(PEP 684)
    57|- Python 3.13+:实验性free-threaded模式(可选禁用GIL)
    58|- PyPy、Jython:没有GIL的Python实现
    59|
    60|## 二、concurrent.futures:高级并发API
    61|
    62|**Java程序员最熟悉的模型**——线程池/进程池。
    63|
    64|“`python
    65|from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
    66|
    67|def download(url):
    68| time.sleep(2)
    69| return f”{url} done”
    70|
    71|# 线程池
    72|with ThreadPoolExecutor(max_workers=5) as executor:
    73| # map批量提交
    74| results = list(executor.map(download, [“url1”, “url2”, “url3”]))
    75|
    76| # as_completed:先完成先处理
    77| futures = {executor.submit(download, url): url for url in [“url1”, “url2″]}
    78| for future in as_completed(futures):
    79| print(f”{futures[future]} 完成”)
    80|
    81|# 进程池(CPU密集型)
    82|with ProcessPoolExecutor(max_workers=4) as executor:
    83| results = list(executor.map(cpu_intensive, data))
    84|“`
    85|
    86|**Java对比:** ExecutorService + Future,几乎一样的API设计。
    87|
    88|## 三、asyncio:Python最强大的并发方式
    89|
    90|### 核心概念
    91|
    92|- **协程(Coroutine)**:async def定义的函数,遇到IO时主动让出控制权
    93|- **事件循环(Event Loop)**:调度协程执行的引擎
    94|- **Task**:协程的包装,可以并发执行
    95|- **await**:暂停当前协程,等待结果
    96|
    97|### 基础用法
    98|
    99|“`python
    100|import asyncio
    101|
    102|async def fetch_data(url, delay):
    103| print(f”开始请求 {url}”)
    104| await asyncio.sleep(delay) # 异步等待(不阻塞其他协程)
    105| print(f”完成 {url}”)
    106| return {“url”: url}
    107|
    108|async def main():
    109| # gather:等待所有完成
    110| results = await asyncio.gather(
    111| fetch_data(“url1”, 2),
    112| fetch_data(“url2”, 3),
    113| fetch_data(“url3″, 1),
    114| )
    115| # 总耗时3秒(不是6秒)
    116|
    117| # as_completed:先完成先处理
    118| tasks = [fetch_data(f”url{i}”, i) for i in range(1, 4)]
    119| for coro in asyncio.as_completed(tasks):
    120| result = await coro
    121| print(f”先完成: {result}”)
    122|
    123|asyncio.run(main())
    124|“`
    125|
    126|### 任务取消与异常处理
    127|
    128|“`python
    129|async def main():
    130| task = asyncio.create_task(slow_task())
    131| await asyncio.sleep(1)
    132| task.cancel() # 取消任务
    133|
    134| # 异常处理:return_exceptions=True
    135| results = await asyncio.gather(
    136| risky_task(),
    137| safe_task(),
    138| return_exceptions=True, # 异常作为结果返回
    139| )
    140|“`
    141|
    142|### 异步迭代器和异步上下文管理器
    143|
    144|“`python
    145|# async for
    146|async def main():
    147| async for data in async_stream():
    148| process(data)
    149|
    150|# async with
    151|async with aiohttp.ClientSession() as session:
    152| async with session.get(url) as resp:
    153| data = await resp.json()
    154|“`
    155|
    156|### asyncio与多线程混合
    157|
    158|“`python
    159|async def main():
    160| loop = asyncio.get_event_loop()
    161| with ThreadPoolExecutor() as pool:
    162| # 在线程池中执行阻塞操作
    163| result = await loop.run_in_executor(pool, blocking_function)
    164|“`
    165|
    166|## 四、multiprocessing:绕过GIL
    167|
    168|### 进程间通信
    169|
    170|“`python
    171|from multiprocessing import Process, Queue, Pipe, Manager
    172|
    173|# Queue:生产者-消费者
    174|def worker(queue):
    175| queue.put(“结果”)
    176|
    177|q = Queue()
    178|Process(target=worker, args=(q,)).start()
    179|print(q.get()) # “结果”
    180|
    181|# Pipe:双向通信
    182|parent, child = Pipe()
    183|Process(target=sender, args=(child,)).start()
    184|print(parent.recv())
    185|
    186|# Manager:共享对象
    187|with Manager() as manager:
    188| shared = manager.dict()
    189| Process(target=worker, args=(shared,)).start()
    190|“`
    191|
    192|## 五、选择指南
    193|
    194|| 场景 | 推荐 | 原因 |
    195||——|——|——|
    196|| IO密集(网络) | asyncio | 性能最好 |
    197|| IO密集(简单) | threading | 容易写 |
    198|| 已有同步代码 | concurrent.futures | 最小改动 |
    199|| CPU密集 | multiprocessing | 绕过GIL |
    200|| 混合场景 | asyncio + ProcessPoolExecutor | 最佳组合 |
    201|
    202|## 六、gevent/eventlet:其他方案
    203|
    204|“`python
    205|# gevent:基于协程的并发(monkey patch方式)
    206|from gevent import monkey; monkey.patch_all()
    207|import gevent
    208|
    209|def download(url):
    210| gevent.sleep(2)
    211| return f”{url} done”
    212|
    213|jobs = [gevent.spawn(download, url) for url in [“url1”, “url2”]]
    214|gevent.joinall(jobs)
    215|“`
    216|
    217|**注意:** gevent需要monkey patch,侵入性较强。新项目推荐asyncio。
    218|
    219|## 总结
    220|
    221|| 特性 | Python | Java |
    222||——|——–|——|
    223|| GIL | 有(限制并行) | 没有 |
    224|| 多线程 | threading | Thread |
    225|| 进程池 | ProcessPoolExecutor | 不需要 |
    226|| 异步 | asyncio/await | CompletableFuture |
    227|| 高级API | concurrent.futures | ExecutorService |
    228|
    229|**下一篇聊Python标准库精选。**
    230|
    231|—
    232|
    233|*本系列持续更新中,关注不迷路。*

  • 包管理和虚拟环境:告别DLL地狱

    # 包管理和虚拟环境:告别DLL地狱

    ## Java的Maven/Gradle vs Python的包管理

    Java程序员习惯了Maven/Gradle——一个`pom.xml`管所有依赖。Python的包管理曾经是一团糟(pip/venv/setuptools/setup.py混战),但从2024年开始,**uv**的出现彻底改变了局面。

    ## 一、pip基础(Java程序员必知)

    “`bash
    # 安装包(类似Maven的dependency)
    pip install requests
    pip install flask==2.3.0 # 指定版本(类似Maven的version标签)
    pip install flask>=2.0,<3.0 # 版本范围 # 查看已安装 pip list pip show flask # 查看包详情(类似mvn dependency:tree) # 导出依赖(类似pom.xml) pip freeze > requirements.txt

    # 从文件安装
    pip install -r requirements.txt

    # 卸载
    pip uninstall flask
    “`

    ### requirements.txt vs pom.xml

    “`
    # requirements.txt(pip格式)
    flask==2.3.0
    requests>=2.28.0
    pandas~=1.5.0 # 兼容版本(>=1.5.0, <1.6.0) ``` ```xml

    org.springframework
    spring-boot
    3.1.0

    “`

    **pip的弱点:** 没有Maven那样的传递依赖管理和冲突解决。两个包依赖同一个包的不同版本,pip可能直接装最新的,不保证兼容。

    ## 二、虚拟环境:Python版的module system

    ### 为什么需要虚拟环境?

    “`
    项目A: flask 2.0 + requests 2.28
    项目B: flask 2.3 + requests 2.31
    “`

    不用虚拟环境,两个项目的依赖会混在一起,版本冲突是家常便饭。虚拟环境让**每个项目有独立的Python包空间**。

    ### venv:标准库自带

    “`bash
    # 创建虚拟环境(在项目目录下)
    python -m venv .venv

    # 激活
    source .venv/bin/activate # Linux/Mac
    .venv\Scripts\activate # Windows

    # 激活后,pip install只影响这个环境
    pip install flask # 装到.venv里,不影响系统Python

    # 查看当前Python路径(应该是.venv里的)
    which python # /home/user/project/.venv/bin/python

    # 退出虚拟环境
    deactivate
    “`

    ### pyenv:管理Python版本

    “`bash
    # 安装pyenv
    curl https://pyenv.run | bash # 注意:生产环境建议先检查脚本

    # 或者用包管理器安装(更安全)
    sudo apt install pyenv # Ubuntu
    brew install pyenv # Mac

    # 安装Python 3.12
    pyenv install 3.12.0
    pyenv global 3.12.0 # 全局默认版本
    pyenv local 3.11.0 # 项目级版本(写入.python-version文件)

    # 查看已安装版本
    pyenv versions
    “`

    ## 三、uv:2026年最推荐的方案

    **uv**是Astral开发的Rust工具,整合了pip、venv、pyenv的功能,速度快10-100倍。

    “`bash
    # 安装uv
    curl -LsSf https://astral.sh/uv/install.sh | sh
    # 或者
    pip install uv

    # 创建项目(自动创建虚拟环境+pyproject.toml)
    uv init myproject
    cd myproject

    # 添加依赖(自动更新pyproject.toml和uv.lock)
    uv add flask requests
    uv add –dev pytest black mypy

    # 同步依赖(从lock文件安装,类似npm ci)
    uv sync

    # 运行
    uv run python main.py
    uv run pytest

    # 管理Python版本
    uv python install 3.12
    uv python pin 3.12
    “`

    ### uv vs pip vs poetry

    | 特性 | pip | poetry | uv |
    |——|—–|——–|—–|
    | 速度 | 慢 | 中等 | **极快** |
    | 依赖锁定 | requirements.txt | poetry.lock | uv.lock |
    | 虚拟环境 | 需手动创建 | 自动管理 | 自动管理 |
    | Python版本 | 需pyenv | 需pyenv | **内置管理** |
    | 项目脚手架 | 无 | poetry new | uv init |

    **2026年新项目首选uv,老项目用pip也够用。**

    ## 四、pyproject.toml:现代Python的pom.xml

    “`toml
    # pyproject.toml(PEP 621标准)
    [project]
    name = “myproject”
    version = “0.1.0”
    description = “我的项目”
    readme = “README.md”
    requires-python = “>=3.11”
    dependencies = [
    “flask>=3.0”,
    “requests>=2.31”,
    “pydantic>=2.0”,
    ]

    [project.optional-dependencies]
    dev = [
    “pytest>=7.0”,
    “black>=23.0”,
    “mypy>=1.0”,
    ]

    [tool.black]
    line-length = 88
    target-version = [“py312”]

    [tool.mypy]
    python_version = “3.12”
    strict = true
    “`

    **对比pom.xml:** pyproject.toml是TOML格式,比XML简洁,而且被pip、poetry、uv、hatch等所有工具支持。

    ## 五、pipx:CLI工具隔离安装

    “`bash
    # 安装pipx
    pip install pipx

    # 用pipx安装CLI工具(不污染全局环境)
    pipx install black
    pipx install poetry
    pipx install ruff

    # 升级
    pipx upgrade black

    # 列出已安装
    pipx list
    “`

    **Java类比:** pipx就像把`mvn`、`gradle`装到独立目录,不和项目依赖混在一起。

    ## 六、editable install:开发必备

    “`bash
    # 开发模式安装(代码改了立刻生效,不需要重新安装)
    pip install -e .

    # 或者用uv
    uv pip install -e .
    “`

    **场景:** 你有一个本地包`mylib`,在`src/mylib/`下写代码。用`-e .`安装后,改了`mylib`的代码不需要重新`pip install`,直接生效。

    ## 七、项目结构最佳实践

    “`
    myproject/
    ├── pyproject.toml # 项目配置(取代setup.py + requirements.txt)
    ├── uv.lock # 依赖锁定(或poetry.lock)
    ├── README.md
    ├── .python-version # Python版本(pyenv/uv读取)
    ├── src/
    │ └── myproject/
    │ ├── __init__.py
    │ ├── main.py
    │ ├── models/
    │ │ ├── __init__.py
    │ │ └── user.py
    │ └── utils/
    │ ├── __init__.py
    │ └── helpers.py
    ├── tests/
    │ ├── __init__.py
    │ └── test_main.py
    ├── .gitignore
    └── .pre-commit-config.yaml # pre-commit hooks
    “`

    ## 八、常用工具对比

    | 功能 | Python工具 | Java工具 |
    |——|———–|———|
    | 包管理 | pip / uv | Maven / Gradle |
    | 依赖文件 | requirements.txt / pyproject.toml | pom.xml / build.gradle |
    | 依赖锁定 | uv.lock / poetry.lock | mvnw / gradle wrapper |
    | 虚拟环境 | venv / uv venv | module system |
    | Python版本 | pyenv / uv python | JDK管理(sdkman) |
    | 格式化 | black / ruff format | google-java-format |
    | 代码检查 | ruff / pylint / flake8 | Checkstyle / SpotBugs |
    | 测试 | pytest | JUnit |
    | 类型检查 | mypy | 编译器自带 |
    | CLI工具隔离 | pipx | SDKMAN |

    ## 总结

    Python的包管理已经从”一团糟”进化到了现代化阶段。**uv是2026年的最佳选择**,一个工具搞定一切。如果项目用不了uv,pip+venv+pyproject.toml也足够了。

    **下一篇聊并发编程——多线程、协程和asyncio。**

    *本系列持续更新中,关注不迷路。*

  • 异常处理和调试:Python的try-catch长什么样?

    # 异常处理和调试:Python的try-catch长什么样?

    ## 基础异常处理

    “`python
    try:
    result = 10 / 0
    except ZeroDivisionError as e:
    print(f”除零错误: {e}”)
    except (TypeError, ValueError) as e:
    print(f”类型或值错误: {e}”)
    except Exception as e:
    print(f”其他错误: {e}”)
    else:
    print(“没有异常时执行”)
    finally:
    print(“总是执行”)
    “`

    **区别:** Python用`except`不用`catch`,可以用元组捕获多种异常,还有`else`块。

    ## 自定义异常

    “`python
    class InsufficientBalanceError(Exception):
    def __init__(self, balance, amount):
    self.balance = balance
    self.amount = amount
    super().__init__(f”余额不足: 当前{balance}元, 取出{amount}元”)

    class BankAccount:
    def __init__(self, balance):
    self.balance = balance

    def withdraw(self, amount):
    if amount > self.balance:
    raise InsufficientBalanceError(self.balance, amount)
    self.balance -= amount
    return self.balance

    account = BankAccount(100)
    try:
    account.withdraw(200)
    except InsufficientBalanceError as e:
    print(e) # 余额不足: 当前100元, 取出200元
    “`

    ## 上下文管理器(with语句)

    “`python
    with open(“data.txt”, “r”) as f:
    content = f.read()
    # 自动关闭文件

    # 自定义上下文管理器
    from contextlib import contextmanager

    @contextmanager
    def database_connection(url):
    print(f”连接到 {url}”)
    conn = “模拟连接”
    try:
    yield conn
    finally:
    print(“关闭连接”)

    with database_connection(“mysql://localhost/db”) as conn:
    print(f”使用 {conn}”)
    “`

    ## pdb调试器

    “`python
    def complex_function(data):
    result = []
    for item in data:
    processed = item.strip().lower()
    breakpoint() # Python 3.7+ 自动启动pdb
    if processed:
    result.append(processed)
    return result
    “`

    **常用命令:** n(下一步), s(进入函数), c(继续), p var(打印变量), q(退出)

    ## logging模块

    “`python
    import logging

    logging.basicConfig(
    level=logging.DEBUG,
    format=’%(asctime)s – %(levelname)s – %(message)s’,
    handlers=[
    logging.FileHandler(‘app.log’),
    logging.StreamHandler()
    ]
    )

    logger = logging.getLogger(__name__)
    logger.info(“一般信息”)
    logger.error(“错误”)

    try:
    1 / 0
    except Exception as e:
    logger.exception(“除零错误”) # 自动记录堆栈
    “`

    ## 最佳实践

    “`python
    # 不要吞掉异常
    try:
    do_something()
    except Exception:
    pass # BAD!

    # 应该记录并处理
    try:
    do_something()
    except Exception as e:
    logger.error(f”处理失败: {e}”)
    raise # 或做恢复操作
    “`

    ## 总结

    | 特性 | Python | Java |
    |——|——–|——|
    | 异常捕获 | except | catch |
    | 资源管理 | with语句 | try-with-resources |
    | 调试器 | pdb/breakpoint | IDE断点 |
    | 日志 | logging | SLF4J+Logback |
    | 检查型异常 | 没有 | 有 |

    **下一篇聊包管理和虚拟环境。**

    *本系列持续更新中,关注不迷路。*

  • 迭代器和生成器:优雅处理大数据的秘密武器

    # 迭代器和生成器:优雅处理大数据的秘密武器

    ## 为什么Java程序员需要了解生成器?

    Java处理大数据用Stream API,Python处理大数据用**生成器(Generator)**。

    核心思想一样:**惰性求值,按需计算**。但Python的生成器语法更简洁。

    ## 一、迭代器基础

    “`python
    # for循环本质就是迭代器
    nums = [1, 2, 3, 4, 5]
    it = iter(nums)
    while True:
    try:
    num = next(it)
    print(num)
    except StopIteration:
    break
    “`

    ### 自定义迭代器

    “`python
    class CountDown:
    def __init__(self, start):
    self.current = start

    def __iter__(self):
    return self

    def __next__(self):
    if self.current <= 0: raise StopIteration self.current -= 1 return self.current + 1 for num in CountDown(5): print(num) # 5, 4, 3, 2, 1 ``` ## 二、生成器:迭代器的语法糖 ```python def countdown(start): while start > 0:
    yield start # yield代替return
    start -= 1

    for num in countdown(5):
    print(num) # 5, 4, 3, 2, 1
    “`

    ### 生成器 vs 列表

    “`python
    import sys

    # 列表:一次性加载
    squares_list = [x**2 for x in range(10000)]
    print(sys.getsizeof(squares_list)) # ~87,624 bytes

    # 生成器:按需生成
    squares_gen = (x**2 for x in range(10000))
    print(sys.getsizeof(squares_gen)) # ~200 bytes

    # 差距400倍!
    “`

    ### 处理大文件

    “`python
    def read_large_file(filepath):
    with open(filepath, ‘r’) as f:
    for line in f:
    yield line.strip()

    # 处理10GB日志,内存恒定
    error_count = 0
    for line in read_large_file(“/var/log/app.log”):
    if “ERROR” in line:
    error_count += 1
    “`

    ## 三、生成器表达式

    “`python
    # 列表推导式 -> 生成器表达式([]换())
    squares = (x**2 for x in range(1000000))

    # 配合sum,不占内存
    total = sum(x**2 for x in range(1000000))

    # 找第一个大于1000的平方
    first_big = next(x**2 for x in range(100) if x**2 > 1000)
    # 1024
    “`

    ## 四、yield from:委托生成器

    “`python
    def flatten(nested_list):
    for item in nested_list:
    if isinstance(item, list):
    yield from flatten(item)
    else:
    yield item

    nested = [1, [2, 3], [4, [5, 6]], 7]
    print(list(flatten(nested)))
    # [1, 2, 3, 4, 5, 6, 7]
    “`

    ## 五、itertools库

    “`python
    import itertools

    # 组合
    items = [‘A’, ‘B’, ‘C’, ‘D’]
    print(list(itertools.combinations(items, 2)))

    # 分组
    data = [(‘A’, 1), (‘A’, 2), (‘B’, 3), (‘B’, 4)]
    for key, group in itertools.groupby(data, key=lambda x: x[0]):
    print(f”{key}: {list(group)}”)

    # 链接
    combined = itertools.chain([1, 2], [3, 4], [5, 6])
    print(list(combined)) # [1, 2, 3, 4, 5, 6]
    “`

    ## 六、实战:数据管道

    “`python
    def read_data(filepath):
    with open(filepath) as f:
    for line in f:
    yield line.strip().split(‘,’)

    def filter_by_age(records, min_age):
    for record in records:
    if int(record[1]) >= min_age:
    yield record

    def format_output(records):
    for record in records:
    yield f”姓名: {record[0]}, 年龄: {record[1]}”

    # 管道连接(100万条数据,内存几乎为零)
    pipeline = format_output(filter_by_age(read_data(“users.csv”), 18))
    for result in pipeline:
    print(result)
    “`

    ## 总结

    | 特性 | Python生成器 | Java Stream |
    |——|————-|————-|
    | 语法 | yield / 表达式 | .stream() |
    | 内存 | 极低 | 极低 |
    | 可多次遍历 | 一次性 | 一次性 |
    | 嵌套处理 | yield from | flatMap |

    **下一篇聊异常处理和调试。**

    *本系列持续更新中,关注不迷路。*

  • 面向对象:Python的类和Java有什么不一样?

    # 面向对象:Python的类和Java有什么不一样?

    ## 你熟悉的OOP,Python全都有

    Java程序员最熟悉的就是面向对象了。Python同样支持OOP,但**语法更灵活,限制更少**。

    没有interface?没有private?没有构造函数重载?Python用另一套方式解决了这些问题。

    ## 一、类的定义

    “`python
    # Python
    class Student:
    def __init__(self, name, age, score):
    self.name = name
    self.age = age
    self.score = score

    def is_pass(self):
    return self.score >= 60

    def __str__(self):
    return f”Student({self.name}, {self.age}岁, {self.score}分)”

    s = Student(“张三”, 20, 85)
    print(s) # Student(张三, 20岁, 85分)
    print(s.is_pass()) # True
    “`

    “`java
    // Java
    public class Student {
    private String name;
    private int age;
    private int score;

    public Student(String name, int age, int score) {
    this.name = name;
    this.age = age;
    this.score = score;
    }

    public boolean isPass() {
    return this.score >= 60;
    }
    }
    “`

    **区别:**
    – `__init__`是Python的初始化方法
    – `self`相当于Java的`this`,但必须显式写
    – `__str__`相当于`toString()`
    – Python不需要写访问修饰符

    ## 二、访问控制:没有private?

    Python用命名约定实现:

    “`python
    class BankAccount:
    def __init__(self, owner, balance):
    self.owner = owner # 公开
    self._balance = balance # 约定protected
    self.__pin = “1234” # 名称改写private

    def get_balance(self):
    return self._balance

    account = BankAccount(“张三”, 10000)
    print(account.owner) # OK
    print(account._balance) # 能访问但不该
    # print(account.__pin) # 报错
    print(account._BankAccount__pin) # 能绕过去
    “`

    **哲学:** “We are all consenting adults here”。信任程序员,不做强制限制。

    ## 三、没有interface?用ABC

    “`python
    from abc import ABC, abstractmethod

    class Shape(ABC):
    @abstractmethod
    def area(self):
    pass

    @abstractmethod
    def perimeter(self):
    pass

    def describe(self):
    return f”面积: {self.area()}, 周长: {self.perimeter()}”

    class Circle(Shape):
    def __init__(self, radius):
    self.radius = radius

    def area(self):
    return 3.14159 * self.radius ** 2

    def perimeter(self):
    return 2 * 3.14159 * self.radius

    shapes = [Circle(5), Circle(3)]
    for shape in shapes:
    print(shape.describe())
    # s = Shape() # 报错!不能实例化抽象类
    “`

    ## 四、@property:Python的getter/setter

    “`python
    class Circle:
    def __init__(self, radius):
    self._radius = radius

    @property
    def radius(self):
    return self._radius

    @radius.setter
    def radius(self, value):
    if value < 0: raise ValueError("半径不能为负数") self._radius = value @property def area(self): return 3.14159 * self._radius ** 2 c = Circle(5) print(c.radius) # 5 c.radius = 10 print(c.area) # 314.159 ``` ## 五、多重继承 ```python class Flyable: def fly(self): return "我在飞" class Swimmable: def swim(self): return "我在游泳" class Duck(Flyable, Swimmable): pass duck = Duck() print(duck.fly()) # "我在飞" print(duck.swim()) # "我在游泳" ``` ## 六、魔术方法 ```python class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) def __mul__(self, scalar): return Vector(self.x * scalar, self.y * scalar) def __eq__(self, other): return self.x == other.x and self.y == other.y def __repr__(self): return f"Vector({self.x}, {self.y})" def __getitem__(self, index): if index == 0: return self.x if index == 1: return self.y raise IndexError v1 = Vector(1, 2) v2 = Vector(3, 4) print(v1 + v2) # Vector(4, 6) print(v1 * 3) # Vector(3, 6) print(v1[0]) # 1 ``` ## 总结 | 特性 | Python | Java | |------|--------|------| | 构造函数 | __init__ | 类名同名方法 | | 访问控制 | 命名约定 | private/protected/public | | 接口 | ABC抽象基类 | interface | | getter/setter | @property | getXxx/setXxx | | 多重继承 | 支持 | 不支持 | | 运算符重载 | __add__等 | 不支持 | **下一篇聊迭代器和生成器。** --- *本系列持续更新中,关注不迷路。*

  • 函数是Python的灵魂:lambda、装饰器、闭包

    # 函数是Python的灵魂:lambda、装饰器、闭包

    ## Python的函数和Java有什么不一样?

    在Java里,函数必须写在类里面。在Python里,**函数是一等公民**——可以赋值给变量、作为参数传递、作为返回值。

    这个区别决定了Python的编程范式完全不同。

    ## 一、基础函数

    ### 定义和调用

    “`python
    # Python
    def greet(name):
    return f”你好,{name}”

    # 调用
    message = greet(“张三”)
    “`

    “`java
    // Java
    public String greet(String name) {
    return “你好,” + name;
    }
    “`

    ### 默认参数

    “`python
    # Python:直接在参数上设默认值
    def greet(name, greeting=”你好”):
    return f”{greeting},{name}”

    greet(“张三”) # “你好,张三”
    greet(“张三”, “早上好”) # “早上好,张三”
    “`

    “`java
    // Java 8以前:只能方法重载
    // Java没有默认参数,要用重载或者Builder模式
    public String greet(String name) {
    return greet(name, “你好”);
    }
    public String greet(String name, String greeting) {
    return greeting + “,” + name;
    }
    “`

    ### 可变参数

    “`python
    # Python:*args接收任意数量的参数
    def total(*numbers):
    return sum(numbers)

    total(1, 2, 3) # 6
    total(1, 2, 3, 4, 5) # 15

    # **kwargs接收任意关键字参数
    def print_info(**kwargs):
    for key, value in kwargs.items():
    print(f”{key}: {value}”)

    print_info(name=”张三”, age=25, city=”北京”)
    “`

    “`java
    // Java的可变参数
    public int total(int… numbers) {
    return Arrays.stream(numbers).sum();
    }
    // 但没有**kwargs这种东西
    “`

    ## 二、Lambda匿名函数

    “`python
    # Python lambda
    add = lambda x, y: x + y
    print(add(1, 2)) # 3

    # 常见用法:排序
    students = [(“张三”, 90), (“李四”, 85), (“王五”, 95)]
    students.sort(key=lambda s: s[1], reverse=True)
    # [(“王五”, 95), (“张三”, 90), (“李四”, 85)]

    # 常见用法:过滤
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    evens = list(filter(lambda x: x % 2 == 0, numbers))
    “`

    “`java
    // Java lambda
    BinaryOperator add = (x, y) -> x + y;

    // 排序
    students.sort(Comparator.comparing(s -> s.score).reversed());

    // 过滤
    List evens = numbers.stream()
    .filter(x -> x % 2 == 0)
    .collect(Collectors.toList());
    “`

    **区别:** Python的lambda只能写一行表达式,不能写复杂逻辑。但Python有更强大的替代方案——装饰器和闭包。

    ## 三、闭包:Java没有的东西

    闭包就是一个**函数记住了它被创建时的环境变量**。

    “`python
    def make_counter(start=0):
    count = [start] # 用列表包裹,因为int是不可变的
    def counter():
    count[0] += 1
    return count[0]
    return counter

    # 创建计数器
    c = make_counter(10)
    print(c()) # 11
    print(c()) # 12
    print(c()) # 13

    # 每个计数器独立
    c1 = make_counter(0)
    c2 = make_counter(100)
    print(c1()) # 1
    print(c2()) # 101
    “`

    **Java实现同样功能:**
    “`java
    // 需要一个类来保存状态
    public class Counter {
    private int count;
    public Counter(int start) { this.count = start; }
    public int next() { return ++count; }
    }
    // 或者用AtomicInteger + lambda,但远不如Python简洁
    “`

    闭包的经典用途——**柯里化(Currying):**

    “`python
    def make_multiplier(n):
    return lambda x: x * n

    double = make_multiplier(2)
    triple = make_multiplier(3)

    print(double(5)) # 10
    print(triple(5)) # 15
    “`

    ## 四、装饰器:Python版AOP

    装饰器是Python最强大的特性之一。它本质上是一个**接受函数、返回函数**的高阶函数。

    ### 基础装饰器

    “`python
    import time

    def timer(func):
    def wrapper(*args, **kwargs):
    start = time.time()
    result = func(*args, **kwargs)
    end = time.time()
    print(f”{func.__name__} 耗时 {end-start:.2f}秒”)
    return result
    return wrapper

    # 使用@语法
    @timer
    def slow_function():
    time.sleep(1)
    print(“执行完毕”)

    slow_function()
    # 输出:
    # 执行完毕
    # slow_function 耗时 1.00秒
    “`

    **Java实现同样功能(AOP):**
    “`java
    // 需要Spring AOP或者字节码增强
    @Aspect
    @Component
    public class TimerAspect {
    @Around(“execution(* com.example.*.*(..))”)
    public Object timer(ProceedingJoinPoint pjp) throws Throwable {
    long start = System.currentTimeMillis();
    Object result = pjp.proceed();
    long end = System.currentTimeMillis();
    System.out.println(pjp.getSignature() + ” 耗时 ” + (end-start) + “ms”);
    return result;
    }
    }
    “`

    Python的装饰器不需要框架,不需要注解处理,**一个函数搞定**。

    ### 带参数的装饰器

    “`python
    def retry(max_attempts=3):
    def decorator(func):
    def wrapper(*args, **kwargs):
    for attempt in range(max_attempts):
    try:
    return func(*args, **kwargs)
    except Exception as e:
    if attempt == max_attempts – 1:
    raise
    print(f”第{attempt+1}次失败,重试中…”)
    return wrapper
    return decorator

    @retry(max_attempts=5)
    def unreliable_api():
    import random
    if random.random() < 0.7: raise Exception("请求失败") return "成功" ``` **这个retry装饰器,Java要写一个注解+一个切面类+一个拦截器,Python 10行搞定。** ### 装饰器的常见用途 ```python # 记忆化(缓存) from functools import lru_cache @lru_cache(maxsize=128) def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) # 登录验证 def login_required(func): def wrapper(request, *args, **kwargs): if not request.user.is_authenticated: return redirect("/login") return func(request, *args, **kwargs) return wrapper @login_required def dashboard(request): return "欢迎来到控制面板" ``` ## 五、函数式编程工具 ```python # map:对每个元素应用函数 numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x**2, numbers)) # [1, 4, 9, 16, 25] # filter:过滤元素 evens = list(filter(lambda x: x % 2 == 0, numbers)) # [2, 4] # reduce:累积计算 from functools import reduce total = reduce(lambda a, b: a + b, numbers) # 15 # 但更推荐用列表推导式(更Pythonic) squared = [x**2 for x in numbers] evens = [x for x in numbers if x % 2 == 0] ``` ## 总结 | 特性 | Python | Java | |------|--------|------| | 函数定义 | def直接写 | 必须在类里 | | 匿名函数 | lambda(一行) | lambda(一行) | | 闭包 | 天然支持 | 需要类包装 | | 装饰器 | @语法糖 | AOP框架 | | 可变参数 | *args/**kwargs | varargs | | 函数作为参数 | 直接传 | 函数式接口 | **Python的函数式编程比Java简洁得多,核心原因是函数是"一等公民"。** 下一篇聊Python的面向对象——没有interface、没有private关键字,Python的OOP是怎么玩的? --- *本系列持续更新中,关注不迷路。*

  • Python的数据世界:列表、字典、集合,比Java强太多

    # Python的数据世界:列表、字典、集合,比Java强太多

    ## 为什么说Python的数据结构是杀手锏?

    Java程序员最常用的集合类:ArrayList、HashMap、HashSet。Python也有对应的list、dict、set,但**用起来爽太多了**。

    原因是Python把这些数据结构做成了**语言内置的语法**,而不是像Java那样只是库里的类。

    ## 一、列表(list):比ArrayList强在哪?

    ### 基本操作

    “`python
    # 创建
    fruits = [“苹果”, “香蕉”, “橘子”]

    # 访问(和Java一样从0开始)
    first = fruits[0] # “苹果”

    # 修改
    fruits[1] = “草莓”

    # 长度
    print(len(fruits)) # 3

    # 添加
    fruits.append(“西瓜”) # 末尾添加
    fruits.insert(1, “葡萄”) # 指定位置插入

    # 删除
    fruits.remove(“香蕉”) # 按值删除
    popped = fruits.pop() # 弹出最后一个
    “`

    ### 骚操作:切片(Slice)

    这是Java没有的。切片可以让你用一行代码完成Java要写一个循环才能做的事:

    “`python
    nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    # 取前3个
    first_three = nums[:3] # [0, 1, 2]

    # 取后3个
    last_three = nums[-3:] # [7, 8, 9]

    # 从第2个到第5个
    middle = nums[2:5] # [2, 3, 4]

    # 每隔2个取一个
    every_other = nums[::2] # [0, 2, 4, 6, 8]

    # 反转
    reversed_list = nums[::-1] # [9, 8, 7, …, 0]

    # 切片赋值(Java想都别想)
    nums[2:5] = [20, 30, 40] # [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
    “`

    **Java要实现同样的功能:**
    “`java
    List nums = List.of(0,1,2,3,4,5,6,7,8,9);
    List firstThree = nums.subList(0, 3);
    // 反转?Collections.reverse(nums)…
    // 切片赋值?写个循环吧…
    “`

    ### 列表推导式

    一行代码生成一个列表,比Java的Stream还简洁:

    “`python
    # 生成0-99的偶数平方
    squares = [x**2 for x in range(100) if x % 2 == 0]

    # 等价的Java代码:
    // List squares = IntStream.range(0, 100)
    // .filter(x -> x % 2 == 0)
    // .map(x -> x * x)
    // .boxed()
    // .collect(Collectors.toList());
    “`

    ## 二、字典(dict):比HashMap好用10倍

    ### 基本操作

    “`python
    # 创建
    user = {
    “name”: “张三”,
    “age”: 25,
    “skills”: [“Java”, “Python”]
    }

    # 访问
    name = user[“name”] # “张三”
    # 安全访问(不存在返回默认值)
    score = user.get(“score”, 0) # 0

    # 修改
    user[“age”] = 26

    # 添加
    user[“email”] = “zhangsan@example.com”

    # 删除
    del user[“email”]

    # 遍历
    for key, value in user.items():
    print(f”{key}: {value}”)
    “`

    ### 字典推导式

    “`python
    # 从列表创建字典
    names = [“张三”, “李四”, “王五”]
    scores = [90, 85, 95]
    grade_book = {name: score for name, score in zip(names, scores)}
    # {“张三”: 90, “李四”: 85, “王五”: 95}

    # 过滤
    passed = {k: v for k, v in grade_book.items() if v >= 90}
    # {“张三”: 90, “王五”: 95}
    “`

    ### 嵌套字典

    “`python
    # 多层嵌套
    company = {
    “engineering”: {
    “backend”: {“java”: 5, “python”: 3},
    “frontend”: {“react”: 4, “vue”: 2}
    },
    “product”: {
    “pm”: 3,
    “design”: 2
    }
    }

    # 访问嵌套值
    java_count = company[“engineering”][“backend”][“java”] # 5
    “`

    **Java做同样的事要写多少代码?** Map嵌套Map,类型声明一堆,访问时还要各种强制转换。Python一行搞定。

    ### 常用技巧

    “`python
    # 合并两个字典
    dict1 = {“a”: 1, “b”: 2}
    dict2 = {“b”: 3, “c”: 4}
    merged = {**dict1, **dict2} # {“a”: 1, “b”: 3, “c”: 4}

    # 按值排序
    sorted_dict = dict(sorted(grade_book.items(), key=lambda x: x[1], reverse=True))

    # 获取所有key/value
    keys = list(user.keys())
    values = list(user.values())
    “`

    ## 三、集合(set):去重和集合运算

    “`python
    # 创建
    a = {1, 2, 3, 4}
    b = {3, 4, 5, 6}

    # 去重(最常用的场景)
    names = [“张三”, “李四”, “张三”, “王五”, “李四”]
    unique_names = list(set(names)) # [“张三”, “李四”, “王五”]

    # 集合运算
    print(a | b) # 并集: {1, 2, 3, 4, 5, 6}
    print(a & b) # 交集: {3, 4}
    print(a – b) # 差集: {1, 2}
    print(a ^ b) # 对称差集: {1, 2, 5, 6}

    # 判断元素是否存在(O(1)复杂度)
    print(3 in a) # True
    “`

    ## 四、tuple:不可变列表

    “`python
    # tuple创建后不能修改
    point = (10, 20)
    # point[0] = 30 # 报错!

    # 但可以解包
    x, y = point
    print(x, y) # 10 20

    # 多变量赋值(Python独有)
    a, b, c = 1, 2, 3
    a, b = b, a # 交换变量,不需要临时变量!
    “`

    **Java交换两个变量要写:**
    “`java
    int temp = a;
    a = b;
    b = temp;
    “`

    **Python一行:**
    “`python
    a, b = b, a
    “`

    ## 五、数据结构选择速查表

    | 需求 | Python | Java |
    |——|——–|——|
    | 有序可变 | list | ArrayList |
    | 有序不可变 | tuple | List.of() |
    | 键值对 | dict | HashMap |
    | 去重 | set | HashSet |
    | 默认值字典 | defaultdict | HashMap + computeIfAbsent |
    | 计数 | Counter | 手写Map统计 |
    | 命名元组 | namedtuple | record (Java 16+) |

    ## 总结

    Python的数据结构比Java简洁太多,核心原因是:
    1. **语法内置**——list/dict/set直接用语法创建,不需要new
    2. **切片操作**——一行代码完成Java要写循环的事
    3. **推导式**——集合操作的终极简洁写法
    4. **动态类型**——不需要声明泛型参数

    **下一篇聊Python的函数**——lambda、装饰器、闭包,这些才是Python的灵魂。

    *本系列持续更新中,关注不迷路。*

  • Java程序员转Python:别慌,你已经会了一半

    # Java程序员转Python:别慌,你已经会了一半

    ## 写在前面

    如果你是一个有经验的Java程序员,想转Python,恭喜你——**你已经会了一半**。

    Python和Java都是高级语言,很多概念是相通的。变量、循环、条件、面向对象、异常处理……这些你都学过。区别只是语法和思维方式。

    这篇文章帮你快速上手Python,重点讲**Java程序员最容易踩的坑**和**Python最爽的语法糖**。

    ## 环境搭建

    ### Java的JDK vs Python的解释器

    Java需要JDK,Python需要Python解释器。但Python的环境管理比Java简单得多。

    **推荐用pyenv管理Python版本:**
    “`bash
    # 安装pyenv
    curl https://pyenv.run | bash

    # 安装Python 3.12
    pyenv install 3.12.0
    pyenv global 3.12.0

    # 验证
    python –version
    “`

    **或者用conda(适合数据科学方向):**
    “`bash
    # 安装Miniconda
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    bash Miniconda3-latest-Linux-x86_64.sh

    # 创建环境
    conda create -n myproject python=3.12
    conda activate myproject
    “`

    ### IDE选择

    | Java IDE | Python IDE | 推荐度 |
    |———-|———–|——–|
    | IntelliJ IDEA | PyCharm | ⭐⭐⭐⭐⭐ 最像IDEA的体验 |
    | VS Code | VS Code + Python插件 | ⭐⭐⭐⭐⭐ 轻量且强大 |
    | Eclipse | — | 别用了 |

    如果你用惯了IDEA,直接上PyCharm,几乎零学习成本。

    ## 第一个Python程序

    ### Hello World

    **Java:**
    “`java
    public class Hello {
    public static void main(String[] args) {
    System.out.println(“Hello World”);
    }
    }
    “`

    **Python:**
    “`python
    print(“Hello World”)
    “`

    没了。没有类,没有main方法,没有分号。**一行搞定。**

    ### 变量声明

    **Java:**
    “`java
    String name = “张三”;
    int age = 25;
    double salary = 15000.0;
    boolean isWorking = true;
    “`

    **Python:**
    “`python
    name = “张三”
    age = 25
    salary = 15000.0
    is_working = True
    “`

    **关键区别:**
    – Python不需要声明类型(动态类型)
    – 变量名用下划线命名(snake_case),不用驼峰
    – 布尔值是`True`/`False`,不是`true`/`false`
    – 没有分号,**缩进就是语法**

    ### 字符串操作

    **Java:**
    “`java
    String name = “张三”;
    String greeting = “你好,” + name;
    int len = name.length();
    String upper = name.toUpperCase();
    boolean contains = name.contains(“三”);
    “`

    **Python:**
    “`python
    name = “张三”
    greeting = f”你好,{name}” # f-string,比Java的String.format好用10倍
    length = len(name)
    upper = name.upper()
    contains = “三” in name # 直接用in关键字
    “`

    **Python爽的地方:**
    – f-string格式化:`f”你好,{name}”`比`String.format()`简洁太多
    – `in`关键字:`”三” in name`比`.contains()`直观
    – `len()`函数:比`.length()`统一,列表字典都能用

    ## 核心差异速览

    ### 1. 动态类型 vs 强类型

    Java是**静态强类型**,Python是**动态强类型**。

    “`python
    x = 10 # int
    x = “hello” # 变成str了,完全合法
    x = [1,2,3] # 变成list了,也合法
    “`

    Java里这会编译报错,Python里完全OK。方便是方便,但也要小心——类型错误只在运行时才会发现。

    ### 2. 缩进 vs 花括号

    Java用`{}`定义代码块,Python用**缩进**(通常是4个空格)。

    “`python
    if age > 18:
    print(“成年人”) # 缩进4个空格
    if salary > 10000:
    print(“高薪”) # 再缩进4个空格
    else:
    print(“未成年”)
    “`

    **踩坑提醒:** Tab和空格不要混用,否则会报`IndentationError`。Python 4用空格缩进就对了。

    ### 3. 没有分号

    Python不需要分号。一行就是一个语句。想写多行用`\`换行或者用括号。

    ### 4. 注释

    “`python
    # 单行注释(和Java的//一样)

    ”’
    多行注释
    其实这是多行字符串
    但Python里常用它当多行注释
    ”’
    “`

    ## 文件操作对比

    **Java读文件:**
    “`java
    import java.nio.file.*;
    String content = Files.readString(Path.of(“data.txt”));
    “`

    **Python读文件:**
    “`python
    with open(“data.txt”, “r”) as f:
    content = f.read()
    “`

    Python的`with`语句就是Java的try-with-resources,自动关闭文件。

    ## 总结

    | 维度 | Java | Python |
    |——|——|——–|
    | 类型系统 | 静态强类型 | 动态强类型 |
    | 代码块 | 花括号{} | 缩进 |
    | 变量命名 | camelCase | snake_case |
    | 入口 | public static void main | 直接执行 |
    | 包管理 | Maven/Gradle | pip |
    | 编译 | 需要编译 | 解释执行 |
    | 速度 | 快 | 慢(但够用) |

    **记住:Java程序员转Python最大的障碍不是语法,而是思维方式。**

    Python追求的是**简洁和实用**,能一行写完的绝不写两行。放下Java的”仪式感”,拥抱Python的”随意感”,你就入门了。

    下一篇我们聊Python的数据结构——列表、字典、集合,这些才是Python真正的杀手锏。

    *本系列持续更新中,关注不迷路。*

  • 《AI 前沿速递 | 2026年05月10日》

    ## ActCam:零样本联合相机与三维运动控制的视频生成方法

    **英文标题:** [ActCam: Zero-Shot Joint Camera and 3D Motion Control for Video Generation](https://arxiv.org/abs/2605.06667)

    **作者:** Omar El Khalifi, Thomas Rossi, Oscar Fossey, Thibault Fouque, Ulysse Mizrahi, Philip Torr, Ivan Laptev, Fabio Pizzati, Baptiste Bellot-Gurlet

    **摘要:** 视频生成一直是 AI 内容创作的核心挑战之一,而要同时控制演员动作和镜头运动更是难上加难。ActCam 提出了一种零样本方法,能在不额外训练的情况下,从驱动视频中提取角色动作,同时允许用户逐帧调节相机的内外参数。它的核心思路很巧妙:利用预训练的图像到视频扩散模型,通过深度图和姿态条件来约束生成过程。具体来说,它采用两阶段引导策略——前期同时用姿态和稀疏深度来保证场景结构,后期丢掉深度只保留姿态引导,让高频细节有空间自由发挥。在多个基准测试上,ActCam 在视角变化较大的场景中表现尤为突出,人类评估也更倾向于它的结果。这为 AI 视频创作提供了一个更灵活的「导演」工具。

    ## UniPool:全局共享专家池的混合专家架构

    **英文标题:** [UniPool: A Globally Shared Expert Pool for Mixture-of-Experts](https://arxiv.org/abs/2605.06665)

    **作者:** Minbin Huang, Han Shi, Chuanyang Zheng, Yimeng Wu, Guoxuan Chen, Xintong Yu, Yichun Yin, Hong Cheng

    **摘要:** 混合专家(MoE)架构是大模型扩缩容的关键技术,但传统做法是每一层拥有独立的专家集,参数量随层数线性增长。UniPool 打破了这个惯例——它把所有层的专家放到一个全局共享池中,每层用独立的路由器从池中选取专家。研究团队发现了一个有趣的现象:把深层的路由器替换成随机路由,准确率只掉 1-1.6 个百分点,说明深层路由器存在大量冗余。基于此发现,UniPool 引入池级辅助损失来平衡专家利用率,并用 NormRouter 提供稀疏且尺度稳定的路由。实验显示,在五个不同规模的 LLaMA 架构模型上,UniPool 在验证损失上持续优于传统 MoE,最高降低 0.0386。更关键的是,它证明了专家参数可以随深度次线性增长——用不到 67% 的原始参数量就能达到甚至超过传统 MoE 的效果。这对大模型的高效部署意义重大。

    ## EMO:面向涌现模块化的混合专家预训练

    **英文标题:** [EMO: Pretraining Mixture of Experts for Emergent Modularity](https://arxiv.org/abs/2605.06663)

    **作者:** Ryan Wang, Akshita Bhagia, Sewon Min

    **摘要:** 当前大语言模型基本是「全家桶」式的——无论你需要的是代码、数学还是特定领域知识,都得加载整个模型。EMO 提出了一种面向模块化的 MoE 架构,让专家子集能够独立使用和组合,而且不需要人工定义哪些专家负责哪些能力。它的核心想法很直觉:同一文档的 token 往往属于相同领域,所以让同一文档内的 token 共享专家池,不同文档使用不同池。这个简单的约束让有意义的专家分组在预训练过程中自然涌现。在 1T token 上预训练的 1B 激活、14B 总参数的 EMO 模型中,只保留 25% 的专家只带来 1% 的性能下降,而传统 MoE 在同样条件下会崩溃。更重要的是,EMO 的专家子集在语义层面(数学、代码等)自动形成了专业化分工,而不是传统 MoE 那种低级语法层面的分化。这为模块化、内存高效的大模型部署开辟了新方向。

    ## 验证器支撑的数学推理难题生成框架

    **英文标题:** [Verifier-Backed Hard Problem Generation for Mathematical Reasoning](https://arxiv.org/abs/2605.06660)

    **作者:** Yuhang Lai, Jiazhan Feng, Yee Whye Teh, Ning Miao

    **摘要:** 让大模型自己出题、自己解题,听起来像是「自给自足」的理想场景,但实际操作中,出题器和解题器的自我博弈很容易陷入奖励黑客——出题器学会出一些看起来很难、但实际无效的「伪难题」。VHG 框架通过引入独立的验证器来解决这个问题。它的设计很直观:在传统的出题-解题二元对抗中加入第三方验证者,让出题器的奖励同时受到题目有效性和难度的双重约束。验证器有符号验证和 LLM 验证两种变体,在不定积分和通用数学推理任务上都进行了评估。实验结果表明,VHG 明显优于所有基线方法。这个思路对推进自主科学研究很有启发——毕竟,出好题和解好题一样重要,甚至更难。

    ## StraTA:基于策略轨迹抽象的智能体强化学习

    **英文标题:** [StraTA: Incentivizing Agentic RL with Strategic Trajectory Abstraction](https://arxiv.org/abs/2605.06642)

    **作者:** Xiangyuan Xue, Yifan Zhou, Zidong Wang, Shengji Tang, Philip Torr, Wanli Ouyang, Lei Bai, Zhenfei Yin

    **摘要:** 让大语言模型当「智能体」去做决策,目前最大的痛点是长程任务中的探索和信用分配——模型只对当前步骤做反应式决策,缺乏全局规划能力。StraTA 在智能体强化学习中引入了显式的策略轨迹抽象:先从任务初始状态采样一个简洁的「策略」,后续动作都基于这个策略执行,然后用分层的 GRPO 风格 rollout 设计同时训练策略生成和动作执行两个模块。它还加入了多样化策略 rollout 和关键性自我判断机制来增强训练。在 ALFWorld、WebShop 和 SciWorld 三个基准上的实验显示,StraTA 在样本效率和最终性能上都稳定优于强基线。ALFWorld 上达到 93.1% 的成功率,WebShop 上达到 84.2%,在 SciWorld 上更是超越了前沿闭源模型。这说明,给智能体一个「战略层」确实能显著提升长程决策能力。

    ## 编辑点评

    今天的五篇论文围绕两个核心主题展开:**大模型架构的效率革命**和**智能体能力的突破**。

    在架构层面,UniPool 和 EMO 从不同角度挑战了传统 MoE 的设计范式。UniPool 证明了专家可以跨层共享,用更少的参数达到更好的效果;EMO 则让模块化能力在预训练中自然涌现,为「按需组合」大模型提供了技术路径。两篇论文都在回答同一个问题:大模型的参数是不是一定要那么多?

    在智能体和推理层面,StraTA 通过引入策略抽象让智能体从「走一步看一步」升级为「先想清楚再行动」,在多个复杂环境中大幅超越基线。VHG 则关注一个被忽视的环节——高质量的难题生成,用三方博弈框架解决了奖励黑客问题。

    ActCam 则为 AI 视频生成带来了更精细的控制能力,让创作者能同时掌控角色表演和镜头语言。

    一句话总结:大模型正在从「越大越好」走向「越聪明越好」,架构效率和智能体规划能力是接下来的两大战场。

  • AI“幻觉”也得坐牢?百度被判道歉,律师不服不行

    # AI“幻觉”也得坐牢?百度被判道歉,律师不服不行

    ## 一个南京律师的“社死”经历

    南京有位执业律师叫李小亮,某天搜自己名字,发现百度“AI智能回答”给了他一个惊天结论——

    **“律师李小亮被判刑三年。”**

    更离谱的是,百度还把他穿律师袍的职业照,放在这句假话旁边。

    李小亮:???我什么时候坐过牢?

    这不是段子,是真事。而且这事最后闹到法院去了。

    ## 百度的AI到底说了什么?

    百度的“AI智能回答”功能,你搜东西的时候会在顶部显示一段AI生成的摘要。

    李小亮搜自己名字后,AI直接生成了一段包含虚假信息的回答:声称他“被判刑三年”,并且配上了他本人的律师职业照。

    这个回答是**完全捏造**的。李小亮没有任何违法犯罪记录。

    问题是:百度的AI幻觉,直接损害了一个执业律师的职业声誉。你想想,客户搜你名字,看到百度说你坐过牢,这生意还怎么做?

    ![案件时间线](/uploads/ai_hallucination_timeline.png)

    ## 法院怎么判的?

    李小亮把百度告了。

    百度的辩护理由是:**AI的“幻觉”和错误是技术领域的不可预见、不可避免现象。**

    说白了就是:AI犯错是正常的,我们也没办法。

    **法院没接受这个说法。**

    2024年,南京市江北新区人民法院一审判决:**百度构成诽谤**,判令百度向李小亮书面道歉。

    百度不服,上诉。

    2026年3月,南京市中级人民法院**二审维持原判**。

    ## 最狠的来了:强制执行

    判决生效了,但百度**一直没道歉**。

    2026年5月8日,李小亮向法院申请了强制执行。

    **这是国内首例因AI算法错误导致的信息侵权案件,正式进入强制执行阶段。**

    也就是说,法院已经立案强制百度道歉了。

    ## 这个案子为什么重要?

    这不只是“百度又翻车”的新闻。它对所有人都有警示意义:

    ![四个警示](/uploads/ai_hallucination_points.png)

    **1. AI幻觉不是免责金牌**

    百度说“AI犯错不可预见”,法院说:你用AI提供服务,就要为AI的输出负责。技术的进步不是侵权的挡箭牌。

    **2. 平台不能装无辜**

    百度作为AI智能回答的提供方,有义务确保内容的准确性。你赚了AI的流量红利,就得承担AI出错的风险。

    **3. 每个人都可能成为受害者**

    今天百度AI编了一个律师坐牢的故事,明天它可能编你坐牢、编你公司破产、编你出轨……AI幻觉的影响范围比你想的大得多。

    **4. 法律在追上技术**

    这个案子说明:中国法律已经开始对AI生成内容的法律责任做出明确裁判。AI不是法外之地。

    ## 普通人怎么保护自己?

    – **定期搜自己的名字**——看看AI有没有给你编故事
    – **发现虚假信息立即取证**——截图保存,必要时走法律途径
    – **向平台投诉**——虽然百度不一定理你,但投诉记录是证据
    – **关注AI内容标注**——越来越多平台会标注“AI生成”,注意分辨

    ## 写在最后

    百度AI说一个律师坐牢三年,法院判百度道歉。

    这个案子本身就像一个黑色幽默——**AI的幻觉,差点让一个律师真的“社会性死亡”。**

    技术可以犯错,但犯了错要负责。这是底线。

    *信息来源:AIBase、IT之家等公开报道。案件详情基于南京市江北新区人民法院及南京市中级人民法院公开裁判文书。截至2026年5月9日。文中观点不代表任何机构立场。*