Python 有一堆有用的内置函数,你可以用它来做各种事情。每个函数都能都执行特定的任务。但是您知道 Python 还允许您定义自己的函数吗?本文将向您展示如何创建和调用您自己的 Python 函数。它还将为您概述如何将输入参数和参数传递给您的函数。
什么是函数?
函数是执行特定任务的隔离代码块。
函数在编程中很有用,因为它们消除了在整个程序中不必要和过多的代码复制和粘贴。
如果在不同的地方经常需要某个动作,这是一个很好的指标,你可以为它编写一个函数。函数是可重用的。
函数还有助于组织您的代码。
如果您需要进行更改,则只需更新该特定功能。这使您不必通过复制和粘贴来搜索分散在程序中不同位置的相同代码的不同部分。
这符合软件开发中的 DRY(不要重复自己)原则。
函数内的代码仅在函数被调用时运行。
函数可以接受参数和默认值,并且在代码运行后可能会或不会将值返回给调用者。
如何在 Python 中定义函数
在 Python 中创建函数的一般语法如下所示:
def function_name(parameters):
function body
让我们分解一下这里发生的事情:
- def 是一个关键字,告诉 Python 正在定义一个新函数。
- 接下来是您选择的有效函数名称。有效名称以字母或下划线开头,但可以包含数字。单词是小写的并用下划线分隔。重要的是要知道函数名不能是 Python 保留关键字。
- 然后我们有一组左括号和右括号,()。在它们内部,可以有零个、一个或多个可选的逗号分隔参数及其可选的默认值。这些被传递给函数。
- 接下来是一个冒号,:结束函数的定义行。
- 然后是一个新行,后跟缩进级别(您可以使用键盘或使用 1 个 Tab 使用 4 个空格来执行此操作)。缩进很重要,因为它让 Python 知道哪些代码将属于函数。
- 然后我们有函数的主体。这里是要执行的代码 - 调用函数时要执行的操作的内容。
- 最后,函数体中有一个可选的return 语句,在函数退出时将一个值传回给调用者。
请记住,如果您在尝试定义新函数时忘记了括号()或冒号:,Python 将报错:SyntaxError.
如何在 Python 中定义和调用基本函数
下面是一个没有 return 语句并且不接受任何参数的基本函数的示例。
它只是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
位置参数的顺序很重要
除了包括正确数量的参数外,重要的是要注意参数传递的顺序很重要。
参数的传递顺序必须与函数定义中声明的参数的顺序完全相同。
它的工作原理类似于变量赋值。
第一个参数是函数定义中第一个参数的值。第二个参数是函数 ddefinition 中第二个参数的值——依此类推。
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"是optional。但是位置参数 ,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 编程语言中声明函数并使用参数调用它们。
这是关于如何创建简单函数以及如何使用参数将数据传递给它们的介绍。我们还讨论了不同类型的参数,如positional、keyword和default参数。
回顾一下:
- 位置参数的顺序和数量很重要。
- 对于关键字参数,顺序无关紧要。但是,数字确实很重要,因为每个关键字参数都对应于函数定义中的每个参数。
- 默认参数完全是可选的。您可以传递所有这些,其中一些,或者根本不传递。