说实话,刚开始学Python那会儿,写代码对我来说简直就是一团浆糊。尤其是看到别人那些“魔术”一样的函数,总觉得有道墙。什么 def 啊,括号啊,冒号啊,参数啊,返回值啊,脑子里全是问号。现在回过头看,其实 Python 函数怎么写,没那么玄乎,它就像是搭乐高,你得知道每一块砖头是干啥的,怎么拼起来。

咱们就敞开了聊,Python 函数的核心,就俩字:封装。啥叫封装?就是把一堆重复的、或者完成特定任务的代码,打包起来,给它起个名字,以后想用这堆代码了,直接叫名字就行。省事儿,省心,还让你的代码看起来清清爽爽。

写一个函数,第一步,得告诉Python,“我要定义一个函数了!” 怎么说? 用关键词 def。你看,就这三个字母,后面跟着空格,然后是你给函数起的名字。这名字嘛,得有点讲究,别用中文啊,别用数字开头啊,也别用Python自带的那些关键字。最好是能反映这函数是干嘛的,比如 calculate_total(计算总额)啊,format_text(格式化文本)啊,一眼就能明白。

名字后面,紧跟着一对儿圆括号 ()。这圆括号,就是放“参数”的地方。参数是啥?你可以理解成,函数工作需要的一些“输入”或者“原材料”。比如,你想写个函数计算两个数的和,那这两个数,就是参数。参数之间用逗号隔开。如果你这个函数不需要任何输入,那括号里就空着,但也得有这对括号。

括号后面,是冒号 :。这个冒号非常重要,它标志着函数定义的开始。冒号之后,下一行开始,就是函数的主体了,也就是你想让这个函数干的活儿。记住,函数主体里面的代码,每一行都得缩进!通常是四个空格,这是Python的规矩,叫缩进(Indentation)。没了缩进,Python就不知道哪些代码属于这个函数了。

举个最简单的例子,一个啥也不干的函数,就打个招呼:

python
def say_hello():
print("Hello, world!")

你看,def 函数名 say_hello,空的括号 (),冒号 :,然后下一行缩进,写上要执行的代码 print("Hello, world!")

定义好了函数,怎么用呢?很简单,就像你在现实生活中叫人名字一样,直接写函数名,后面带上括号,括号里如果函数需要参数,你就把参数放进去。比如要调用刚才那个 say_hello 函数:

python
say_hello()

运行这行代码,控制台就会输出 Hello, world!

咱们再来点儿复杂的,带参数的函数。比如计算两个数之和:

python
def add_numbers(a, b):
sum_result = a + b
print(f"The sum of {a} and {b} is: {sum_result}")

这个函数 add_numbers 需要两个参数,我给它们起了名字 ab。函数体里,我把 ab 加起来,结果存到 sum_result 变量里,然后打印出来。

怎么调用这个带参数的函数?

python
add_numbers(5, 3)

你看,我在括号里放了两个数字,5 对应参数 a3 对应参数 b。运行这行代码,就会输出 The sum of 5 and 3 is: 8。当然,你也可以传入变量:

python
num1 = 10
num2 = 20
add_numbers(num1, num2)

这也没问题,效果一样。

参数这玩意儿,还有点花样。默认参数(Default Arguments)知道吗?就是给参数一个默认值。如果你调用函数的时候不传这个参数,它就用默认值。如果传了,就用你传的值。这可太方便了!

python
def greet(name="Guest", greeting="Hello"):
print(f"{greeting}, {name}!")

这个 greet 函数有两个参数,name 默认是 "Guest"greeting 默认是 "Hello"

你可以这么调用:

python
greet() # 输出:Hello, Guest! (都用的默认值)
greet("Alice") # 输出:Hello, Alice! (name用了我传的,greeting用的默认值)
greet(greeting="Hi") # 输出:Hi, Guest! (greeting用了我传的,name用的默认值,注意这里的关键词参数用法!)
greet("Bob", "Hi") # 输出:Hi, Bob! (两个都用了我传的值)

看到了吗?调用的时候,你可以按顺序传,也可以用 参数名=值 的方式传,这叫关键词参数。特别是参数多的时候,用关键词参数能让你更清楚地知道每个值是给哪个参数的。

函数除了能接收输入(参数),还能有输出,也就是“返回值”(Return Value)。很多时候,你写函数不是为了让它直接打印什么,而是为了让它计算出个结果,然后你拿这个结果去做别的事儿。

用关键词 return 来指定函数的返回值。一旦函数执行到 return 语句,它就会立即停止执行,并把 return 后面的值“扔”出来。

咱们改写一下那个加法函数,让它返回结果,而不是直接打印:

python
def add_numbers_with_return(a, b):
sum_result = a + b
return sum_result
print("这行代码永远不会执行到!") # 因为上面已经return了

现在调用它:

