0

0

python怎么定义和调用一个函数_python函数定义与调用基础

冰火之心

冰火之心

发布时间:2025-09-12 19:59:01

|

1163人浏览过

|

来源于php中文网

原创

Python中定义函数用def关键字,后接函数名、参数和冒号,函数体需缩进;调用时直接使用函数名加括号传参。函数可包含Docstring提升可读性,通过return返回结果,默认返回None。参数支持位置、关键字、默认值、args和*kwargs,还可限制仅位置或仅关键字传参。了解函数应查看Docstring、理解返回值,并借助错误信息调试。进阶特性包括闭包、Lambda匿名函数和装饰器,能实现数据封装、简洁表达式和功能增强,体现Python的灵活性与强大。

python怎么定义和调用一个函数_python函数定义与调用基础

Python中定义和调用函数,核心就是用

def
关键字声明一个代码块,然后通过函数名加上括号来执行它。这就像给一段常用操作起了个名字,方便随时按需调用,避免重复劳动,让代码更整洁、更具模块化。

解决方案

定义一个Python函数,你需要从

def
关键字开始,后面跟着你给函数起的名字,接着是一对括号,里面可以放参数(也可以不放),最后是冒号。函数体的内容需要缩进。调用函数就简单了,直接写函数名,然后跟上括号,如果函数需要参数,就在括号里传入对应的值。

举个例子,我们定义一个简单的加法函数:

def add_numbers(a, b):
    """
    这个函数接收两个数字,并返回它们的和。
    这是一个很基础的加法操作。
    """
    result = a + b
    return result

# 调用这个函数
sum_result = add_numbers(5, 3)
print(f"5 + 3 的结果是: {sum_result}") # 输出: 5 + 3 的结果是: 8

# 也可以不接收返回值,直接调用
add_numbers(10, 20) # 虽然执行了,但结果没有被使用,函数依然会执行

这里,

add_numbers
就是函数名,
a
b
是参数。
return result
表示函数执行完毕后,会把
result
的值返回给调用者。我个人觉得,写函数时加上Docstring(就像上面三引号包起来的部分),对代码的可读性简直是质的提升,尤其是在团队协作或者过了一段时间回头看自己代码的时候。如果没有
return
语句,函数默认返回
None
,这一点在我看来,初学者常常会忽略,但它其实挺重要的。

立即学习Python免费学习笔记(深入)”;

Python函数定义时,参数到底有哪些玩法?

定义函数时,参数这块儿,Python给了我们很多灵活性,这让函数能适应各种场景。最常见的是位置参数,你传参的顺序必须和函数定义时的顺序一致。比如

def greet(name, message):
,你调用时
greet("张三", "你好")
,"张三"就对应
name
,"你好"对应
message
。这是最直观的方式。

但有时候,参数顺序容易搞混,或者参数太多了,这时候关键字参数就派上用场了。你可以明确指定参数名来传值,顺序就无所谓了:

greet(message="你好", name="李四")
。这在我看来,不仅增加了代码的清晰度,也减少了出错的可能,特别是当函数参数列表很长的时候。

还有默认参数

def greet_default(name, message="你好"):
。如果你调用
greet_default("王五")
message
就会自动用"你好"。但这里有个小坑,如果默认值是可变对象(比如列表或字典),多次调用可能会导致意想不到的行为。我曾经就因为这个踩过坑,后来发现最好用
None
作为默认值,然后在函数内部判断并初始化,这样能有效避免副作用。

当你不知道会有多少个位置参数时,可以用

*args
来收集。它会把多余的位置参数打包成一个元组。比如
def sum_all(*numbers):
,调用
sum_all(1, 2, 3)
numbers
就会是
(1, 2, 3)
。同理,
**kwargs
用于收集多余的关键字参数,打包成字典。这俩在写通用工具函数或者需要高度灵活性的函数时特别好用,比如处理各种配置项。

Python 3.8之后,我们甚至可以强制指定某些参数只能按位置传,或者只能按关键字传,通过

/
*
在参数列表里标记。比如
def func(a, b, /, c, *, d):
a
b
必须按位置传,
d
必须按关键字传,
c
随意。这个特性在设计API时,能更好地控制接口的稳定性,避免用户随意更改调用方式,也让函数签名意图更明确。

函数调用时,我怎么知道该传什么参数,又会得到什么结果?

