Python 3 – 函数
函数是一块有组织、可重复使用的代码,用于执行单个、相关的操作。函数为您的应用程序提供了更好的模块化和高度重用的代码。
如您所知,Python给您提供了许多内置函数,如print()等,但您也可以创建自己的函数。这些函数称为 用户定义的函数。
定义函数
您可以定义函数以提供所需的功能。以下是在Python中定义函数的简单规则。
- 函数块以关键字 def 开始,后跟函数名称和括号 (())。
-
任何输入参数或参数都应放置在括号内。您也可以在这些括号内定义参数。
-
函数的第一条语句可以是可选语句——函数的文档字符串或 文档注释。
-
每个函数中的代码块以冒号 (:) 开始,并进行缩进。
-
声明 return [expression] 退出函数,可选择向调用者传回一个表达式。没有参数的返回语句与 return None 相同。
语法
默认情况下,参数具有位置行为,您需要按照定义它们的顺序通知它们。
示例
以下函数接受字符串作为输入参数,并将其打印在标准屏幕上。
调用函数
定义函数给它命名,指定要包含在函数中的参数,并构造代码块。
完成了函数的基本结构后,您可以通过从另一个函数或直接从Python提示符中调用它来执行它。以下是调用 printme () 函数的示例−
运行上述代码时,它将产生以下结果−
传递引用 vs 值
Python语言中的所有参数(参数)均按引用传递。这意味着如果您更改函数内部参数所引用的内容,则更改也会反映在调用函数中。例如−
在这里,我们保留了传递对象的引用,并在同一对象中添加值。因此,这将产生以下结果−
还有一个例子,其中参数通过引用传递,并且引用被重新分配在被调用的函数内部。
参数 mylist 是函数changeme本地的。在函数内更改mylist不会影响mylist。该函数没有任何效果,最终会产生以下结果−
函数参数
可以使用以下类型的正式参数调用函数−
- 请求参数
- 关键字参数
- 默认参数
- 可变长度参数
请求参数
请求参数是按正确的位置顺序传递给函数的参数。在这里,函数调用中的参数数量应与函数定义完全匹配。
要调用函数 printme() ,您肯定需要传递一个参数,否则它会产生语法错误,如下所示−
执行上述代码时,将产生以下结果−
关键字参数
关键字参数与函数调用相关。在函数调用中使用关键字参数时,调用者通过参数名称标识参数。
这允许您跳过参数或将它们放置在不同的顺序中,因为Python解释器能够使用提供的关键字将值与参数匹配。您还可以通过以下方式对 printme() 函数进行关键字调用−
执行上述代码时,将产生以下结果−
以下示例提供了更清晰的图像。请注意,参数的顺序没有关系。
执行上述代码时,将产生以下结果−
默认参数
默认参数是指在函数调用时,如果没有为该参数提供值,则假定该参数具有默认值。以下示例给出了默认参数的概念,如果未传递年龄,则打印默认的年龄:
当执行上述代码时,它会产生以下结果-:
可变长度参数
在定义该函数时,您可能需要为更多的参数处理该函数。这些参数称为变量长度参数,并且与所需和默认参数不同,在函数定义中没有命名。
具有非关键字变量参数的函数的语法如下:
在保存所有非关键字变量参数的值的变量名之前放置一个星号(*)。如果在函数调用期间未指定其他参数,则该元组保持为空。以下是一个简单的示例-:
当执行上述代码时,它会产生以下结果-:
匿名函数
这些函数被称为匿名函数,因为它们不是使用 def 关键字以标准方式声明的。您可以使用 lambda 关键字创建小型匿名函数。
- Lambda形式可以采用任意数量的参数,但只返回一个表达式形式的值。它们不能包含命令或多个表达式。
-
匿名函数不能直接调用打印,因为Lambda需要表达式。
-
lambda函数具有自己的本地命名空间,不能访问除参数列表中的变量和全局命名空间中的变量以外的变量。
-
虽然看起来lambda是C或C ++中内联语句的一行版本,但它们与在调用期间通过传递函数进行堆栈分配的目的不同,用于性能原因。
语法
lambda 函数的语法仅包含一个语句,如下所示-:
以下是一个示例,演示了 lambda 函数形式的工作原理:
当执行以上代码时,会产生以下结果 –
返回语句
return [expression]语句退出一个函数,并可向调用者返回表达式。没有参数的返回语句与return None相同。
下面的所有示例都不返回任何值。您可以按以下方式从函数中返回值 –
当执行以上代码时,会产生以下结果 –
变量的作用域
程序中的所有变量可能无法在程序的所有位置都可访问。这取决于您在哪里声明变量。
变量的作用域确定了您可以访问特定标识符的程序部分。Python中有两个基本的变量作用域 –
- 全局变量
- 局部变量
全局变量与局部变量
在函数体内定义的变量具有局部作用域,而在外面定义的变量具有全局作用域。
这意味着局部变量只能在声明它的函数内部访问,而全局变量可以被程序体内的所有函数访问。当您调用函数时,其中声明的变量被引入到作用域中。以下是一个简单的示例 –
当执行以上代码时,会产生以下结果 –