前言
写 Python 脚本时,如果只是十几行代码,全部写在一个文件里也能跑。
但代码一多,就会发现需要函数。函数可以把一段逻辑命名、复用、测试,也能让程序结构更清楚。
这篇记录 Python 函数的基础用法,包括定义、参数、返回值、默认参数、可变参数、作用域和类型提示。
定义函数
Python 用 def 定义函数。
def say_hello(name):
print(f"hello {name}")
调用:
say_hello("Tom")
函数名应该表达动作或意图。比如parse_user、load_config、calculate_total。不要起handle、do_it这种过于模糊的名字。
函数本身就是一种说明。名字起得好,读代码的人能少看很多细节。
返回值
函数用 return 返回结果。
def add(a, b):
return a + b
如果没有 return,函数默认返回 None。
def log_message(message):
print(message)
result = log_message("hello")
print(result)
这里 result 是 None。
初学时要分清楚 print 和 return。print 是输出到控制台,return 是把结果交给调用方。
多个返回值
Python 函数可以看起来返回多个值。
def get_user():
return "Tom", 18
name, age = get_user()
本质上返回的是一个元组,然后调用方解包。
这个写法很方便,但不要返回太多值。如果一个函数返回五六个值,读起来会很乱。可以考虑返回字典、dataclass 或专门对象。
默认参数
函数参数可以有默认值。
def greet(name, prefix="hello"):
return f"{prefix} {name}"
调用时可以不传 prefix。
greet("Tom")
greet("Tom", "hi")
默认参数很方便,但有一个经典坑:不要用可变对象做默认值。
def add_item(item, items=[]):
items.append(item)
return items
这个写法会导致多次调用共享同一个列表。
推荐写法:
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
关键字参数
Python 调函数时可以用关键字参数。
def create_user(name, age, active=True):
pass
create_user(name="Tom", age=18, active=False)
当参数比较多时,关键字参数比按位置传参更清楚。
比如:
create_user("Tom", 18, False)
别人看这行代码,不一定马上知道 False 代表什么。写成active=False就清楚很多。
可变参数
*args可以接收多个位置参数。
def total(*numbers):
return sum(numbers)
调用:
total(1, 2, 3)
**kwargs可以接收多个关键字参数。
def print_config(**kwargs):
for key, value in kwargs.items():
print(key, value)
可变参数适合写通用工具,但普通业务函数不要滥用。参数越明确,函数越容易理解和检查。
作用域
函数内部定义的变量,外部不能直接访问。
def demo():
message = "hello"
print(message)
这会报错。
Python 也能在函数里访问外部变量,但我不建议过度依赖。函数最好通过参数接收输入,通过 return 返回输出。
这样函数更容易测试,也更不容易被外部状态影响。
类型提示
Python 是动态语言,但可以写类型提示。
def add(a: int, b: int) -> int:
return a + b
类型提示不会像 Java 那样在运行时强制检查,但 IDE、类型检查工具和读代码的人都能受益。
对于稍微正式一点的代码,我觉得类型提示很值得写。它能让函数边界更清楚。
def summarize(text: str, max_length: int = 100) -> str:
return text[:max_length]
函数要短一点
刚开始写代码,很容易一个函数写到底。
读文件、解析数据、处理逻辑、输出结果,全放在 main 里。能跑,但很难维护。
可以拆成几个函数:
def load_lines(path: str) -> list[str]:
pass
def parse_lines(lines: list[str]) -> list[dict]:
pass
def save_result(result: list[dict], path: str) -> None:
pass
每个函数做一件事,名字表达清楚。这样后面改某一段逻辑时,不用在一大坨代码里找。
小结
函数让 Python 代码从“脚本”开始变得有结构。
要分清 print 和 return,默认参数不要用可变对象,参数多时用关键字参数,复杂输入输出可以加类型提示。函数最好短一点、职责清楚一点。
写函数不是为了显得正式,而是为了让代码能复用、能测试、能被以后的人看懂。
喜欢的话,留下你的评论吧~