Python 函数用法与底层分析

      在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递参数、返回计算结果等内容。

     函数简介函数(function)的基本概念

1:一个程序由一个一个的任务组成;函数就是代表一个任务或者一个功能(function)。

2:函数是代码复用的通用机制

   Python函数的分类

Python函数分为如下几类:

1 内置函数我们前面使用的str()、list()、len()等这些都是内置函数,我们可以拿来直接使用。

2 标准库函数我们可以通过import语句导入库,然后使用其中定义的函数

3 第三方库函数Python社区也提供了很多高质量的库。下载安装这些库后,也是通过import语句导入,然后可以使用这些第三方库的函数

4 用户自定义函数用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。今天我们学习的就是如何自定义函数。

  函数的定义和调用

简单定义一个函数:

def add(a,b,c):'''完成三个数的加法,并返回他们的和'''sum = a+b+cprint("{0}、{1}、{2}三个数的和是:{3}".format(a,b,c,sum))
return sumadd(10,20,30)
add(30,40,50)

要点:1:我们使用def来定义函数,然后就是一个空格和函数名称;Python执行def时,会创建一个函数对象,并绑定到函数名变量上。

2:参数列表圆括号内是形式参数列表,有多个参数则使用逗号隔开定义时的形式参数不需要声明类型,也不需要指定函数返回值类型调用时的实际参数必须与形参列表一一对应。

3:return返回值如果函数体中包含return语句,则结束函数执行并返回值;如果函数体中不包含return语句,则返回None值。

4:调用函数之前,必须要先定义函数,即先调用def创建函数对象内置函数对象会自动创建标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句。

形参和实参:

def  printMax(a,b):'''实现两个数的比较,并返回较大的值'''if a>b:print(a,'较大值')return aelse:print(b,'较大值')return bprintMax(10,20)
printMax(30,5)

上面的printMax函数中,在定义时写的printMax(a,b)。a和b称为“形式参数”,简称“形参”。也就是说,形式参数是在定义函数时使用的。形式参数的命名要符合“标识符”命名规则。在调用函数时,传递的参数称为“实际参数”,简称“实参”。上面代码中,printMax(10,20),10和20就是实际参数。

函数也是对象,内存底层分析

Python中,“一切都是对象”。实际上,执行def定义函数后,系统就创建了相应的函数对象。我们执行如下程序,然后进行解释:

def print_star(n):                print("*"*n)print(print_star)print(id(print_star))c = print_starc(3)

a = 100        #全局变量def f1():global a    #如果要在函数内改变全局变量的值,增加global关键字声明print(a)    #打印全局变量a的值a = 300      f1()
f1()
print(a)

参数的传递

   传递可变对象的引用传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。

【操作】参数传递:传递可变对象的引用:

b = [10,20]
def f2(m):print("m:",id(m))       #b和m是同一个对象m.append(30)            #由于m是可变对象,不创建对象拷贝,直接修改这个对象
f2(b)
print("b:",id(b))
print(b)

为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。

1:浅拷贝:拷贝对象,但不拷贝子对象的内容,只是拷贝子对象的引用。

2:深拷贝:拷贝对象,并且会连子对象的内存也全部(递归)拷贝一份,对子对象的修改不会影响源对象

#测试浅拷贝和深拷贝
import copy
def testCopy():'''测试浅拷贝'''a = [10, 20, [5, 6]]b = copy.copy(a)print("a", a)print("b", b)b.append(30)b[2]
.append(7)print("浅拷贝......")print("a", a)print("b", b)b.append(30)b[2].append(7)print("深拷贝......")print("a", a)print("b", b)
testCopy()
print("*************")
testDeepCopy()

f = lambda a,b,c:a+b+c
print(f)
print(f(2,3,4))
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

VBA技术资料MF201:添加简单的右键菜单

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

守望稻田|碧桂园服务助力绿色大米推广,丰富万千家庭餐桌

在有着“中国优质稻米之乡”美誉的五常市,蓝天如洗,微风轻拂,金黄的稻浪在无垠的田野上起伏,丰收的气息随着稻香在这片肥沃的黑土地上弥漫开来。作为中国好粮油行动示范市,国家有机绿色稻香米核心产区,五常…

数据结构与算法 #时间复杂度 #空间复杂度

文章目录 前言 一、算法的复杂度 二、时间复杂度 三、空间复杂度 四、例题 1、例1:冒泡排序 2、例2: 3、例3: 4、例4: 二分查找 5、例5: 阶乘 6、例6: 斐波那契 五、常见算法复杂度 总结 前言 路漫漫其修远兮,吾将上下而求索&…

5个适合教师的AI工具,智能辅助,提升效率,让老师们工作更轻松!

随着人工智能技术的蓬勃发展,我们正步入一个由AI引领的变革时代,它不仅重塑了多个行业的面貌,更激发了我们对未来无限可能的想象。面对这一趋势,我们不应仅仅聚焦于其带来的挑战与冲击,而应积极拥抱变化,探…

