首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >偷偷学会 5 种优化 Python 函数的技巧

偷偷学会 5 种优化 Python 函数的技巧

原创
作者头像
小白的大数据之旅
修改2025-07-09 11:20:47
修改2025-07-09 11:20:47
16800
代码可运行
举报
运行总次数:0
代码可运行

写 Python 代码的时候,函数就像咱们盖房子用的砖块,砖块质量好不好、摆放规不规矩,直接影响整个房子的稳固和美观。今天就来聊聊 5 个特别实用的优化函数的技巧,都是咱日常写代码能用上的干货,保证接地气好理解。

一、取个靠谱的函数名:让名字直接 “说” 清楚干啥的

好多新手写函数的时候,图省事儿随便起个名,比如叫 f1 count 啥的,当时自己可能知道干啥的,过两天再看就懵圈了,别人看更是一头雾水。就好比你把袜子放在 "小柜子" 里,结果家里有仨小柜子,谁知道你说的是哪个?

正确做法:函数名得像说明书标题,一看就知道它的功能。比如统计字符串里元音字母(a、e、i、o、u)数量的函数,叫 count_vowels 就特别清楚,count 是统计,vowels 是元音,合起来就是 "统计元音数量"。

案例对比:

反面教材(模糊命名)

代码语言:python
代码运行次数:0
运行
复制
def count(text):


   vowels = 'aeiouAEIOU'


   return sum(1 for char in text if char in vowels)


print(count("Hello World"))  # 调用的时候得想半天:这count到底统计啥?

正面案例(清晰命名)

代码语言:python
代码运行次数:0
运行
复制
def count_vowels(text):


   vowels = 'aeiouAEIOU'


   return sum(1 for char in text if char in vowels)


print(count_vowels("Hello World"))  # 一看就知道是统计元音数量

运行结果

代码语言:txt
复制
3

(解释:"Hello World" 里的元音是 e、o、o,一共 3 个)

这样改完,不管是自己半年后回看,还是团队里其他小伙伴接手,不用猜就能知道函数是干啥的,直接减少一半的理解成本。

二、加上类型注解:让参数和返回值 “明明白白”

Python 是动态类型语言,虽然灵活,但有时候传错参数类型,运行时才报错,找 bug 能找得人头疼。就像去快递点取件,没有明确的编号,得一个个翻找,费时费力。这时候类型注解就像给参数和返回值贴了标签,IDE(比如 PyCharm、VS Code)能提前帮咱检查错误。

怎么用:在参数后面加 : 类型,返回值用 -> 类型 标注。比如函数接收一个字符串,返回整数,就写成 text: str -> int

案例:带类型注解的字符串长度统计函数

代码语言:python
代码运行次数:0
运行
复制
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

三、写好文档注释:让函数自己 “做自我介绍”

就算函数名取得再好,参数类型标得再清楚,还是得有个 “使用说明”,特别是给别人用的时候。文档注释就像函数的名片,说明功能、参数、返回值,甚至给示例,让人一看就知道怎么用。

用啥格式:推荐用三重双引号 """ """ 包裹,里面可以写功能描述、参数说明、返回值说明,复杂点的还能写示例。

案例:带文档注释的统计元音函数

代码语言:python
代码运行次数:0
运行
复制
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) 会输出:

代码语言:txt
复制
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("仅接受字符串")

案例:带参数验证的统计元音函数

代码语言:python
代码运行次数:0
运行
复制
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: ...

"必须传入非空列表"

五、可读性优先:别为了 “炫技” 把代码写得像谜语

好多人喜欢用列表推导式、一行代码搞定复杂逻辑,觉得这样代码简洁。但有时候过度追求简洁,反而让代码像谜语一样难理解。就像把所有家具都塞进一个小房间,看着 “简洁”,但找东西的时候麻烦死了。复杂逻辑别硬塞单行,用循环、分步骤写,代码多几行但清晰易懂,未来修改也轻松。

案例:过滤元音字母,可读性对比

反面教材(晦涩的列表推导式)

代码语言:python
代码运行次数: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']

正面案例(清晰的循环写法)

代码语言:python
代码运行次数:0
运行
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、取个靠谱的函数名:让名字直接 “说” 清楚干啥的
    • 案例对比:
  • 二、加上类型注解:让参数和返回值 “明明白白”
    • 案例:带类型注解的字符串长度统计函数
    • 常见类型注解表格:
  • 三、写好文档注释:让函数自己 “做自我介绍”
    • 案例:带文档注释的统计元音函数
  • 四、参数验证别偷懒:提前把 “坏数据” 拦在门外
    • 案例:带参数验证的统计元音函数
    • 参数验证的常见场景:
  • 五、可读性优先:别为了 “炫技” 把代码写得像谜语
    • 案例:过滤元音字母,可读性对比
    • 什么时候用列表推导式?
  • 总结:优化函数的核心是 “让人好懂”
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档