Python - 函数


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

构建处理逻辑的自上而下的方法涉及定义独立的可重用功能块。可以通过传递所需数据(称为参数参数)从任何其他函数调用 Python 函数。被调用函数将其结果返回到调用环境。

python 函数

Python 函数的类型

Python 提供以下类型的函数 -

  • 内置功能

  • 内置模块中定义的函数

  • 用户定义函数

Python 的标准库包含许多内置函数。Python 的一些内置函数包括 print()、int()、len()、sum() 等。这些函数始终可用,因为一旦启动 Python 解释器,它们就会被加载到计算机内存中。

标准库还捆绑了许多模块。每个模块定义了一组功能。这些功能并不容易获得。您需要将它们从各自的模块导入到内存中。

除了内置函数和内置模块中的函数外,您还可以创建自己的函数。这些函数称为用户定义函数

在 Python 中定义函数

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

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

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

  • 函数的第一条语句可以是可选语句;函数的文档字符串或文档字符串。

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

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

句法

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

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

定义函数后,您可以通过从另一个函数调用它或直接从 Python 提示符调用它来执行它。

例子

以下示例显示如何定义函数greetings()。括号是空的,因此没有任何参数。

第一行是文档字符串。功能块以 return 语句结束。当调用此函数时,将打印Hello world消息。

def greetings():
   "This is docstring of greetings function"
   print ("Hello World")
   return

greetings()

在 Python 中调用函数

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

一旦函数的基本结构最终确定,您就可以通过从另一个函数调用它或直接从Python提示符调用它来执行它。以下是调用 printme() 函数的示例 -

# 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的函数调用机制与C和C++不同。有两种主要的函数调用机制:按值调用按引用调用

当一个变量被传递给一个函数时,函数会对它做什么?如果对其变量的任何更改没有反映在实际参数中,则它使用按值调用机制。另一方面,如果改变被反映,那么它就变成引用调用机制。

通过参考与值传递

C/C++ 函数据说是按值调用的。当调用 C/C++ 中的函数时,实际参数的值将复制到表示形式参数的变量中。如果函数修改形式论证的值,它不会反映传递给它的变量。

Python 使用引用传递机制。由于Python中的变量是对内存中对象的标签或引用,因此用作实际参数和形式参数的变量实际上都引用内存中的同一个对象。我们可以通过在传递之前和之后检查传递变量的 id() 来验证这一事实。

def testfunction(arg):
   print ("ID inside the function:", id(arg))

var="Hello"
print ("ID before passing:", id(var))
testfunction(var)

如果执行上面的代码,则传递之前的 id() 和函数内部的 id() 是相同的。

ID before passing: 1996838294128
ID inside the function: 1996838294128

该Behave还取决于传递的对象是可变的还是不可变的。Python 数字对象是不可变的。当传递一个数字对象,然后函数更改形式参数的值时,它实际上在内存中创建一个新对象,而原始变量保持不变。

def testfunction(arg):
   print ("ID inside the function:", id(arg))
   arg=arg+1
   print ("new object after increment", arg, id(arg))

var=10
print ("ID before passing:", id(var))
testfunction(var)
print ("value after function call", var)

它将产生以下输出-

ID before passing: 140719550297160
ID inside the function: 140719550297160
new object after increment 11 140719550297192
value after function call 10

现在让我们将可变对象(例如列表或字典)传递给函数。它也是通过引用传递的,因为传递前后的lidt的id()是相同的。但是,如果我们修改函数内部的列表,其全局表示也会反映更改。

这里我们传递一个列表,追加一个新项目,然后查看原始列表对象的内容,我们会发现它已经改变了。

def testfunction(arg):
   print ("Inside function:",arg)
   print ("ID inside the function:", id(arg))
   arg=arg.append(100)
   
var=[10, 20, 30, 40]
print ("ID before passing:", id(var))
testfunction(var)
print ("list after function call", var)

它将产生以下输出-

ID before passing: 2716006372544
Inside function: [10, 20, 30, 40]
ID inside the function: 2716006372544
list after function call [10, 20, 30, 40, 100]

函数参数

函数的处理通常取决于调用它时提供给它的某些数据。定义函数时,必须给出一个变量列表,其中收集传递给函数的数据。括号中的变量称为形式参数。

调用函数时,必须提供每个形式参数的值。这些被称为实际参数。

函数参数

例子

让我们修改greetings 函数并添加name 参数。作为实际参数传递给函数的字符串将成为函数内的名称变量。

def greetings(name):
   "This is docstring of greetings function"
   print ("Hello {}".format(name))
   return
   
greetings("Samay")
greetings("Pratima")
greetings("Steven")

它将产生以下输出-

Hello Samay
Hello Pratima
Hello Steven

有返回值的函数

return关键字作为函数定义中的最后一条语句,表示功能块结束,程序流程返回到调用函数。尽管块中最后一个语句后减少缩进也意味着返回,但使用显式返回是一个很好的做法。

除了流程控制之外,该函数还可以将表达式的值返回给调用函数。返回表达式的值可以存储在变量中以供进一步处理。

例子

让我们定义 add() 函数。它将传递给它的两个值相加并返回相加结果。返回的值存储在名为 result 的变量中。

def add(x,y):
   z=x+y
   return z

a=10
b=20
result = add(a,b)
print ("a = {} b = {} a+b = {}".format(a, b, result))

它将产生以下输出 -

a = 10 b = 20 a+b = 30

函数参数的类型

根据定义 Python 函数时参数的声明方式,它们分为以下几类 -

  • 位置参数或必需参数

  • 关键字参数

  • 默认参数

  • 仅位置参数

  • 仅关键字参数

  • 任意或可变长度参数

在接下来的几章中,我们将详细讨论这些函数参数。

参数顺序

函数可以具有上面定义的任何类型的参数。但是,参数必须按以下顺序声明 -

  • 参数列表以仅位置参数开头,后跟斜杠 (/) 符号。

  • 它后面是常规位置参数,可能会也可能不会被称为关键字参数。

  • 那么可能会有一个或多个具有默认值的args。

  • 接下来,任意位置参数由带有单个星号前缀的变量表示,该变量被视为元组。这是下一个。

  • 如果函数有任何仅关键字参数,请在其名称开始前添加一个星号。某些仅关键字参数可能具有默认值。

  • 括号中的最后一个参数带有两个星号**,用于接受任意数量的关键字参数。

下图显示了形式参数的顺序 -

正式参数的顺序