python
result = add_numbers_with_return(10, 5)
print(f"The result of addition is: {result}")

瞧!add_numbers_with_return(10, 5) 执行完了,返回的值 15 被赋给了 result 变量,然后我再打印 result。这才是一个函数应该有的样子,它像个小型加工厂,接收原材料,加工,然后把成品交给你。

一个函数可以没有 return 语句,这种情况下,Python会隐式地返回一个特殊的值 NoneNone 就是表示“空”或者“没有”的意思。

Python的函数还能返回多个值,这不像有些语言那么麻烦,Python直接用逗号隔开就行了,返回的是一个元组(Tuple)。

python
def get_name_info():
first_name = "Zhang"
last_name = "San"
full_name = first_name + " " + last_name
return first_name, last_name, full_name

调用并接收返回值:

python
f_name, l_name, full = get_name_info()
print(f"First: {f_name}, Last: {l_name}, Full: {full}")

是不是挺酷的?一下子拿到三个值。

再说点进阶的。参数除了普通的按位置传值,按关键词传值,还有可变参数。有时候你写函数,不确定调用者会传多少个参数进来,比如你想写个函数计算任意多个数的和。这时候就用得上星号 * 和双星号 ** 了。

一个星号 *args(args是约定俗成的名字,你也可以叫别的,但习惯都用args)会把所有按位置传进来的多余参数打包成一个元组。

“`python
def sum_all(*numbers):
total = 0
for num in numbers:
total += num
return total

print(sum_all(1, 2, 3)) # 输出:6
print(sum_all(1, 2, 3, 4, 5)) # 输出:15
print(sum_all()) # 输出:0
“`

看到了吗?numbers 在函数里面就是一个元组,包含了你传进来的所有数字。

双星号 **kwargs(kwargs也是约定俗成,关键词参数的意思)会把所有按关键词传进来的多余参数打包成一个字典。

“`python
def process_info(name, age, **details):
print(f”Name: {name}, Age: {age}”)
print(“Other details:”)
for key, value in details.items():
print(f”- {key}: {value}”)

process_info(“Alice”, 30, city=”New York”, job=”Engineer”)
“`

这里的 details 就是一个字典,{'city': 'New York', 'job': 'Engineer'}。这种用法特别适合你想接收一堆不确定名字的额外配置信息。

当然,你也可以在一个函数里同时使用普通参数、*args**kwargs,但得注意顺序:普通参数在前,然后是 *args,最后是 **kwargs

函数的文档字符串(Docstring)也得提一嘴。在函数定义的下一行,紧跟着用三引号 """ """ 包起来的字符串,就是这个函数的文档字符串。它用来解释这个函数是干嘛的,有哪些参数,返回什么。这是个好习惯,方便自己以后看,也方便别人理解你的代码。很多工具都能自动从文档字符串生成帮助文档。

“`python
def multiply(x, y):
“””
This function multiplies two numbers.

Args:
    x: The first number.
    y: The second number.

Returns:
    The product of x and y.
"""
return x * y

你可以用 help() 函数查看文档字符串

help(multiply)

“`

写文档字符串,就像给你的函数写使用说明书,虽然有点费劲,但绝对是磨刀不误砍柴工。

除了这些基础,Python函数还有很多高级玩法,比如匿名函数(Lambda函数),递归函数(函数自己调用自己),高阶函数(函数作为参数或者返回值)。但作为刚开始学“Python函数怎么写”的人来说,先啃下 def、参数、返回值、文档字符串、可变参数这些基本概念,就足够你在写代码的路上畅通不少了。

写函数,不仅仅是把代码包起来,更重要的是思考如何把复杂的问题分解成一个个小的、可管理的任务,每个任务就对应一个函数。好的函数应该只做一件事情,并且把它做好。参数清晰,返回值明确,名字取得好,文档写得全,这样的函数,用起来才舒心,维护起来也容易。

一开始可能写得磕磕巴巴,函数体不知道怎么组织,参数不知道怎么传,返回值不知道怎么弄。别急,多练!找点小需求,试着用函数去实现。比如写个函数判断一个数是不是素数,写个函数计算一个列表的平均值,写个函数把字符串反转。从小任务开始,慢慢地,你就会对“Python函数怎么写”越来越有感觉,越来越顺手。记住,代码是写给人看的,只是偶尔给机器运行。所以,让你的函数像写文章一样,逻辑清晰,表达准确,有结构,有层次。

别怕犯错,没人一开始就是大神。写代码就像学说话,从咿呀学语到滔滔不绝,得有个过程。函数就是你代码语言里的一个个重要的“词汇”和“句子结构”,掌握了它,你的代码就能表达更复杂的“思想”,解决更棘手的“问题”。所以,现在就开始,定义你的第一个Python函数吧!感受那种把代码整理得井井有条的快感!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。