Python 函数的高级写法有哪些?

看源码的时候,经常看到:

def func(args) -> str: ...

这种写法,问问大佬们这种写法什么意思,什么时候会用到?


Python 函数的高级写法有哪些?
11 回复

Python函数的高级写法主要围绕提升代码表达力、可读性和复用性。核心技巧包括:

1. 装饰器 (Decorators) 用于包装函数,添加额外功能(如日志、计时、权限检查)。

def timer(func):
    import time
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f"{func.__name__} took {time.time()-start:.2f}s")
        return result
    return wrapper

@timer
def heavy_computation():
    # 模拟耗时操作
    return sum(i*i for i in range(10**6))

2. 生成器 (Generators) 使用 yield 惰性生成数据,节省内存。

def read_large_file(file_path):
    with open(file_path) as f:
        for line in f:
            yield line.strip()
# 逐行处理大文件,不一次性加载

3. 闭包 (Closures) 函数返回内部函数,并保留外部作用域的变量。

def multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply
double = multiplier(2)
print(double(5))  # 输出 10

4. Lambda 与高阶函数 配合 mapfilterreduce 进行函数式操作。

from functools import reduce
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
evens = list(filter(lambda x: x%2==0, nums))
product = reduce(lambda a,b: a*b, nums)

5. 类型提示 (Type Hints) 提升代码可读性和工具支持。

from typing import List, Optional

def process_items(items: List[str], limit: Optional[int] = None) -> List[str]:
    return items[:limit] if limit else items

6. 参数解构 灵活处理参数。

def show_info(name, age, city):
    print(f"{name}, {age}, {city}")

data = ("Alice", 30, "Beijing")
show_info(*data)  # 元组解构
data_dict = {"name": "Bob", "age": 25, "city": "Shanghai"}
show_info(**data_dict)  # 字典解构

7. 单分发泛函数 (functools.singledispatch) 根据参数类型执行不同操作。

from functools import singledispatch

@singledispatch
def process(data):
    raise NotImplementedError("Unsupported type")

@process.register
def _(data: str):
    return f"Processing string: {data}"

@process.register
def _(data: int):
    return f"Processing integer: {data}"

8. 上下文管理器 (Context Managers) 使用 with 管理资源,可自定义。

class ManagedFile:
    def __init__(self, filename):
        self.filename = filename
    def __enter__(self):
        self.file = open(self.filename, 'w')
        return self.file
    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.file:
            self.file.close()

with ManagedFile('test.txt') as f:
    f.write('hello')

9. 协程 (Coroutines) 使用 async/await 进行异步编程。

import asyncio

async def fetch_data():
    await asyncio.sleep(1)
    return "data"

async def main():
    result = await fetch_data()
    print(result)

asyncio.run(main())

10. 偏函数 (functools.partial) 固定函数的部分参数,创建新函数。

from functools import partial

def power(base, exp):
    return base ** exp

square = partial(power, exp=2)
cube = partial(power, exp=3)
print(square(5))  # 25
print(cube(3))    # 27

掌握这些模式能让你的代码更专业高效。

总结:根据需求组合使用这些模式,别为了炫技而过度设计。

返回类型

声明返回值类型,为了解决弱类型语言中某些操蛋的问题

Python 算是强类型语言,但是没有显式类型声明。
例如 a + b,如果 a 跟 b 是字符串’1’,那么结果是 11。
如果 a 跟 b 是整数 1,那么结果是 2。

python 3.5 以上新加的, 专门用来规范实现类型标注的
免得让接手的人或者半年后的自己想活剥了写代码的人的
type hint

特别是再加上 Pycharm 就更好用了

在没有显式类型声明的情况下,如果你的数据来源于其他接口,很可能你不知道或者不确定它是什么类型,那么你对这个数据的操作结果,也就不可预料。
例如你计算用户完成若干个任务的返现,你从 json 接口 1 拿到{“a”: “100”},从接口 2 拿到{“b”: “100”}。
原来你应该结算给用户 200 块的,现在你直接 a+b,好了,你给用户返现了 100100 块。

如果你用:

def add(a:int, b:int) -> int:
return a + b

这个问题就解决了

"100100"不是 100100

意思是 add(‘100’,‘100’’)返回 200 吗,我实验了一下好像没有效果。返回“ 100100"。py3.6

类型标注并不会强制转换,所以就算你标了 int 传进来该是什么还是什么

类型标注的意义只是为了让某些代码检查工具(如 mypy )做静态检查。

关键词 type hint

回到顶部