04. 函数

目录

1、前言

2、Python中的函数

2.1、内置函数

2.2、自定义函数

2.3、函数调用

3、函数的参数

3.1、形参和实参

3.2、位置参数(Positional Arguments)

3.3、默认参数(Default Arguments):

3.4、关键字参数(Keyword Arguments):

3.5、可变位置参数(Arbitrary Argument Lists):

3.6、可变关键字参数(Arbitrary Keyword Argument Lists):

4、函数高级特性

4.1、匿名函数(Lambda)

4.2、闭包(Closure)

4.3、装饰器(Decorator)

4.4、递归函数

5、小结


1、前言

在Python编程中,函数是一项强大而灵活的工具,它不仅能够使代码更有组织性,还能提高代码的重用性。函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。前面我们已经有接触过一些Python提供的内建函数了,比如print()。我们也可以自己创建函数,这被叫做用户自定义函数。

2、Python中的函数

Python中函数大体上可以分为两类:内置函数、自定义函数。

2.1、内置函数

Python内置了很多函数,我们可以直接调用。如常见的len(),list(),print()等。Python已内置的函数可以通过如下日志查看:https://docs.python.org/3/library/functions.html

2.2、自定义函数

Python中如果想定义一个自己的函数,遵循以下简单的规则:

  • 函数代码块以 def ()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 

如自定义一个加法运算的函数:

# def为定义函数的关键字
# my_add为该函数的名称,提供给被调用方调用
# a, b为该函数体的参数,也就是形参。调用方可以传入指定类型参数进行传递运算
# a + b为函数体,指该函数具体执行的动作
# return为该函数的返回结果
def my_add(a, b):return a + b

所以上述定义的函数具体表现为:定义了一个名为my_add的加法运算函数,接收a和b两个参数,返回a和b的加法运算结果。

2.3、函数调用

要调用一个函数,只需要知道该函数名称和该函数接收的参数类型即可。如调用上述的my_add方法:

调用函数时,如果传入的参数数量不对,会提示TypeError,如:

if __name__ == '__main__':print(my_add(3, 4, 5))

这里很明确的指出my_add()方法接收2个参数,但是却给了3个。

如果传输的数量是对的,但是类型无法被接受,也会包TypeError错误,如:

if __name__ == '__main__':print(my_add(3, '12'))

因为函数体具体实现用的是+加法运算,程序默认a和b均为int类型。这里传入了'abc'明显是字符串,因此程序出错。要正确使用也很简单,只要做个类型转换即可:

if __name__ == '__main__':# 这里将'12'字符串类型通过int()转换为int型print(my_add(3, int('12')))

3、函数的参数

定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。

在Python中,函数的参数是在函数定义中列出的变量,用于接收传递给函数的值。函数参数分为几种不同类型:位置参数,默认参数,关键字参数,可变位置参数,可变关键字参数。

3.1、形参和实参

在编程中,函数参数通常分为两种:形式参数(形参)和实际参数(实参)。

形式参数(形参): 在函数定义中声明的参数称为形式参数。形参是函数定义的一部分,它们是函数内部的变量名,用于接收调用函数时传递的实参的值。形参在函数定义中充当占位符,告诉函数应该接受什么样的输入。

def example_function(parameter1, parameter2):# 函数体pass

其中,parameter1和parameter2就是形式参数。

实际参数(实参): 在函数调用时提供的具体数值或对象称为实际参数。实参是传递给函数的真实数据,它们与函数定义中的形参一一对应,按照顺序传递或使用关键字参数进行指定。

example_function(value1, value2)

其中,value1和value2就是实际参数。它们被传递给函数 example_function,并分别赋值给函数定义中的 parameter1 和 parameter2。

3.2、位置参数(Positional Arguments)

Python中这是最常见的参数类型,按照位置顺序传递给函数。函数定义时,参数的顺序和数量必须与函数调用时传递的顺序和数量一致。

def example_function(arg1, arg2, arg3):# 函数体pass# 调用函数
example_function(value1, value2, value3)

3.3、默认参数(Default Arguments)

在函数定义时,可以为某些参数指定默认值,这样在调用函数时如果不提供相应参数的值,将使用默认值。

def example_function(arg1, arg2, arg3="default_value"):# 函数体pass# 调用函数
example_function(value1, value2)

3.4、关键字参数(Keyword Arguments)

在函数调用时,可以通过参数名直接指定传递的值,而不依赖于参数的位置。

def example_function(arg1, arg2, arg3):# 函数体pass# 调用函数,使用关键字参数
example_function(arg1=value1, arg3=value3, arg2=value2)

3.5、可变位置参数(Arbitrary Argument Lists)

使用星号*可以让函数接受可变数量的位置参数,这些参数将被封装为一个元组。

def example_function(*args):# args是一个包含所有位置参数的元组pass# 调用函数
example_function(value1, value2, value3)

