如何在Python3中定义函数

函数是执行动作的指令块,并且一旦被定义,就可以被重用。函数使代码更模块化,允许你一遍又一遍地使用相同的代码。 Python有许多你可能熟悉的内置函数,...

介绍

函数是执行动作的指令块,并且一旦被定义,就可以被重用。函数使代码更模块化,允许你一遍又一遍地使用相同的代码。 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
您应该会收到以下输出:
Hello, 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循环作为两个单独的函数。 在程序中定义函数使我们的代码模块化和可重用,以便我们可以调用相同的函数而不重写它们。

使用参数

到目前为止,我们已经研究了没有接受参数的空圆括号的函数,但是我们可以在它们的括号内的函数定义中定义参数。 参数是函数定义中的命名实体,指定函数可以接受的参数。 让我们创建一个包含参数xyz的小程序。我们将创建一个将参数添加到不同配置中的函数。这些的总和将由函数打印。然后我们将调用函数并将数字传递给函数。
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参数的数字1y参数的2z参数的3。这些值按照给出的顺序与每个参数相对应。 程序本质上是基于我们传递给参数的值执行以下数学:
a = 1 + 2
b = 1 + 3
c = 2 + 3
该函数还打印abc ,并基于上面的数学,我们期望a等于3b4c5 。让我们运行程序:
python add_numbers.py
3 4 5
当我们将13作为参数传递给add_numbers()函数时,我们接收到预期的输出。 参数是通常在函数定义中定义为变量的参数。当您运行该方法时,可以将参数传递给函数,它们可以被赋值。

关键字参数

除了按顺序调用参数之外,还可以在函数调用中使用关键字参数 ,调用者通过参数名称来标识参数。 当您使用关键字参数时,可以使用参数乱序,因为Python解释器将使用提供的关键字将值与参数匹配。 让我们创建一个函数来显示用户的个人资料信息。我们将以username (意为字符串)和followers (意为整数)的形式传递参数给它。
profile.py
# Define function with parameters
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

在函数定义语句中, usernamefollowers包含在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
Username: 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命令再次运行程序时,我们将收到以下输出:
Username: 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命令运行程序时,我们将收到以下输出:
Username: 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
9
整数9作为输出返回,这是我们期望通过要求Python找到3的平方。 为了进一步理解return语句的工作原理,我们可以注释掉程序中的return语句:
square.py
def square(x):
    y = x ** 2
    # return y

result = square(3)
print(result)

现在,让我们再次运行程序:
python square.py
None
在这里不使用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等于函数的结果,如我们上面所做的那样,取13 。 然后我们调用sums变量的打印。 让我们再次运行程序,它有return语句:
python add_numbers.py
(3, 4, 5)
我们收到相同的数字35作为输出,我们以前使用函数中的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
我们将收到以下输出:
This 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__':语句可以以逻辑方式组织你的代码,使其更可读和更模块化。

结论

函数是在程序中执行操作的指令的代码块,有助于使我们的代码可重用和模块化。 要了解有关如何使代码更加模块化的更多信息,您可以阅读我们的有关如何在Python 3中编写模块的指南。