这是个非常实际的问题,尤其当你面对一个不熟悉的函数时。我个人经验是,首先看Docstring。一个好的Docstring会详细说明函数的功能、参数的含义、类型以及返回值是什么。这是了解函数最直接、最权威的途径。很多IDE(比如VS Code、PyCharm)在你输入函数名和括号时,会自动弹出Docstring和参数提示,这简直是开发者的福音。

Paraflow
Paraflow

AI产品设计智能体

下载

比如,上面

add_numbers
的Docstring就清晰地告诉我们它接收两个数字并返回它们的和。

# 在Python交互式环境中,你可以使用 help() 函数查看任何函数或对象的 Docstring
help(add_numbers)
# 输出类似:
# Help on function add_numbers in module __main__:
#
# add_numbers(a, b)
#     这个函数接收两个数字,并返回它们的和。
#     这是一个很基础的加法操作。

其次,理解

return
语句至关重要。函数执行完,如果有一个
return
语句,它会把指定的值送回给调用者。如果没有
return
,或者
return
后面没有跟任何值,函数默认返回
None
。搞清楚函数是返回一个计算结果,还是仅仅执行一些操作(比如打印、修改全局变量),对于正确使用函数非常重要。我见过不少新手误以为
print()
函数会返回它打印的内容,实际上
print()
返回的是
None

def print_hello(name):
    print(f"Hello, {name}!")
    # 没有return语句

result = print_hello("Alice")
print(f"print_hello 函数的返回值是: {result}") # 输出: print_hello 函数的返回值是: None

最后,遇到问题不要怕,Python的错误信息通常很直白。最常见的调用错误是

TypeError
,它会告诉你参数数量不对,或者某个参数类型不对。
NameError
则表示你调用的函数名不存在。这些错误信息是最好的调试线索,它们会引导你找到并修正问题。

除了定义和调用,Python函数还有哪些进阶特性值得我关注?

Python函数的魅力远不止于此,它还有很多强大的进阶特性,能让我们的代码更加灵活和优雅。

一个很有意思的概念是闭包(Closures),这涉及到嵌套函数。简单来说,一个内部函数可以记住并访问其外部(Enclosing)函数的作用域中的变量,即使外部函数已经执行完毕。这在我看来,是一种非常优雅地实现数据封装和行为定制的方式,比如工厂函数或者需要记住特定状态的函数。

def outer_function(msg):
    def inner_function():
        print(msg) # inner_function 记住了 msg
    return inner_function

my_closure = outer_function("Hello from closure!")
my_closure() # 输出: Hello from closure!

这里

inner_function
就是闭包,它“捕获”了
msg
变量。

Lambda函数是另一种简洁的函数定义方式,适用于那些只需要一行表达式的简单函数。它们是匿名函数,没有名字。我个人觉得,虽然方便,但过度使用Lambda可能会降低代码可读性,尤其是在表达式变得复杂时,所以我会权衡使用,通常用于

map()
,
filter()
,
sorted()
等高阶函数中。

# 传统的函数
def multiply(x, y):
    return x * y

# Lambda函数实现相同功能
multiply_lambda = lambda x, y: x * y

print(multiply(2, 3)) # 输出: 6
print(multiply_lambda(2, 3)) # 输出: 6

装饰器(Decorators)是Python中一个非常强大的元编程工具。它本质上是一个函数,可以包装另一个函数,在不修改原函数代码的情况下,增加或修改原函数的功能。比如,你可以用装饰器来实现日志记录、性能计时、权限检查等等。这背后的原理其实就是函数作为一等公民的体现:函数可以作为参数传递,也可以作为返回值。虽然理解起来可能需要一点时间,但一旦掌握,它会极大地提升代码的复用性和可维护性,让你的代码更加“干练”。

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    print(f"Hello, {name}!")
    return f"Greetings to {name}"

returned_value = say_hello("Bob")
print(f"Function returned: {returned_value}")
# 输出:
# Something is happening before the function is called.
# Hello, Bob!
# Something is happening after the function is called.
# Function returned: Greetings to Bob

这里

@my_decorator
就是装饰器语法糖,它等同于
say_hello = my_decorator(say_hello)

这些进阶特性,在我看来,是Python之所以灵活且强大的重要原因。它们让我们可以用更抽象、更优雅的方式来组织和编写代码,处理更复杂的逻辑。虽然初学时可能觉得有点烧脑,但一旦理解了,你会发现它们能解决很多实际问题,让你的Python技能更上一层楼,写出更具Pythonic风格的代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.09.27

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

207

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

53

2026.01.05

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1099

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

189

2025.10.17

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.9万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

Excel 教程
Excel 教程

共162课时 | 13.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号