3.6、可变关键字参数(Arbitrary Keyword Argument Lists)

使用双星号**可以让函数接受可变数量的关键字参数,这些参数将被封装为一个字典。

def example_function(**kwargs):# kwargs是一个包含所有关键字参数的字典pass# 调用函数
example_function(arg1=value1, arg2=value2, arg3=value3)

函数的参数在调用时需要与函数定义中的参数顺序和类型相匹配,但通过使用默认参数、关键字参数、可变位置参数和可变关键字参数等特性,可以增加函数的灵活性,使其更加适应各种使用场景。

4、函数高级特性

4.1、匿名函数(Lambda)

Lambda函数是一种简洁的函数定义方式,适用于一些简单的操作。下面是一个Lambda函数的示例:

square = lambda x: x ** 2# 调用Lambda函数
result = square(5)
print(result)  # 输出结果:25

Lambda函数通常用于需要一个简单函数作为参数的情况,比如在map和filter等函数中。

4.2、闭包(Closure)

闭包是指在一个函数内部定义另一个函数,并且内部函数可以访问外部函数的局部变量。以下是一个闭包的例子:

def outer_function(x):def inner_function(y):return x + yreturn inner_functionclosure = outer_function(10)
result = closure(5)
print(result)  # 输出结果:15

在这个例子中,outer_function返回了一个内部函数inner_function,并且inner_function可以访问外部函数的变量x,形成了一个闭包。

4.3、装饰器(Decorator)

装饰器是一种用于修改函数行为的高级特性,常用于在不改变原函数代码的情况下添加额外功能。以下是一个简单的装饰器示例:

def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decorator
def say_hello():print("Hello!")# 调用被装饰后的函数
say_hello()

在上述例子中,my_decorator是一个装饰器函数,通过@my_decorator语法应用到say_hello函数上。调用say_hello时,实际上是调用了被装饰后的函数,从而在执行前后添加了额外的功能。

通过深入了解和灵活运用这些函数的基础概念和高级特性,可以更好地编写清晰、模块化和可维护的Python代码。希望本文的示例代码能够帮助读者更好地理解Python函数的使用和应用。

4.4、递归函数

在函数中,我们除了调用别人定义的函数外,也可以调用自身,这就是函数递归。举个例子:

def factorial(n):"""计算阶乘的递归函数"""if n == 0 or n == 1:return 1else:return n * factorial(n - 1)# 调用递归函数
result = factorial(5)
print(result)  # 输出结果:120

上述代码中,factorial 函数用于计算阶乘。递归调用发生在 n * factorial(n - 1) 这一行,函数自身被调用并传递了一个较小的参数 n - 1。递归的结束条件是 n == 0 or n == 1,当 n 等于 0 或 1 时,递归停止,直接返回 1。

递归函数通常包括两个部分:

  1. 基本情况(Base Case):定义递归终止的条件。在上面的例子中,基本情况是 n == 0 or n == 1。
  2. 递归情况(Recursive Case):定义函数如何调用自身,并缩小问题规模。在上述例子中,递归情况是 n * factorial(n - 1)。

需要注意的是,递归函数的性能可能不如迭代(循环)实现,因为递归会涉及到多个函数调用,导致函数栈的不断增长。在某些情况下,可以通过尾递归优化或使用迭代方式来提高性能。

当使用递归时,确保设置好递归结束的条件,以避免无限递归。适当的使用递归可以使代码更加清晰、简洁,但在解决一些问题时,迭代可能是更好的选择。

5、小结

Python中函数的重要性无法被低估,它是代码模块化、重用和可维护性的关键。函数是Python编程中不可或缺的一部分,它们为代码提供了结构、可读性和可维护性,是构建复杂程序的基石。函数的设计和使用是成为Python程序员的重要技能之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208772.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot实现热部署

Spring Boot提供了一个名为spring-boot-devtools的开发工具,它可以实现热部署功能。通过使用spring-boot-devtools,可以在修改了resources目录下的内容后,自动重新加载应用程序,而无需手动重启。 以下是使用spring-boot-devtools…

增强现实技术革新零售业:提升购物体验的未来技术

增强现实(AR)技术正在改变零售业的面貌,为消费者提供了全新的购物体验。本文将探讨AR技术在零售行业中的应用,以及它如何改变传统的购物方式。 首先,AR技术允许消费者在现实世界中查看虚拟的产品展示。在服装和家具行业…

Zookeeper 安装与部署

Zookeeper官网 目录 1 配置文件参数解读2 Zookeeper 单点安装3 Zookeeper 分布式安装 1 配置文件参数解读 Zookeeper 中的配置文件 zoo.cfg 中参数含义解读如下: (1)tickTime 2000:通信心跳数,Zookeeper 服务器与客户…

DS二分查找_搜索二维矩阵

