Python中的Functions 功能官方详解(附代码)

函数是可重用的程序片段。它们允许您为语句块指定名称,从而允许您在程序中的任何位置使用指定的名称运行该块,次数不限。这称为调用函数。我们已经使用了许多内置函数,例如 len 和 range。

函数概念可能是任何非平凡软件(在任何编程语言中)最重要的构建块,因此我们将在本章中探讨函数的各个方面。

函数是使用 def 关键字定义的。此关键字后面是函数的标识符名称,后跟一对括号(可能包含一些变量名称),最后一个冒号(结束该行)。接下来是属于此函数的语句块。一个例子将表明这实际上非常简单:

def say_hello():
    # block belonging to the function
    print('hello world')
# End of function

say_hello()  # call the function
say_hello()  # call the function again
Output: 输出:

$ python function1.py
hello world
hello world

我们使用上述语法定义一个名为 say_你好 的函数。此函数不接受任何参数,因此括号中没有声明任何变量。函数的参数只是函数的输入,因此我们可以向它传递不同的值并返回相应的结果。

Notice that we can call the same function twice which means we do not have to write the same code again.
请注意,我们可以两次调用相同的函数,这意味着我们不必再次编写相同的代码。

Function Parameters 功能参数
函数可以接受参数,这些参数是您提供给函数的值,以便函数可以利用这些值执行某些操作。这些参数与变量类似,不同之处在于这些变量的值是在我们调用函数时定义的,并且在函数运行时已经被分配了值。
参数在函数定义的一对括号内指定,用逗号分隔。当我们调用函数时,我们以相同的方式提供值。请注意使用的术语 – 函数定义中给出的名称称为 parameters,而您在函数调用中提供的值称为

arguments。
def print_max(a, b):
    if a > b:
        print(a, 'is maximum')
    elif a == b:
        print(a, 'is equal to', b)
    else:
        print(b, 'is maximum')

# directly pass literal values
print_max(3, 4)

x = 5
y = 7

# pass variables as arguments
print_max(x, y)
Output: 输出:

$ python function_param.py
4 is maximum
7 is maximum

在这里,我们定义了一个名为 print_max 的函数,它使用两个名为 a 和 b 的参数。我们用一个简单的if… 找出更大的数字。else 语句,然后打印更大的数字。
第一次调用 print_max 函数时,我们直接将数字作为参数提供。在第二种情况下,我们调用以变量作为参数的函数。print_max(x, y) 导致将参数 x 的值分配给参数 a,将参数 y 的值分配给参数 b。print_max 函数在这两种情况下的工作方式相同。

Local Variables 局部变量

当您在函数定义中声明变量时,它们与函数外部使用的具有相同名称的其他变量没有任何关系 – 即变量名称是函数的本地变量。这称为变量的范围。所有变量都具有从名称定义点开始声明它们的块的范围。

x = 50


def func(x):
    print('x is', x)
    x = 2
    print('Changed local x to', x)


func(x)
print('x is still', x)
Output: 输出:

$ python function_local.py
x is 50
Changed local x to 2
x is still 50

第一次在函数体的第一行打印名称 x 的值时,Python 使用在函数定义上方的主块中声明的参数的值。

接下来,我们将值 2 分配给 x。名称 x 是我们函数的本地名称。因此,当我们更改函数中 x 的值时,主块中定义的 x 不受影响。

在最后一个 print 语句中,我们显示 main 块中定义的 x 值,从而确认它实际上不受先前调用的函数中的本地赋值的影响。

global 语句

如果你想为在程序顶层定义的名称赋值(即不在任何类型的作用域内,例如函数或类),那么你必须告诉 Python 该名称不是局部的,而是全局的。我们使用 global 语句来做到这一点。如果没有 global 语句,就不可能为在函数外部定义的变量赋值。

您可以使用在函数外部定义的此类变量的值(假设函数中没有同名的变量)。但是,不建议这样做,应该避免这样做,因为程序的读者不清楚该变量的定义在哪里。使用 global 语句可以清楚地表明该变量是在最外层的块中定义的。

x = 50


def func():
    global x

    print('x is', x)
    x = 2
    print('Changed global x to', x)


func()
print('Value of x is', x)
Output: 输出:

$ python function_global.py
x is 50
Changed global x to 2
Value of x is 2

global 语句用于声明 x 是一个全局变量 – 因此,当我们在函数中为 x 赋值时,当我们在主块中使用 x 的值时,该更改会反映出来。
您可以使用相同的 global 语句指定多个 global 变量,例如 global x, y, z。

Default Argument Values 默认参数值

对于某些函数,您可能希望将某些参数设为可选参数,并使用默认值,以防用户不想为它们提供值。这是在 default argument values 的帮助下完成的。您可以通过在函数定义中的参数名称后附加赋值运算符 (=) 后跟默认值来指定参数的默认参数值。

请注意,默认参数值应为常量。更准确地说,默认参数值应该是不可变的 – 这将在后面的章节中详细解释。现在,请记住这一点。

def say(message, times=1):
    print(message * times)

