python学习第六天笔记

本文详细介绍了Python中的函数概念,强调函数作为对象的特性。讨论了全局变量和局部变量的差异,建议优先使用局部变量以提高效率。接着,解释了Python参数传递的"引用传递"原理,区分了可变对象和不可变对象的赋值行为。此外,还探讨了浅拷贝和深拷贝的区别,以及参数的四种类型:位置参数、默认值参数、命名参数和可变参数。最后,提到了lambda表达式和匿名函数,以及eval()函数的使用,并简单介绍了递归函数的概念和构成要素。
摘要由CSDN通过智能技术生成

一.函数也是对象
在python中,一切皆对象。时间上,执行def定义函数后,系统创建了相应的函数对象。
在这里插入图片描述
上面代码执行def时,系统会创建函数对象,并通过ceshi这个变量进行引用。

二.变量的作用于(全局变量和局部变量)
变量起作用的范围成为变量的作用域,不同作用域内同名变量之间互不影响。变量分为全局变量和局部变量。
全局变量
(1)在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束。
(2)全局变量降低了函数的通用性和可读性。应尽量避免使用。
(3)全局变量一般做常量使用。
(4)函数内要改变全局变量的值,使用global声明一下。
局部变量
(1)在函数体中(含形式参数)声明的变量。
(2)局部变量的引用比全局变量快,优先考虑使用。
(3)如果局部变量和全局变量名称相同,则在函数内隐藏全局变量,只使用同名的局部变量。
在这里插入图片描述
局部变量与全局变量效率测试:
局部变量的查询与访问速度比全局变量快,优先考虑使用,尤其是循环的时候。
在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量转为局部变量提高运算速度。
在这里插入图片描述
上行代码执行的是相同的结果,但是ce01在循环时,使用的是全局变量,ce02在循环时,适应的是局部变量。很明显,当有很多次循环时,局部变量的运行速度优于全局变量。

三.参数的传递: 函数的参数传递本质上就是从实参到形参的赋值操作。python中,一切皆对象,所有的赋值操作都是“引用的赋值”。所以,python中,参数的传递都是“引用传递”,不是值“传递”。具体分两类:
1.对“可变对象”进行写操作,直接作用于原对象本身。
2.对“不可变队形”进行写操作,会产生一个新的“对象空间”,并用新的值填充这块空间。

可变对象有:字典、列表、集合、自定义的对象等
不可变对象有:数字、字符串、元组、fuction等

传递可变对象的引用: 传递参数是可变对象,实际上传递的还是对象的引用。在函数体中不创建新的对象的拷贝,而是可以直接修改所传递的对象。在这里插入图片描述
上面的代码结果显示,对原列表进行写操作后,新列表并不是新创建的对象,而是直接修改所传递的对象。

传递不可变对象的引用: 传递参数是不可变对象,实际传递的还是对象的引用。在“赋值操作”时,由于不可变对象无法修改,系统会创建一个新对象。在这里插入图片描述
显然,通过id值我们可以看到m和a一开始是同一个对象,给m赋值以后, m是新对象。

四.浅拷贝与深拷贝:
浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用。
深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响原对象。
在这里插入图片描述
该代码执行的是浅拷贝与深拷贝的区别,下图为运行结果。
在这里插入图片描述
从结果中,我们可以看出,当进行浅拷贝时,栈a所对应的堆,分别引用10,20,和一个列表对象地址,当b浅拷贝a时,只是将10,20,列表对象的地址所拷贝,当往第三个元素中进行写操作时,只能够根据所拷贝的地址,去寻找该列表进行写操作,而这个列表同时被a所引用,所以,当写操作完成时,a也发生了变化。而深拷贝是将a的子对象也进行拷贝,相当于独立成一个“个体”,这是,进行写操作对a就在无影响了!

五.参数的几种类型
(1)位置参数:函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按位置传递的参数,我们称为:“位置参数”。
(2)默认值参数:我们可以为某些参数数默认值,这样这些参数在传递时就是可选择的。称为“默认参数”,默认参数放到位置参数后面

def f1(a,b,c=10,d=20)
print(a,b,c,d)
f1(8,9)
8,9,10,20
f1(8,9,19)
8,9,19,20
f1(8,9,19,29)
8,9,19,29

(3)命名参数:我们也可以按照形参的名称传递参数,称为“命名参数”,也称为“关键字参数”

def f1(a,b,c)
print(a,b,c)
f1(c=10,a=20,b=30)
20,30,10

(4)可变参数:可变参数指的是“可变数量的参数”。分两种情况:
1.*param(一个星号),将多个参数收集到一个“元组”对象中。
2.**param(两个星号),将多个参数收集到一个“字典”对象中。
在这里插入图片描述
六.lambda表达式和匿名函数
lambda表达式可以用来声明匿名函数。lambda函数是一种简单的、在同一行中定义函数的方法。实际上生成了一个函数对象。
lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数的返回值。表达式的基本语法如下:
lambda arg1,arg2,arg3…:<表达式>
arg1/arg2/arg3为函数的参数。<表达式>相当于函数体,运算结果是表达式的运算结果。
在这里插入图片描述
七.eval()函数
功能:将字符串str当成有效的表达式来求值并返回计算结果。
语法:eval(source[,globals[,locals]])->value
参数:
source:一个python表达式或者函数compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意映射对象。

八.递归函数: 自己自己调用自己的函数,在函数体内部直接或者间接的自己调用自己。每个递归函数必须包含两部分:
1.终止条件:便是递归什么时候结束,一般用于返回值,不在调用自己。
2.递归步骤:把第n不的值和第n-1步相关联。
在这里插入图片描述
上述代码利用递归函数,实现了5的阶乘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值