函数是一组有组织的,可重用的代码,用于执行单个相关操作。 函数为您的应用程序提供更好的模块性,并提供高度的代码重用。

正如你已经知道的那样,Python为你提供了许多内置的函数,如print()等,但是你也可以创建你自己的函数。 这些功能被称为用户定义的功能。

定义一个函数

您可以定义函数来提供所需的功能。 以下是在Python中定义函数的简单规则。

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。

  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。

  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

  • 函数内容以冒号起始,并且缩进。

  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

语法

Python 定义函数使用 def 关键字,一般格式如下

def 函数名(参数列表):
    函数体

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

以下函数将字符串作为输入参数并将其打印在标准屏幕上。

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语言中的所有参数(参数)均通过引用传递。 这意味着,如果您更改某个函数中参数的含义,则该更改也会反映到调用函数中。 例如 -

#!/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

默认参数

调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值

#!/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

匿名函数

python 使用 lambda 来创建匿名函数。

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。

  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

语法

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语句

return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法

#!/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