say('Hello')
say('World', 5)
Output: 输出:

$ python function_default.py
Hello
WorldWorldWorldWorldWorld

名为 say 的函数用于打印指定多次的字符串。如果我们不提供值,那么默认情况下,字符串只打印一次。我们通过为参数 times 指定默认参数值 1 来实现这一点。

在 say 的第一次用法中,我们只提供字符串,它打印一次字符串。在 say 的第二次用法中,我们同时提供字符串和参数 5 ,说明我们想说字符串 message 5 次。

CAUTION 谨慎
只有位于参数列表末尾的那些参数才能被赋予默认参数值,即在函数的参数列表中,你不能在没有默认参数值的参数之前有一个具有默认参数值的参数。
这是因为这些值是按位置分配给参数的。例如,def func(a, b=5) 有效,但 def func(a=5, b) 无效。

Keyword Arguments 关键字参数

如果您有一些具有许多参数的函数,并且只想指定其中的一些,那么您可以通过命名来为此类参数指定值 – 这称为关键字参数 – 我们使用名称(关键字)而不是位置(我们一直在使用)来指定函数的参数。

有两个优点 – 第一,使用该函数更容易,因为我们不需要担心参数的顺序。第二,我们可以只为那些我们想要的参数赋值,前提是其他参数具有默认参数值。

def func(a, b=5, c=10):
    print('a is', a, 'and b is', b, 'and c is', c)

func(3, 7)
func(25, c=24)
func(c=50, a=100)
Output: 输出:

$ python function_keyword.py
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50

VarArgs parameters VarArgs 参数

有时你可能想定义一个可以接受任意数量的参数的函数,即可变数量的参数,这可以通过使用星号来实现:

def total(a=5, *numbers, **phonebook):
    print('a', a)

    #iterate through all the items in tuple
    for single_item in numbers:
        print('single_item', single_item)

    #iterate through all the items in dictionary    
    for first_part, second_part in phonebook.items():
        print(first_part,second_part)

total(10,1,2,3,Jack=1123,John=2231,Inge=1560)
Output: 输出:

$ python function_varargs.py
a 10
single_item 1
single_item 2
single_item 3
Inge 1560
John 2231
Jack 1123

当我们声明一个带星标的参数(例如 *param)时,从该点到结尾的所有位置参数都被收集为一个名为 ‘param’ 的元组。
同样,当我们声明一个双星标参数(例如 **param)时,从该点到结尾的所有关键字参数都被收集为一个名为 ‘param’ 的字典。

return 语句

return 语句用于从函数返回,即跳出函数。我们也可以选择从函数中返回一个值。

def maximum(x, y):
    if x > y:
        return x
    elif x == y:
        return 'The numbers are equal'
    else:
        return y

print(maximum(2, 3))
Output: 输出:

$ python function_return.py
3

请注意,没有值的 return 语句等效于 return None。None 是 Python 中的一种特殊类型,表示 nothingness。例如,它用于指示如果变量的值为 None,则该变量没有值。

DocStrings 文档字符串

Python 有一个漂亮的功能,称为 documentation strings,通常用其较短的名称 docstrings 来引用。DocString 是您应该使用的重要工具,因为它有助于更好地记录程序并使其更易于理解。令人惊讶的是,我们甚至可以在程序实际运行时从函数中取回文档字符串!

def print_max(x, y):
    '''Prints the maximum of two numbers.

    The two values must be integers.'''
    # convert to integers, if possible
    x = int(x)
    y = int(y)

    if x > y:
        print(x, 'is maximum')
    else:
        print(y, 'is maximum')

print_max(3, 5)
print(print_max.__doc__)
Output: 输出:

$ python function_docstring.py
5 is maximum
Prints the maximum of two numbers.

    The two values must be integers.

函数的第一个逻辑行上的字符串是该函数的文档字符串。请注意,DocString 也适用于模块和类,我们将在相应的章节中学习。

文档字符串遵循的约定是多行字符串,其中第一行以大写字母开头,以点结尾。然后,第二行为空,后跟从第三行开始的任何详细说明。强烈建议你对所有非平凡函数的所有文档字符串都遵循这个约定。

我们可以使用函数的 doc(注意双下划线)属性(名称属于)来访问 print_max 函数的文档字符串。请记住,Python 将所有内容视为一个对象,其中包括函数。我们将在 classes 一章中了解有关对象的更多信息。
如果你在 Python 中使用过 help(),那么你已经看到了文档字符串的用法!它所做的只是获取该函数的 doc 属性,并以整洁的方式为您显示它。你可以在上面的函数中尝试一下 – 只需在你的程序中包含 help(print_max) 即可。请记住按 q 键退出帮助。

自动化工具可以以这种方式从您的程序中检索文档。因此,我强烈建议您对编写的任何重要函数使用文档字符串。Python 发行版附带的 pydoc 命令的工作方式类似于使用文档字符串的 help()。

作者:Te amo Συγγνώμη

物联沃分享整理
物联沃-IOTWORD物联网 » Python中的Functions 功能官方详解(附代码)

发表回复