📜  Python 3-函数

📅  最后修改于: 2020-12-23 04:53:34             🧑  作者: Mango


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

如您所知, 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

调用函数

定义一个函数会为其命名,指定要包含在函数中的函数并构造代码块。

一旦确定了函数的基本结构,即可通过从另一个函数或直接从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 
      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