写 Python 代码的时候,函数就像咱们盖房子用的砖块,砖块质量好不好、摆放规不规矩,直接影响整个房子的稳固和美观。今天就来聊聊 5 个特别实用的优化函数的技巧,都是咱日常写代码能用上的干货,保证接地气好理解。
好多新手写函数的时候,图省事儿随便起个名,比如叫 f1
count
啥的,当时自己可能知道干啥的,过两天再看就懵圈了,别人看更是一头雾水。就好比你把袜子放在 "小柜子" 里,结果家里有仨小柜子,谁知道你说的是哪个?
正确做法:函数名得像说明书标题,一看就知道它的功能。比如统计字符串里元音字母(a、e、i、o、u)数量的函数,叫 count_vowels
就特别清楚,count
是统计,vowels
是元音,合起来就是 "统计元音数量"。
反面教材(模糊命名):
def count(text):
vowels = 'aeiouAEIOU'
return sum(1 for char in text if char in vowels)
print(count("Hello World")) # 调用的时候得想半天:这count到底统计啥?
正面案例(清晰命名):
def count_vowels(text):
vowels = 'aeiouAEIOU'
return sum(1 for char in text if char in vowels)
print(count_vowels("Hello World")) # 一看就知道是统计元音数量
运行结果:
3
(解释:"Hello World" 里的元音是 e、o、o,一共 3 个)
这样改完,不管是自己半年后回看,还是团队里其他小伙伴接手,不用猜就能知道函数是干啥的,直接减少一半的理解成本。
Python 是动态类型语言,虽然灵活,但有时候传错参数类型,运行时才报错,找 bug 能找得人头疼。就像去快递点取件,没有明确的编号,得一个个翻找,费时费力。这时候类型注解就像给参数和返回值贴了标签,IDE(比如 PyCharm、VS Code)能提前帮咱检查错误。
怎么用:在参数后面加 : 类型
,返回值用 -> 类型
标注。比如函数接收一个字符串,返回整数,就写成 text: str -> int
。
def get_length(text: str) -> int:
return len(text)
# 正确调用
print(get_length("Python")) # 输出:6
# 错误调用(传了数字进去,IDE会提前提示错误)
# print(get_length(123)) # 这里会报错:TypeError: len() expects a string or bytes-like object
运行结果:
正确调用输出 6
,错误调用会抛出 TypeError
,但其实在写代码的时候,IDE 就会用红色波浪线提示你参数类型不对,不用等到运行时才发现,静态检查省心多了。
类型 | 注解写法 | 例子 |
---|---|---|
字符串 | str | name: str |
整数 | int | age: int |
浮点数 | float | score: float |
列表 | list | numbers: listint |
字典 | dict | info: dictstr, int |
可选类型 | Optional | value: Optionalstr |
无返回值 | None | def print_info() -> None |
就算函数名取得再好,参数类型标得再清楚,还是得有个 “使用说明”,特别是给别人用的时候。文档注释就像函数的名片,说明功能、参数、返回值,甚至给示例,让人一看就知道怎么用。
用啥格式:推荐用三重双引号 """ """
包裹,里面可以写功能描述、参数说明、返回值说明,复杂点的还能写示例。
def count_vowels(text: str) -> int:
"""
统计字符串中元音字母(a、e、i、o、u,不区分大小写)的数量
参数:
text (str): 要统计的字符串
返回值:
int: 字符串中元音字母的数量
示例:
>>> count_vowels("Hello") # 统计"Hello"中的元音e、o
>>> count_vowels("Python") # 统计"Python"中的元音o
"""
vowels = 'aeiouAEIOU'
return sum(1 for char in text if char in vowels)
# 调用的时候,用help函数就能看到注释
help(count_vowels)
运行结果:
执行 help(count_vowels)
会输出:
Help on function count_vowels in module __main__:
count_vowels(text: str) -> int
统计字符串中元音字母(a、e、i、o、u,不区分大小写)的数量
参数:
text (str): 要统计的字符串
返回值:
int: 字符串中元音字母的数量
示例:
>>> count_vowels("Hello") # 统计"Hello"中的元音e、o
>>> count_vowels("Python") # 统计"Python"中的元音o
这样就算是没见过这个函数的人,看了文档注释也能直接上手用,团队协作的时候特别方便,减少沟通成本。
有时候调用函数的人可能传错参数类型,比如本该传字符串,结果传了数字,虽然 Python 运行时会报错,但错误信息可能不明确,让人摸不着头脑。就像门卫不放陌生人进小区,但得说清楚 “只许业主进”,不能说 “你不能进” 却不解释为啥。
怎么做:在函数开头,用 isinstance()
检查参数类型,不符合的话,抛出明确的异常,比如 ValueError("仅接受字符串")
。
def count_vowels(text: str) -> int:
"""统计字符串中元音字母的数量"""
# 参数验证:如果不是字符串,抛出明确异常
if not isinstance(text, str):
raise ValueError("仅接受字符串类型的输入")
vowels = 'aeiouAEIOU'
return sum(1 for char in text if char in vowels)
# 正确调用
print(count_vowels("Hello")) # 输出:2
# 错误调用:传了数字
try:
count_vowels(123)
except ValueError as e:
print(e) # 输出:仅接受字符串类型的输入
运行结果:
正确调用输出 2
,错误调用会抛出我们定义的异常信息 仅接受字符串类型的输入
,而不是默认的 TypeError
,这样调试的时候就能快速知道问题出在参数类型上。
验证需求 | 代码示例 | 异常信息建议 |
---|---|---|
检查是否为字符串 | if not isinstance(text, str): ... | "输入必须是字符串" |
检查是否为正数 | if num <= 0: ... | "数值必须为正数" |
检查列表不为空 | if not isinstance(lst, list) or len(lst)==0: ... | "必须传入非空列表" |
好多人喜欢用列表推导式、一行代码搞定复杂逻辑,觉得这样代码简洁。但有时候过度追求简洁,反而让代码像谜语一样难理解。就像把所有家具都塞进一个小房间,看着 “简洁”,但找东西的时候麻烦死了。复杂逻辑别硬塞单行,用循环、分步骤写,代码多几行但清晰易懂,未来修改也轻松。
反面教材(晦涩的列表推导式):
def filter_vowels(text: str) -> list[str]:
return [char for char in text if char.lower() in 'aeiou'] # 虽然一行,但如果逻辑更复杂呢?
print(filter_vowels("Hello")) # 输出:['e', 'o']
正面案例(清晰的循环写法):
def filter_vowels(text: str) -> list[str]:
vowels = []
for char in text:
# 转小写后判断是否是元音,保留原字符的大小写
if char.lower() in 'aeiou':
vowels.append(char)
return vowels
print(filter_vowels("Hello")) # 输出:['e', 'o']
运行结果:
两种写法结果一样,但第二种用循环,每一步都清楚:先初始化列表,再逐个字符检查,符合条件的添加进去。如果以后需要修改,比如不仅要过滤元音,还要记录位置,循环写法更容易扩展,而列表推导式改起来可能得重新捋逻辑。
简单的场景可以用,比如 numbers = [x*2 for x in range(10)]
,但如果里面有复杂的条件判断、多层嵌套,或者需要调试,就老老实实写循环。代码首先是给人看的,其次才是给计算机执行的。
这 5 个技巧总结下来,核心就一个:让函数对人更友好。取好名字让人一眼懂功能,加类型注解和文档注释减少理解成本,参数验证提前拦截错误,可读性优先让代码易维护。刚开始可能觉得麻烦,但写多了就会发现,这样的代码不仅自己改起来顺手,团队协作也更高效,debug 的时间能减少一大半。
最后记住一句话:写代码就像写日记,不是写完就算了,得让未来的自己和别人都能看明白,这才是好代码的终极目标。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。