Python 3 - 功能

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

正如您所知,Python为您提供了许多内置函数,如print()等,但您也可以创建自己的功能.这些函数称为用户定义的函数.

定义函数

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

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

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

  • 函数的第一个语句可以是可选语句 - 函数的文档字符串或 docstring .

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

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

调用函数

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

一旦函数的基本结构完成,你就可以执行通过从另一个函数调用它n或直接来自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

按引用传递vs值

所有参数(参数)在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 是本地的功能变化.更改函数中的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

可变长度参数

您可能需要处理一个函数,以获得比definin时指定的参数更多的参数g功能.这些参数称为变长参数,并且在函数定义中未命名,与required和default参数不同.

具有非关键字变量的函数的语法参数在下面和下面给出;

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

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

Output is:
10
Output is:
70
60
50

匿名函数

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

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

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

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

  • 尽管lambdas似乎是函数的单行版本,但它们并不等同于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和minus中有两个基本的变量范围;

  • 全局变量

  • 局部变量

全局与局部变量

在函数体内定义的变量具有局部范围,并且已定义外部具有全局范围.

这意味着局部变量只能在声明它们的函数内部访问,而全局变量可以通过所有函数在整个程序体中访问.调用函数时,在其中声明的变量将进入范围.以下是一个简单的示例 :

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