Python 函数
函数是一个有组织的、可重用的代码块,用于执行单个相关操作。函数为你的应用程序提供更好的模块化和高度的代码重用。
如你所知,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/python # 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("I'm first call to user defined function!") printme("Again second call to the same function")
执行上述代码时,会产生如下结果:
I'm first call to user defined function! Again second call to the same function
通过引用与值传递
Python 语言中的所有参数(参数)都是通过引用传递的。这意味着如果你更改函数中参数所指的内容,则更改也会反映在调用函数中。例如:
#!/usr/bin/python # Function definition is here def changeme( mylist ): "This changes a passed list into this function" mylist.append([1,2,3,4]); 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
在这里,我们维护传递对象的引用并在同一个对象中附加值。因此,这将产生以下结果:
Values inside the function: [10, 20, 30, [1, 2, 3, 4]] Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
还有一个例子,参数是通过引用传递的,而引用在被调用函数内部被覆盖。
#!/usr/bin/python # Function definition is here def changeme( mylist ): "This changes a passed list into this function" mylist = [1,2,3,4]; # This would assig 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]
函数参数
你可以使用以下类型的形式参数调用函数:
- 必需的参数
- 关键字参数
- 默认参数
- 可变长度参数
必需的参数
必需参数是以正确的位置顺序传递给函数的参数。在这里,函数调用中的参数数量应该与函数定义完全匹配。
调用函数 打印我() ,你肯定需要传递一个参数,否则会报如下语法错误:
#!/usr/bin/python # 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 解释器能够使用提供的关键字将值与参数匹配。你还可以通过关键字调用 打印我() 通过以下方式发挥作用:
#!/usr/bin/python # 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/python # 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/python # 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/python # Function definition is here def printinfo( arg1, *vartuple ): "This prints a variable passed arguments" print "输出 is: " print arg1 for var in vartuple: print var return; # Now you can call printinfo function printinfo( 10 ) printinfo( 70, 60, 50 )
执行上述代码时,会产生如下结果:
输出 is: 10 输出 is: 70 60 50
The 匿名的 功能
这些函数之所以称为匿名函数,是因为它们不是使用标准方式声明的 def 关键词。你可以使用 lambda 关键字来创建小的匿名函数。
-
Lambda 形式可以采用任意数量的参数,但仅以表达式的形式返回一个值。它们不能包含命令或多个表达式。
-
匿名函数不能直接调用 print,因为 lambda 需要表达式
-
Lambda 函数有自己的本地命名空间,不能访问除参数列表和全局命名空间中的变量之外的变量。
-
尽管 lambda 看起来是函数的单行版本,但它们并不等同于 C 或 C++ 中的内联语句,其目的是出于性能原因在调用期间传递函数堆栈分配。
语法
的语法 lambda 函数只包含一条语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
下面是一个例子来说明如何 lambda 功能作品形式:
#!/usr/bin/python # 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
The return 陈述
语句 return [expression] 退出一个函数,可选择将一个表达式传回给调用者。没有参数的 return 语句与 return None 相同。
以上所有示例均未返回任何值。你可以从函数中返回一个值,如下所示:
#!/usr/bin/python # 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/python 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