Python 函数的高级写法有哪些?
看源码的时候,经常看到:
def func(args) -> str: ...
这种写法,问问大佬们这种写法什么意思,什么时候会用到?
Python 函数的高级写法有哪些?
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 与高阶函数
配合 map、filter、reduce 进行函数式操作。
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

