当前位置: 首页 > 文档资料 > Python 中文教程 >

Functions

优质
小牛编辑
121浏览
2023-12-01

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

如您所知,Python为您提供了许多内置函数,如print()等,但您也可以创建自己的函数。 这些函数称为user-defined functions.

定义一个函数 (Defining a Function)

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

  • 功能块以关键字def开头,后跟函数名称和括号(())。

  • 任何输入参数或参数都应放在这些括号内。 您还可以在这些括号内定义参数。

  • 函数的第一个语句可以是可选语句 - 函数或docstring

  • 每个函数中的代码块以冒号(:)开头并缩进。

  • 语句return [expression]退出函数,可选地将表达式传递给调用者。 不带参数的return语句与return None相同。

语法 (Syntax)

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

默认情况下,参数具有位置行为,您需要按照定义的顺序通知它们。

例子 (Example)

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

def printme( str ):
   "This prints a passed string into this function"
   print str
   return

调用一个函数 (Calling a Function)

定义函数只会给它一个名称,指定要包含在函数中的参数并构造代码块。

一旦函数的基本结构最终确定,您可以通过从另一个函数调用它或直接从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

通过引用vs值传递

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]

函数参数(Function Arguments)

您可以使用以下类型的正式参数来调用函数 -

  • 必需的参数
  • 关键字参数
  • 默认参数
  • 可变长度参数

必需的参数

必需参数是以正确的位置顺序传递给函数的参数。 这里,函数调用中的参数个数应与函数定义完全匹配。

要调用函数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()

执行上述代码时,会产生以下结果 -

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

Variable-length arguments

在定义函数时,您可能需要处理比您指定的参数更多的参数。 这些参数称为variable-length参数,并且在函数定义中未命名,与required和default参数不同。

具有非关键字变量参数的函数的语法是这样的 -

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 "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

Anonymous函数

这些函数称为匿名函数,因为它们不是使用def关键字以标准方式声明的。 您可以使用lambda关键字来创建小型匿名函数。

  • Lambda表单可以使用任意数量的参数,但只能以表达式的形式返回一个值。 它们不能包含命令或多个表达式。

  • 匿名函数不能直接调用print,因为lambda需要表达式

  • Lambda函数具有自己的本地名称空间,并且不能访问参数列表中的变量以及全局名称空间中的变量。

  • 虽然看起来lambda是函数的单行版本,但它们并不等同于C或C ++中的内联语句,其目的是在调用期间为了性能原因传递函数堆栈分配。

语法 (Syntax)

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

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