介绍
函数是执行动作的指令块,并且一旦被定义,就可以被重用。函数使代码更模块化,允许你一遍又一遍地使用相同的代码。 Python有许多你可能熟悉的内置函数,包括:print()
将打印一个对象到终端int()
,它将字符串或数字数据类型转换为整数数据类型len()
返回对象的长度
定义函数
让我们开始把经典的 “Hello,World!”程序转换成一个函数。 我们将在我们选择的文本编辑器中创建一个新的文本文件,并调用程序hello.py
。然后,我们将定义该函数。 一个函数是通过使用
def
关键字,后面跟你选择的名称,后面跟一个括号,它保存函数将采取的任何参数(它们可以是空的),并以冒号结束。 在这种情况下,我们将定义一个名为
hello()
的函数:
hello.py
def hello():
这将设置用于创建函数的初始语句。 从这里,我们将添加一个4空格缩进的第二行,以提供该函数的功能的说明。在这种情况下,我们将打印
Hello, World!
到控制台:
hello.py
def hello():
print("Hello, World!")
我们的函数现在已经完全定义,但是如果我们在这一点上运行程序,没有什么会发生,因为我们没有调用该函数。 因此,在我们定义的函数块之外,让我们使用
hello()
调用函数:
hello.py
def hello():
print("Hello, World!")
hello()
现在,让我们运行程序:
python hello.py
您应该会收到以下输出:
OutputHello, World!
函数可能比我们上面定义的
hello()
函数更复杂。 例如,我们可以在函数块中使用
for
循环 ,
条件语句等。 例如,下面定义的函数使用条件语句来检查
name
变量的输入是否包含元音,然后使用
for
循环遍历
name
字符串中的字母。
names.py
# Define function names()
def names():
# Set up name variable with input
name = str(input('Enter your name: '))
# Check whether name has a vowel
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Iterate over name
for letter in name:
print(letter)
# Call the function
names()
我们在上面定义的
names()
函数设置了一个条件语句和一个
for
循环,显示了如何在一个函数定义中组织代码。 然而,根据我们打算使用我们的程序和我们如何设置我们的代码,我们可能想要定义条件语句和
for
循环作为两个单独的函数。 在程序中定义函数使我们的代码模块化和可重用,以便我们可以调用相同的函数而不重写它们。
使用参数
到目前为止,我们已经研究了没有接受参数的空圆括号的函数,但是我们可以在它们的括号内的函数定义中定义参数。 参数是函数 定义中的命名实体,指定函数可以接受的参数。 让我们创建一个包含参数x
,
y
和
z
的小程序。我们将创建一个将参数添加到不同配置中的函数。这些的总和将由函数打印。然后我们将调用函数并将数字传递给函数。
add_numbers.py
def add_numbers(x, y, z):
a = x + y
b = x + z
c = y + z
print(a, b, c)
add_numbers(1, 2, 3)
我们传递了
x
参数的数字
1
,
y
参数的
2
和
z
参数的3。这些值按照给出的顺序与每个参数相对应。 程序本质上是基于我们传递给参数的值执行以下数学:
a = 1 + 2
b = 1 + 3
c = 2 + 3
该函数还打印
a
,
b
和
c
,并基于上面的数学,我们期望
a
等于
3
,
b
为
4
,
c
为
5
。让我们运行程序:
python add_numbers.py
Output3 4 5
当我们将
1
和
3
作为参数传递给
add_numbers()
函数时,我们接收到预期的输出。 参数是通常在函数定义中定义为变量的参数。当您运行该方法时,可以将参数传递给函数,它们可以被赋值。
关键字参数
除了按顺序调用参数之外,还可以在函数调用中使用 关键字参数 ,调用者通过参数名称来标识参数。 当您使用关键字参数时,可以使用参数乱序,因为Python解释器将使用提供的关键字将值与参数匹配。 让我们创建一个函数来显示用户的个人资料信息。我们将以username
(意为字符串)和
followers
(意为整数)的形式传递参数给它。
profile.py
# Define function with parameters
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
在函数定义语句中,
username
和
followers
包含在
profile_info()
函数的括号中。函数的块使用两个参数将关于用户的信息打印为字符串。 现在,我们可以调用函数并为其分配参数:
profile.py
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
# Call function with parameters assigned as above
profile_info("sammyshark", 945)
# Call function with keyword arguments
profile_info(username="AlexAnglerfish", followers=342)
在第一个函数调用中,我们使用sammyshark的用户名和跟随者是
945
填充信息,在第二个函数调用中,我们使用关键字参数,为参数变量赋值。 让我们运行程序:
python profile.py
OutputUsername: sammyshark
Followers: 945
Username: AlexAnglerfish
Followers: 342
输出显示两个用户的用户名和关注者数量。 这也允许我们修改参数的顺序,如在具有不同调用的相同程序的该示例中:
profile.py
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
# Change order of parameters
profile_info(followers=820, username="cameron-catfish")
当我们使用
python profile.py
命令再次运行程序时,我们将收到以下输出:
OutputUsername: cameron-catfish
Followers: 820
因为函数定义维护着
print()
语句的相同顺序,如果我们使用关键字参数,那么我们将它们传递到函数调用中的顺序并不重要。
默认参数值
我们还可以为一个或两个参数提供默认值。让我们为followers
参数创建一个值为1的默认值:
profile.py
def profile_info(username, followers=1):
print("Username: " + username)
print("Followers: " + str(followers))
现在,我们可以运行该函数只分配用户名功能,跟随者的数量将自动默认为1.我们还可以更改追随者的数量,如果我们想。
profile.py
def profile_info(username, followers=1):
print("Username: " + username)
print("Followers: " + str(followers))
profile_info(username="JOctopus")
profile_info(username="sammyshark", followers=945)
当我们使用
python profile.py
命令运行程序时,我们将收到以下输出:
OutputUsername: JOctopus
Followers: 1
Username: sammyshark
Followers: 945
为默认参数提供值可以让我们跳过已经有默认值的每个参数的定义值。
返回值
您可以将参数值传递到函数中,并且函数也可以生成值。 函数可以使用return
语句生成一个值,这将退出一个函数并
可选地将
表达式传递回调用者。 如果使用没有参数的
return
语句,函数将返回
None
。 到目前为止,我们在函数中使用了
print()
语句,而不是
return
语句。让我们创建一个程序,而不是打印将返回一个变量。 在一个名为
square.py
的新文本文件中,我们将创建一个程序,对参数
x
进行平方,并返回变量
y
。 我们发出一个调用来打印
result
变量,它是通过运行
square()
函数形成的,传入
3
。
square.py
def square(x):
y = x ** 2
return y
result = square(3)
print(result)
我们可以运行程序并查看输出:
python square.py
Output9
整数
9
作为输出返回,这是我们期望通过要求Python找到3的平方。 为了进一步理解
return
语句的工作原理,我们可以注释掉程序中的
return
语句:
square.py
def square(x):
y = x ** 2
# return y
result = square(3)
print(result)
现在,让我们再次运行程序:
python square.py
OutputNone
在这里不使用
return
语句,程序不能返回一个值,所以该值默认为
None
。 作为另一个例子,在上面的
add_numbers.py
程序中,我们可以换一个
return
语句的
print()
语句。
add_numbers.py
def add_numbers(x, y, z):
a = x + y
b = x + z
c = y + z
return a, b, c
sums = add_numbers(1, 2, 3)
print(sums)
在函数之外,我们设置变量
sums
等于函数的结果,如我们上面所做的那样,取
1
和
3
。 然后我们调用
sums
变量的打印。 让我们再次运行程序,它有
return
语句:
python add_numbers.py
Output(3, 4, 5)
我们收到相同的数字
3
和
5
作为输出,我们以前使用函数中的
print()
语句。 这次它作为一个
元组传递,因为
return
语句的
表达式列表至少有一个逗号。 函数在
return
语句时立即退出,无论它们是否
return
值。
return_loop.py
def loop_five():
for x in range(0, 25):
print(x)
if x == 5:
# Stop function at x == 5
return
print("This line will not execute.")
loop_five()
在
for
循环中使用
return
语句将结束该函数,因此在循环外部的行将不会运行。 如果相反,我们使用了
break
语句 ,那么只有循环将退出,并且最后的
print()
行将运行。
return
语句退出一个函数,并且可以在发出参数时返回一个值。
使用main()
作为函数
虽然在Python中,你可以调用程序底部的函数,并且它将运行(如我们在上面的例子中所做的),许多编程语言(如C ++和Java)需要一个
main
函数来执行。 包括
main()
函数,虽然不是必需的,但可以以逻辑方式构建我们的Python程序,将程序的最重要的组件放在一个函数中。它也可以使我们的程序更容易非Python程序员阅读。 我们将从上面的
hello.py
程序中添加一个
main()
函数。 我们将保持我们的
hello()
函数,然后定义一个
main()
函数:
hello.py
def hello():
print("Hello, World!")
def main():
在
main()
函数中,让我们包括一个
print()
语句,让我们知道我们在
main()
函数中。 另外,让我们在
main()
函数中调用
hello()
main()
函数:
hello.py
def hello():
print("Hello, World!")
def main():
print("This is the main function")
hello()
最后,在程序的底部,我们将调用
main()
函数:
hello.py
def hello():
print("Hello, World!")
def main():
print("This is the main function.")
hello()
main()
此时,我们可以运行我们的程序:
python hello.py
我们将收到以下输出:
OutputThis is the main function.
Hello, World!
因为我们在
main()
调用
hello()
函数,然后只调用
main()
运行,
Hello, World!
文本只打印一次,后面的字符串告诉我们我们在主函数。 接下来,我们将使用多个函数,因此值得审查
全局变量
和局部变量的变量范围。如果在函数块中定义一个变量,你只能在该函数中使用该变量。如果你想在函数中使用变量,最好声明一个全局变量。 在Python中,
'__main__'
是顶层代码将执行的作用域的名称。 当程序从标准输入,脚本或交互式提示运行时,其
__name__
设置为等于
'__main__'
。 因此,存在使用以下构造的惯例:
if __name__ == '__main__':
# Code to run when this is the main program here
这允许程序文件使用:
- 作为主程序并运行后面的
if
语句 - 作为一个模块而不是运行
if
语句后面。
names.py
程序,并创建一个名为
more_names.py
的新文件。 在这个程序中,我们将声明一个全局变量并修改我们的原始
names()
函数,使得指令在两个离散函数中。 第一个函数,
has_vowel()
将检查
name
字符串是否包含元音。 第二个函数
print_letters()
将打印
name
字符串的每个字母。
more_names.py
# Declare global variable name for use in all functions
name = str(input('Enter your name: '))
# Define function to check if name contains a vowel
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Iterate over letters in name string
def print_letters():
for letter in name:
print(letter)
使用这个设置,让我们定义
main()
函数,它将包含对
has_vowel()
和
print_letters()
函数的调用。
more_names.py
# Declare global variable name for use in all functions
name = str(input('Enter your name: '))
# Define function to check if name contains a vowel
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Iterate over letters in name string
def print_letters():
for letter in name:
print(letter)
# Define main method that calls other functions
def main():
has_vowel()
print_letters()
最后,我们将在文件的底部添加
if __name__ == '__main__':
main__
if __name__ == '__main__':
结构。 为了我们的目的,因为我们把所有的函数都放在
main()
函数中,我们将在
if
语句之后调用
main()
函数。
update_names.py
# Declare global variable name for use in all functions
name = str(input('Enter your name: '))
# Define function to check if name contains a vowel
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Iterate over letters in name string
def print_letters():
for letter in name:
print(letter)
# Define main method that calls other functions
def main():
has_vowel()
print_letters()
# Execute main() function
if __name__ == '__main__':
main()
我们现在可以运行程序:
python more_names.py
该程序将显示与
names.py
程序相同的输出,但是这里的代码更有条理,可以以模块化的方式使用而无需修改。 如果你不想声明一个
main()
函数,你也可以这样结束程序:
more_names.py
...
if __name__ == '__main__':
has_vowel()
print_letters()
使用
main()
作为函数,
if __name__ == '__main__':
main__
if __name__ == '__main__':
语句可以以逻辑方式组织你的代码,使其更可读和更模块化。