Python 有一堆有用的内置函数,你可以用来做各种各样的事情。而且每一个都执行一个特定的任务。
但是你知道吗,Python 也允许你定义自己的函数?
这篇文章将告诉你如何创建和调用你自己的 Python 函数。它还将向你概述如何向你的函数传递输入参数和论据。
什么是函数?
一个函数是一个孤立的代码块,它执行一个特定的任务。
函数在编程中很有用,因为它消除了在程序中不必要的和过多的代码复制和粘贴。
如果在不同的地方经常需要某个动作,这就说明你可以为它编写一个函数。函数是可重复使用的。
函数也有助于组织你的代码。
如果你需要做一个改变,你只需要更新那个特定的函数。这使你不必通过复制和粘贴来寻找散落在程序中不同位置的相同代码的不同部分。
这符合软件开发中的DRY(Don't Repeat Yourself)原则。
函数内的代码只在函数被调用时运行。
函数可以接受参数和默认值,并且在代码运行后可以或不返回值给调用者。
如何在Python中定义一个函数
在Python中创建一个函数的一般语法看起来像这样:
def function_name(parameters):
function body
我们来分析一下这里发生了什么:
def是一个关键字,它告诉 Python 一个新的函数正在被定义。- 接下来是一个你选择的有效函数名。有效的名字以字母或下划线开头,但也可以包括数字。字母是小写的,用下划线分开。重要的是要知道,函数名不能是 Python 的保留关键字。
- 然后我们有一组开括号和闭括号,
()。在它们里面,可以有零个、一个或多个可选的逗号分隔的参数,以及它们可选的默认值。这些都是传递给函数的。 - 接下来是一个冒号,
:,它结束了函数的定义行。 - 然后是一个新的行,后面是一个缩进级别(你可以用键盘上的4个空格或者用1个Tab来做这个)。缩进是很重要的,因为它让 Python 知道哪些代码属于这个函数。
- 然后我们有了函数的主体。这里是要执行的代码--当函数被调用时要采取的行动的内容。
- 最后,在函数的主体中还有一个可选的返回语句,在函数退出时向调用者传回一个值。
请记住,如果你在试图定义一个新的函数时忘记了小括号() 或冒号: ,Python 会用一个SyntaxError 让你知道。
如何在 Python 中定义和调用一个基本函数
下面是一个基本函数的例子,它没有返回语句,也不接受任何参数。
每当它被调用时,它只是打印出hello world :
def hello_world_func():
print("hello world")
一旦你定义了一个函数,代码将不会自己运行。
要执行函数内的代码,你必须进行函数调用,否则就是函数调用。
然后,你可以随心所欲地多次调用该函数。
要调用一个函数,你需要这样做:
function_name(arguments)
下面是代码的分解:
- 输入函数名称。
- 函数名后面必须有圆括号。如果有任何需要的参数,必须在括号内传递。如果该函数不接受任何参数,你仍然需要括号。
要调用上面例子中的函数,即不接受任何参数的函数,请按以下步骤操作:
hello_world_func()
#Output
#hello world
如何定义和调用带参数的函数
到目前为止,你已经看到了一些简单的函数,这些函数除了向控制台打印一些东西之外,其实并没有什么作用。
如果你想向函数传递一些额外的数据呢?
我们在这里使用了参数和参数等术语。
它们的定义究竟是什么?
参数是一个命名的占位符,它将信息传递给函数。
它们就像变量一样,在函数的定义行中局部定义:
def hello_to_you(name):
print("Hello " + name)
在上面的例子中,有一个参数,name 。
我们可以用f-string formatting 来代替--它的工作方式与前面的例子相同:
def hello_to_you(name):
print(f"Hello {name}")
圆括号内可以有一个参数列表,都用逗号隔开:
def name_and_age(name,age):
print(f"I am {name} and I am {age} years old!")
这里,函数中的参数是name 和age 。
当一个函数被调用时,参数被传递进来。
参数,像参数一样,是传递给函数的信息。
特别是,它们是对应于函数定义中的参数的实际值。
调用前面例子中的函数并传入一个参数,看起来是这样的:
def hello_to_you(name):
print(f"Hello {name}")
hello_to_you("Timmy")
#Output
# Hello Timmy
这个函数可以被多次调用,每次传入不同的值:
def hello_to_you(name):
print(f"Hello {name}")
hello_to_you("Timmy")
hello_to_you("Kristy")
hello_to_you("Jackie")
hello_to_you("Liv")
#Output:
#"Hello Timmy"
#"Hello Kristy"
#"Hello Jackie"
#"Hello Liv"
到目前为止介绍的参数被称为位置性参数。
所有的位置参数都是非常必要的。
位置参数的数量很重要
在调用函数时,你需要传递正确数量的参数,否则会出现错误。
当涉及到位置参数时,传递到函数调用中的参数数量必须与函数定义中的参数数量完全相同。
你不能漏掉任何一个,也不能再增加任何一个。
假设你有这样一个函数,它接收了两个参数:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
如果在调用该函数时只传入一个参数,像这样,就会出现一个错误:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy")
输出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() missing 1 required positional argument: 'last_name'
如果在调用该函数时传入三个参数,又会出现一个错误:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones",34)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() takes 2 positional arguments but 3 were given
如果我们没有传入参数,也会出现错误:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() missing 2 required positional arguments: 'first_name' and 'last_name'
相反,我们需要两个参数,因为函数定义中列出了两个参数:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones")
#Output:
# Hello,Timmy Jones
位置参数的顺序很重要
除了包括正确的参数数量,重要的是要注意参数传递的顺序很重要。
参数的传递顺序需要与函数定义中声明的参数顺序完全一致。
它的工作原理类似于变量赋值。
第一个参数是函数定义中第一个参数的值。第二个参数是函数定义中第二个参数的值,以此类推:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones")
#Output
#Hello,Timmy Jones
#you can visualise it like:
#first_name = "Timmy"
#last_name = "Jones"
如果顺序不对,输出可能没有什么意义,不是你想要的:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language("Python","Dionysia")
#output:
#Hello, I am Python and my favorite programming language is Dionysia
#it is like you did
#name="Python"
#language = "Dionysia"
如何在 Python 函数中使用关键字参数
到目前为止,你已经看到了一种类型的参数,即位置性参数。
使用位置参数,函数被调用时只需要在函数调用中传递的值。在那里,每个值都直接对应于函数定义中每个参数的数量、顺序和位置。
然而,Python 中的函数可以接受另一种类型的参数,也就是关键字参数。
在这种情况下,不是在函数调用中直接传入数值,而是指定参数的名称,然后指定要分配给它的值,形式为key = value 。
每个键都与函数定义中的每个参数相匹配。
明确地调用参数的名称和它们所取的值有助于格外清楚地了解你所传递的内容,避免任何可能的混淆:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(name="Dionysia",language="Python")
#output:
#Hello, I am Dionysia and my favorite programming language is Python
如上所述,关键字参数可以有特定的顺序。但它们比位置参数更灵活,因为现在参数的顺序并不重要。
所以你可以这样做,不会有错误:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(language="Python",name="Dionysia")
#output:
#Hello, I am Dionysia and my favorite programming language is Python
但是你仍然必须给出正确的参数数量。
你可以在一个函数调用中同时使用位置参数和关键字参数,就像下面的例子,有一个位置参数和一个关键字参数:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language("dionysia",language="Python")
#output:
#Hello, I am dionysia and my favorite programming language is Python
在这种情况下,顺序又很重要。
位置参数总是排在前面,所有的关键字参数应该在位置参数之后,否则会出现错误:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(language="Python","dionysia")
如何在Python中定义一个带缺省值的参数
函数参数也可以有缺省值。它们被称为默认参数或可选参数。
为了使一个函数参数有一个缺省值,你必须在函数的定义中给这个参数指定一个缺省值。
你用key=value 形式来做,其中value 将是该参数的默认值:
def fave_language(language="python"):
print(f"My favorite programming language is {language}!")
fave_language()
#output
#My favorite programming language is python!
正如你所看到的,默认参数在函数调用中是不需要的,如果在调用中没有提供另一个值,language 的值将总是默认为 Python。
然而,如果你在函数的调用中提供另一个值,默认值可以很容易地被覆盖:
def fave_language(language="python"):
print(f"My favorite programming language is {language}!")
fave_language("Java")
#prints "My favorite programming language is Java!" to the console
可以有一个以上的默认值传递给函数。
当函数被调用时,可以不提供、提供一个、提供一些或全部默认参数,顺序并不重要:
def personal_details(name="Jimmy",age=28,city="Berlin"):
print(f"I am {name},{age} years old and live in {city}")
#We can do:
personal_details()
#output:
#I am Jimmy,28 years old and live in Berlin
personal_details(age=30)
#I am Jimmy,30 years old and live in Berlin
personal_details(city="Athens",name="Ben",age=24)
##I am Ben,24 years old and live in Athens
在函数的调用中,默认参数可以与非默认参数相结合。
下面是一个接受两个参数的函数:一个是位置性的、非默认的(name),一个是可选的、默认的(language):
def fave_language(name,language="Python"):
print(f"My name is {name} and my favorite programming language is {language}!")
fave_language("Dionysia")
#output:
#"My name is Dionysia and my favorite programming language is Python!"
默认参数,langyage="Python" ,是可选的。但是位置参数,name ,永远都是必须的。如果没有传入另一个language ,其值将总是默认为Python。
这里要提到的另一件事是,当defaults和non defaults一起使用时,它们在函数定义中定义的顺序很重要。
所有的位置参数放在前面,后面是默认参数。
这样就不能工作了:
def fave_language(language="Python",name):
print(f"My name is {name} and my favorite programming language is {language}!")
fave_language("Dionysia")
输出:
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
结论
在这篇文章中,你学会了如何在 Python 编程语言中声明函数并使用参数来调用它们。
这是对如何创建简单的函数以及如何用参数将数据传入函数的介绍。我们还讨论了不同类型的参数,如位置参数、关键字参数和默认参数。
回顾一下:
- 条件参数的顺序和数量很重要。
- 对于关键字参数,顺序并不重要。但数量确实重要,因为每个关键字参数都与函数定义中的每个参数相对应。
- 默认参数是完全可选的。你可以传入所有的参数,也可以传入部分参数,或者完全不传。
谢谢你的阅读,学习愉快。