猫咪掉毛背后的隐秘原因?除毛除臭宠物空气净化器双管齐下!

作为一个二胎家庭,两只猫咪,除了卖萌加倍之外,拉屎需要排队之外,家里最不缺就是毛了。作为一个名鼻炎患者真的很难顶。感受一下40度高温的养猫人,给掉毛怪疏毛浮毛飘飘,逃不过的饮水机,各个角落…

Deep Guided Learning for Fast Multi-ExposureImage Fusion

Abstract 我们提出了一种快速多重曝光图像融合(MEF)方法,即 MEF-Net,用于任意空间分辨率和曝光次数的静态图像序列。 我们首先将输入序列的低分辨率版本提供给全卷积网络以进行权重图预测。 然后,我们使用引导滤波器联…

HTML5 Video标签的属性、方法和事件汇总,以及常用视频插件推荐

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

【Unity3d Shader】毛玻璃效果

毛玻璃也叫​磨砂玻璃​:是用物理或化学方法处理过的一种表面粗糙不平整的半透明玻璃。 毛玻璃成像原理:毛玻璃表面不平整,光线通过毛玻璃被反射后向四面八方射出去(因为毛玻璃表面不是光滑的平面,使光产生了漫反射),折射到视网膜上已经是不完整的像,于是就看不清楚(…

关于 mybatis-plus-boot-starter 与 mybatis-spring-boot-starter 的错误

不是知道你是否 出现过这样的错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 经过各种度娘,无非就是让你检查三种情况 情况一:mapper.xml没有按照传统的maven架构进行放置 情况二:mybatis的配置信…

智能PPT行业赋能用户画像

智能PPT市场在巨大的需求前景下,已吸引一批不同类型的玩家投入参与竞争。从参与玩家类型来看,不乏各类与PPT创作有关的上下游企业逐步向智能PPT赛道转型进入,也包括顺应生成式AI技术热潮所推出的创业企业玩家。当前,智能PPT赛道发…

【网络协议栈】传输层的意义 和 UDP协议结构的解析(内含逻辑图解通俗易懂)

绪论​ “六年之约—jack”。本章是网络协议栈第二个主要模块 传输层,传输层在网络层中是非常重要的,他主要通过储存双方的端口记录数据的来源以及数据最终的去处,并且能一定的保证数据传输到达,以及快速高效的传递。本章主要讲到…

(附源码)基于django的电力工程作业现场物资管理系统的设计与实现-计算机毕设 22067

基于django的电力工程作业现场物资管理系统的设计与实现 摘 要 随着电力工程的快速发展,作业现场物资管理成为保障工程进度和质量的关键环节。本文旨在设计并实现一个基于Django框架的电力工程作业现场物资管理系统,以提高物资管理的效率和准确性。该系统…

约克VRF中央空调的优点不止一点点!

约克VRF中央空调的优点不止一点点!      整体造型简约大方,隐入吊顶里刚刚好,高级又很有氛围感。      用约克小方App就能自由操控,忘记关空调再也不用跑回来关啦,使用起来hin方便,懒人大喜&#x…

MySQL如何实现并发控制?(上)

前言 最开始学习数据库的时候都会被问到一个问题:“数据库系统相比与文件系统最大的优势是什么?”。具体的优势有很多,其中一个很重要的部分是:数据库系统能够进行更好的并发访问控制。 那么,数据库系统到底是怎么进…

通过 Flink 的火焰图定位反压

在 Apache Flink 中,Web UI 提供了丰富的监控工具来帮助用户分析和解决作业性能问题,其中火焰图(Flame Graph)是用于分析反压问题的一个强有力的工具。反压可能是由于作业中某些算子处理速度过慢,或者资源耗尽导致的。…

【解密 Kotlin 扩展函数】扩展函数的底层原理(十八)

导读大纲 1.1.1 从 Java 调用扩展函数1.1.2 扩展函数无法重载 1.1.1 从 Java 调用扩展函数 在编译器底层下,扩展函数是一种静态方法,它接受接收器对象作为第一个参数 调用它不涉及创建适配器对象或任何其他运行时开销这使得从 Java 使用扩展函数变得非常简单 调用静态方法并传…

使用k8s部署RainLoop-Webmail

说明 * rainloop最新源码官方下载地址:https://www.rainloop.net/downloads/ * 系统要求:https://www.rainloop.net/docs/system-requirements/ * 安装文档:https://www.rainloop.net/docs/installation/ * 更多详细资料请查看官方文档 * do…

HDL coder使用手册

💡 由于本科毕设女朋友准备使用FPGA完成,因此写这篇文章帮助她快速上手HDL coder的使用,降低前期入门的难度。 支持生成HDL代码的simulink库 名字中含有HDL的库中的模块一般都可以用来生成HDL代码。直接搜索模块名称,比如搜索fir&…

管道检测与识别系统源码分享

管道检测与识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

C++进阶学习——模版进阶

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成…