Python 3 - 函数

  • 简述

    函数是一组有组织的、可重用的代码,用于执行单个相关操作。函数为您的应用程序提供更好的模块化和高度的代码重用。
    如您所知,Python 为您提供了许多内置函数,如 print() 等,但您也可以创建自己的函数。这些函数称为用户定义函数。

    定义函数

    您可以定义函数以提供所需的功能。以下是在 Python 中定义函数的简单规则。
    • 功能块以关键字开头def后跟函数名称和括号 ( ( ) )。
    • 任何输入参数或自变量都应放在这些括号内。您还可以在这些括号内定义参数。
    • 函数的第一条语句可以是可选语句——函数的文档字符串或文档字符串
    • 每个函数中的代码块都以冒号 (:) 开头并缩进。
    • 语句 return [expression] 退出函数,可选择将表达式返回给调用者。没有参数的 return 语句与 return None 相同。

    句法

    
    def functionname( parameters ):
       "function_docstring"
       function_suite
       return [expression]
    
    默认情况下,参数具有位置行为,您需要按照定义它们的相同顺序通知它们。

    例子

    以下函数将字符串作为输入参数并将其打印在标准屏幕上。
    
    def printme( str ):
       "This prints a passed string into this function"
       print (str)
       return
    
  • 调用函数

    定义函数为其命名,指定要包含在函数中的参数并构造代码块。
    函数的基本结构确定后,您可以通过从另一个函数或直接从 Python 提示符调用它来执行它。以下是调用的示例printme()功能 -
    
    #!/usr/bin/python3
    # Function definition is here
    def printme( str ):
       "This prints a passed string into this function"
       print (str)
       return
    # Now you can call printme function
    printme("This is first call to the user defined function!")
    printme("Again second call to the same function")
    
    执行上述代码时,会产生以下结果 -
    
    This is first call to the user defined function!
    Again second call to the same function
    
  • 通过引用与值

    Python 语言中的所有参数(arguments)都是通过引用传递的。这意味着如果您更改函数中参数所指的内容,该更改也会反映在调用函数中。例如 -
    
    #!/usr/bin/python3
    # Function definition is here
    def changeme( mylist ):
       "This changes a passed list into this function"
       print ("Values inside the function before change: ", mylist)
       
       mylist[2]=50
       print ("Values inside the function after change: ", mylist)
       return
    # Now you can call changeme function
    mylist = [10,20,30]
    changeme( mylist )
    print ("Values outside the function: ", mylist)
    
    在这里,我们维护传递对象的引用并在同一对象中附加值。因此,这将产生以下结果 -
    
    Values inside the function before change:  [10, 20, 30]
    Values inside the function after change:  [10, 20, 50]
    Values outside the function:  [10, 20, 50]
    
    还有一个例子,其中参数通过引用传递,并且引用在被调用函数中被覆盖。
    
    #!/usr/bin/python3
    # Function definition is here
    def changeme( mylist ):
       "This changes a passed list into this function"
       mylist = [1,2,3,4] # This would assi new reference in mylist
       print ("Values inside the function: ", mylist)
       return
    # Now you can call changeme function
    mylist = [10,20,30]
    changeme( mylist )
    print ("Values outside the function: ", mylist)
    
    参数mylist对于函数 changeme 是局部的。在函数内更改 mylist 不会影响 mylist。该函数什么也没做,最后会产生以下结果 -
    
    Values inside the function:  [1, 2, 3, 4]
    Values outside the function:  [10, 20, 30]
    
  • 函数参数

    您可以使用以下类型的形式参数调用函数 -
    • 必需的参数
    • 关键字参数
    • 默认参数
    • 变长参数
  • 必需的参数

    必需参数是以正确的位置顺序传递给函数的参数。在这里,函数调用中的参数数量应该与函数定义完全匹配。
    调用函数printme(),你肯定需要传递一个参数,否则它会给出如下语法错误 -
    
    #!/usr/bin/python3
    # Function definition is here
    def printme( str ):
       "This prints a passed string into this function"
       print (str)
       return
    # Now you can call printme function
    printme()
    
    执行上述代码时,会产生以下结果 -
    
    Traceback (most recent call last):
       File "test.py", line 11, in <module>
          printme();
    TypeError: printme() takes exactly 1 argument (0 given)
    
  • 关键字参数

    关键字参数与函数调用有关。当您在函数调用中使用关键字参数时,调用者通过参数名称识别参数。
    这允许您跳过参数或乱序放置它们,因为 Python 解释器能够使用提供的关键字将值与参数匹配。您还可以对printme()通过以下方式发挥作用 -
    
    #!/usr/bin/python3
    # Function definition is here
    def printme( str ):
       "This prints a passed string into this function"
       print (str)
       return
    # Now you can call printme function
    printme( str = "My string")
    
    执行上述代码时,会产生以下结果 -
    
    My string
    
    下面的例子给出了更清晰的画面。请注意,参数的顺序无关紧要。
    
    #!/usr/bin/python3
    # Function definition is here
    def printinfo( name, age ):
       "This prints a passed info into this function"
       print ("Name: ", name)
       print ("Age ", age)
       return
    # Now you can call printinfo function
    printinfo( age = 50, name = "miki" )
    
    执行上述代码时,会产生以下结果 -
    
    Name:  miki
    Age  50
    
  • 默认参数

    默认参数是在函数调用中未为该参数提供值时采用默认值的参数。以下示例给出了默认参数的想法,如果未通过,它会打印默认年龄 -
    
    #!/usr/bin/python3
    # Function definition is here
    def printinfo( name, age = 35 ):
       "This prints a passed info into this function"
       print ("Name: ", name)
       print ("Age ", age)
       return
    # Now you can call printinfo function
    printinfo( age = 50, name = "miki" )
    printinfo( name = "miki" )
    
    执行上述代码时,会产生以下结果 -
    
    Name:  miki
    Age  50
    Name:  miki
    Age  35
    
  • 变长参数

    您可能需要为函数处理比您在定义函数时指定的参数更多的参数。与必需参数和默认参数不同,这些参数称为可变长度参数,并且未在函数定义中命名。
    下面给出了具有非关键字变量参数的函数的语法 -
    
    def functionname([formal_args,] *var_args_tuple ):
       "function_docstring"
       function_suite
       return [expression]
    
    星号 (*) 放在保存所有非关键字变量参数值的变量名之前。如果在函数调用期间未指定其他参数,则此元组保持为空。以下是一个简单的例子 -
    
    #!/usr/bin/python3
    # Function definition is here
    def printinfo( arg1, *vartuple ):
       "This prints a variable passed arguments"
       print ("Output is: ")
       print (arg1)
       
       for var in vartuple:
          print (var)
       return
    # Now you can call printinfo function
    printinfo( 10 )
    printinfo( 70, 60, 50 )
    
    执行上述代码时,会产生以下结果 -
    
    Output is:
    10
    Output is:
    70
    60
    50
    
  • 匿名函数

    这些函数之所以称为匿名函数,是因为它们不是通过使用def关键词。您可以使用lambda关键字来创建小的匿名函数。
    • Lambda 形式可以采用任意数量的参数,但仅以表达式的形式返回一个值。它们不能包含命令或多个表达式。
    • 匿名函数不能直接调用 print,因为 lambda 需要表达式。
    • Lambda 函数有自己的局部命名空间,不能访问除参数列表中的变量和全局命名空间中的变量之外的变量。
    • 虽然看起来 lambda 是函数的单行版本,但它们并不等同于 C 或 C++ 中的内联语句,其目的是为了性能原因在调用期间通过传递函数来堆栈分配。

    句法

    的语法lambda函数只包含一个语句,如下 -
    
    lambda [arg1 [,arg2,.....argn]]:expression
    
    下面是一个例子来说明如何lambda功能形式 -
    
    #!/usr/bin/python3
    # Function definition is here
    sum = lambda arg1, arg2: arg1 + arg2
    # Now you can call sum as a function
    print ("Value of total : ", sum( 10, 20 ))
    print ("Value of total : ", sum( 20, 20 ))
    
    执行上述代码时,会产生以下结果 -
    
    Value of total :  30
    Value of total :  40
    
  • 退货声明

    语句 return [expression] 退出函数,可选择将表达式返回给调用者。没有参数的 return 语句与 return None 相同。
    下面给出的所有示例都没有返回任何值。您可以从函数返回一个值,如下所示 -
    
    #!/usr/bin/python3
    # Function definition is here
    def sum( arg1, arg2 ):
       # Add both the parameters and return them."
       total = arg1 + arg2
       print ("Inside the function : ", total)
       return total
    # Now you can call sum function
    total = sum( 10, 20 )
    print ("Outside the function : ", total )
    
    执行上述代码时,会产生以下结果 -
    
    Inside the function :  30
    Outside the function :  30
    
  • 变量范围

    程序中的所有变量可能无法在该程序的所有位置访问。这取决于您声明变量的位置。
    变量的范围决定了您可以访问特定标识符的程序部分。Python 中有两个基本的变量范围:
    • 全局变量
    • 局部变量
  • 全局变量与局部变量

    在函数体内定义的变量具有局部作用域,而在外部定义的变量具有全局作用域。
    这意味着局部变量只能在声明它们的函数内部访问,而全局变量可以在整个程序主体中被所有函数访问。当你调用一个函数时,它内部声明的变量被引入作用域。以下是一个简单的例子 -
    
    #!/usr/bin/python3
    total = 0   # This is global variable.
    # Function definition is here
    def sum( arg1, arg2 ):
       # Add both the parameters and return them."
       total = arg1 + arg2; # Here total is local variable.
       print ("Inside the function local total : ", total)
       return total
    # Now you can call sum function
    sum( 10, 20 )
    print ("Outside the function global total : ", total )
    
    执行上述代码时,会产生以下结果 -
    
    Inside the function local total :  30
    Outside the function global total :  0