当你第一次开始学习Python时,你会看到有大量的内置函数。你有像print() 这样的函数来打印输出到控制台,input() 来接收用户的输入,还有更多。
但是 Python 也给了你创建自己的函数和传递额外信息的自由,比如参数和论据。
在这篇文章中,你将学习如何声明函数以及如何声明带参数的函数。我们还将介绍在传入参数时如何调用函数。
让我们开始吧!
什么是函数?
一个函数是一个代码块,只有在被引用或调用时才会运行。
在任何编程语言中,函数的目的是帮助我们组织我们的代码,防止它重复。
当我们在程序的不同部分复制和粘贴相同的代码时,这可能是我们需要一个函数的信号。
函数是一段可重复使用的代码,是为了在程序的不同地方使用。
如果我们想重复某个动作,我们可以为它定义一个函数,并在需要时调用它。
如何在 Python 中创建一个函数
基本的语法是这样的:
def function_name(argument_name):
body of function with the action to be taken on argument names
例如:"我是谁?
def hello_world_func():
print("hello world")
让我们把它分解一下:
- Python 中的一个函数是用
def关键字定义的。def告诉 Python 一个函数定义即将开始。 - 然后我们有一个函数的名字--在这个例子中是
hello_world_func。 - 接下来我们有一组开括号和闭括号
()。在括号内,你可以传递零个、一个或多个用逗号隔开的参数名称(或称为参数)和它们的可选缺省值。 - 然后,我们有一个冒号
:,它是函数的开始。 - 接下来是一个新的行,后面是一个缩进级别(你可以用键盘的4个空格或者用1个Tab来代替)。
- 然后是正文,包括函数的内容和动作。
- 最后,在函数的主体中还有一个可选的返回语句,在函数退出时向调用者传回一个值。
在上面的例子中,该函数不接受任何参数,也没有返回语句。这意味着它不返回任何东西,而且每当它被调用时,都会打印出hello world 。
请记住,如果你忘记了小括号() 或冒号: ,Python 会用一个SyntaxError 让你知道。
如何在 Python 中定义带参数的函数
参数是被传递到函数中的信息 (数据)。它们是参数的名称。
一个参数是一个命名的占位符--一个变量--传递到函数中。
你把它列在函数的括号里,在函数的名称后面,在函数的定义行:
def hello_to_you(name):
print("Hello " + name)
在我们的例子中,我们给出了一个参数,name ,这意味着我们的函数只接受一个参数的名字。
我们可以用f-string格式化来代替--它的工作原理和上面一样:
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!")
如何在Python中定义一个带有缺省值的参数
到目前为止,我们已经触及了没有默认值的函数。
但是我们也可以创建一个带有缺省值的参数:
def fave_language(language="python"):
print(f"My favorite programming language is {language}!")
如何在 Python 中调用函数
一旦你定义了一个函数,代码将不会自己运行。
为了执行函数中的代码,你必须进行函数调用,否则就是函数调用。
然后,你可以随心所欲地多次调用该函数。
要调用一个函数,你需要:
- 输入函数名称。
- 函数名后面必须有括号。
- 如果有任何必要的参数,它们必须在括号中传递。
从前面开始调用你的函数,它不吸收任何参数,看起来像这样:
def hello_world_func():
print("hello world")
hello_world_func()
# prints "hello world" to the console
如何在 Python 中调用带参数的函数
参数,像参数一样,是被传递到函数中的信息。
参数是我们在调用函数时传入的实际值。
使用我们前面的例子,调用一个有一个所需参数的函数会是这样的:
def hello_to_you(name):
print(f"Hello {name}")
hello_to_you("Timmy")
#Prints "Hello Timmy" to the console
在这种情况下,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")
#Prints "Hello,Timmy Jones" to the console
#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
既然我们已经谈到了参数传递的顺序很重要,那么值得注意的是,如果我们像这样使用key = value 语法,那么顺序并不重要:
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(language="Python"):
print(f"My favorite programming language is {language}!")
fave_language()
#prints "My favorite programming language is Python!" to the console
在这种情况下,如果没有提供参数,语言将始终是 "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。
在这种情况下,顺序又很重要。
如果我们换成这样做:
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 编程语言中声明函数和用参数调用它们。
我们首先介绍了如何创建简单的函数,以及如何用参数把数据传给它们。然后我们讨论了调用函数的不同方式。
谢谢你的阅读,祝你编码愉快