Description 使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性: 1. 每行中的整数从左到右升序排列; 2. 每行的第一个整数大于前一行的最后一个整数。 Input 第一行输入m和n,分别表示矩阵的行数和列数&#…

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时,我们说完Vue响应式原理,或者Vue2和Vue3的区别时,通常会引出Vue3使用了Proxy来优化响应式,而面试官会继续深挖:说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

Feign代替RestTemplate发起http请求

RestTemplate代码: // public Order queryOrderById(Long orderId) {// // 1.查询订单// Order order orderMapper.findById(orderId);// //String url "http://localhost:8081/user/" order.getUserId();// String url "htt…

python初始化矩阵相关

做算法题经常需要初始化一个二维的dp数组 下面两种方法是最常用的 matrix [[0]*n]*n matrix [[0]*n for _ in range(n)]以前经常混用也没发现什么问题,直到昨天debug的时候发现第一种初始化之后对矩阵进行赋值时混乱的,比如matrix[0][1]2会导致所有行…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务,启动效率低下。如何将启动Appium服务也实现自动化呢? 这里需要使用subprocess模块,该模块可以创建新的进程,并且连接到进程的输入、输出、错误等管道信息&…

宝塔+docker+jenkins部署vue项目----笔记版

宝塔dockerjenkins部署vue项目(保姆级教程)https://blog.csdn.net/weixin_47284756/article/details/129339940 基于上述教程,不同的地方。 1.我使用的是gitee,所以需要在jenkins中安装gitee插件 配置gitee,其他默认配…

二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树

二叉树的实现 定义结构体 我们首先定义一个结构来存放二叉树的节点 结构体里分别存放左子节点和右子节点以及节点存放的数据 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;…

计算机网络扫盲(1)——因特网

一、概述 因特网是一个世界范围的计算机网络,即它是一个互联了遍及全世界数十亿计算设备的网络。大家对此应该并不陌生,我们身边有着不计其数的计算机设备被接入了因特网,如今计算机网络这个术语似乎已经有点过时了,用因特网的术语…

【【水 MicroBlaze 最后的介绍和使用】】

水 MicroBlaze 最后的介绍和使用 我对MicroBlaze 已经有了一个普遍的理解 了 现在我将看的两个 一个是 AXI4接口的 DDR读写实验 还有一个是 AXI DMA 环路实验 虽然是 水文 但是 也许能从中 得到一些收获 第一个是 AXI DDR 读写实验 Xilinx 从 Spartan-6 和 Virtex-6 系列开始…

SSM SpringBoot vue社团事务管理系统

SSM SpringBoot vue社团事务管理系统 系统功能 登录 个人中心 人员信息管理 考勤信息管理 空闲时间管理 现金日记账管理 经费预算管理 物品租借管理 会议信息管理 活动信息管理 项目任务管理 公告通知管理 物资信息管理 开发环境和技术 开发语言:Java 使用框架:…

V8引擎类型转换(VIP课程)

这一章是源于一道面试题 完成以下条件并且输出console if(a 1 && a 2 && a 3) {console.log(true) }好家伙 乍一看一个变量怎么可能等于三个值?带着疑问我们去深入了解 类型系统 在JavaScript中类型系统不同于别的语言,例如JavaSc…

深度学习 -- 卷积神经网络

1、卷积神经网络的结构 大卫休伯尔( David Hunter Hubel ) 等人研究发现,猫的视皮层上 存在简单细胞( simple cell )和复杂细胞( complex cell ),简单细胞会对 感受野中特定朝向的线段做出反应,而复杂细胞对于特定朝向的钱段移动也能做出反应…

使用Docker Compose搭建CIG监控平台

CIG简介 CIG监控平台是基于CAdvisor、InfluxDB和Granfana构建的一个容器重量级监控系统,用于监控容器的各项性能指标。其中,CAdvisor是一个容器资源监控工具,用于监控容器的内存、CPU、网络IO和磁盘IO等。InfluxDB是一个开源的分布式时序、时…

机器学习-回归问题(Regression)

前言 与KNN分类任务预测的输出为离散型不同. 在机器学习中,回归任务是用于预测连续数值型变量的任务。回归任务在很多领域都有着广泛的应用. 回归问题求解 在一个回归问题中,很显然模型选择和好坏会直接关系到将来预测结果的接近程度,举个…

【高效开发工具系列】jackson入门使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

使用VC++设计程序实现K近邻中值滤波器(KNNMF)、最小均方差滤波器、矢量中值滤波算法进行滤波

VC实现若干种图像滤波技术2 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章: 01- 一元熵值、二维熵值 02- 图像平移变换,图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 …

瑞云科技参与《数字孪生世界白皮书》编写,实时云渲染助力数字孪生

为了促进数字孪生技术的发展和应用,易知微与数字孪生世界企业联盟联合众多行业专家以及多家业内企业共同编写了《数字孪生世界白皮书(2023)》。该白皮书从数字孪生的综述、应用架构、核心技术、新型技术成果和重点行业应用等方面,…