加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python基础4之递归、lambda、深浅copy

发布时间:2020-12-16 23:55:37 所属栏目:Python 来源:网络整理
导读:内容概要: 一、递归 二、匿名函数 三、关于python中的深浅拷贝与赋值 table style="height: 30px; width: 1132px; background-color: #afeeee; ; width: 1132px;" border="0" tr tdspan style="font-size: 16px;" 一、递归 /td /tr /table 递归就是函数本身
<tr>
<td><span style="font-size: 16px;">一、递归</td>
</tr></table>

递归就是函数本身调用自己,直到满足指定条件之后一层层退出函数

递归特性:

  • 必须有一个明确的结束条件
  • 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
  • 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

示列1:求10!的值。

n<=2: (n * sumn(n-1)) (sumn(10 3628800 a=1 i range(1,11 a=a* 3628800

示列二:使用递归的方式来生成斐波那契数列(斐波那契数列就是前面给两个数相加得到后面一个数,依次往后)

n3=n1+ n1>500: (.format(n1)) feola(n2,n3) feola(0,1 1 1 2 3 5 8 13 21 34 55 89 144 233 377

内容概要:

一、递归

二、匿名函数

三、关于python中的深浅拷贝与赋值

<table style="height: 30px; width: 1132px; background-color: #afeeee; ; width: 1132px;" border="0">

二、匿名函数lambda?匿名函数,顾名思义就是不需要显示的定义函数名的函数,但是在语法上受限于一个表达式。

语法:

函数名= 参数:代码

示列:

f= x,y:x+y (f(3,2)) 5 x+ (my_add(3,2)) 5

<table style="height: 30px; width: 1132px; background-color: #afeeee; ; width: 1132px;" border="0">

<tr>
<td><span style="font-size: 16px;">三、关于python中的深浅拷贝与赋值</td>
</tr></table>

说明:

1.赋值:将一个变量的值赋给另一个变量(例如,name1=“WD” name2=name1,将name1的值赋给name2)

2.浅拷贝:copy模块中的copy方法

如:

a=1 b= 1 1

3.深度拷贝:copy模块中的deepcopy方法

如:

a=1 b= 1 1

4.查看变量使用的内存地址使用id的方法

如:

a= 7578824

区别比较:

在python中不同的数据类型的赋值、深浅拷贝结果不通,为此需要区别对待,同时为了方便验证,我们在交互模式下测试,测试环境python3.5.2.

1.数字类型

>>> a=1 >>> b=a >>> (1855455696,1855455696) >>> a=2 >>> (1855455728,1855455696 >>> (2,1) >>> c=3 >>> >>> d=copy.copy(c) >>> (1855455760,1855455760) >>> c=6 >>> (1855455856,1855455760) >>> (6,3 >>> d=copy.deepcopy(c) >>> (1855455856,1855455856) >>> c=5 >>> (1855455824,1855455856) >>>

结果分析:对于数字类型,无论是赋值还是深浅拷贝,赋值或拷贝以后内存地址都一样,修改拷贝前的值,会重新分配一个新的内存地址,并不影响拷贝后的值。

2.字符串

>>> a= >>> b= >>> (3447696,3447696) >>> a= >>> (8140144,3447696) >>> >>> a= >>> >>> b= >>> (3447696,3447696 >>> a= >>> (8140032,3447696) >>> >>> a= >>> b=copy.deepcopy(a) >>> (8140032,8140032 >>> a= >>> (8140200,8140032)

结果分析:字符串类型和数字类型结果一样,改变a的值,会重新分配内存地址,并不影响b的值

3.列表

>>> a=[1,2,3,[4,5,6 >>> b= >>> (10695880,10695880) >>> a=[,, >>> (10695944,10695880) >>> ([,],[1,6 >>> >>> a=[1,[7,8,9 >>> b= >>> (10696520,10696520 >>> a[0]= >>> (10696520,10696520) >>> ([,9]],[,9]]) >>> a[3][1]= >>> (10696520,10696520 >>> ([,,9]])

结果分析:列表的赋值操作如果对于改变整个列表而言,结果和字符串、数字类型相同,但是如果修改列表中某个元素,在示列中修改了a列表中元素,导致了b列表也改变了。

>>> >>> a=[1,6 >>> b=copy.copy(a) >>> (17628744,10894536) >>> a[0]= >>> [,6 >>> [1,6 >>> id(a[3]),id(b[3 (17671944,17671944) >>> a[3]= >>> [, >>> [1,6 >>> id(a[3]),id(b[3 (6200208,17671944) >>> >>> a=[1,6 >>> b= >>> id(a[3][0]),id(b[3 (1520960048,1520960048 >>> a[3][0]= >>> id(a[3][0]),id(b[3][0]) (10888392,10888392 >>> [1,[,6 >>> [1,6 >>>

结果分析:浅copy,只对外层内存地址做拷贝,拷贝之后的两个列表内存地址不同,两个变量的第二层内存地址相同,修改整个第二层对拷贝后的变量无影响,但修改第二层中的元素的值,会影响拷贝后的值,从内存地址上看就很清晰了。

>>> >>> a=[1,6 >>> b=copy.deepcopy(a) >>> (11337288,11380360) >>> id(a[3][0]),id(b[3 (1520960048,1520960048) >>> a[3][0]= >>> [1,6 >>> [1,6 >>> id(a[3][0]),id(b[3][0]) (10954040,1520960048)

结果分析:深copy,只对外层内存地址做拷贝,内层地址相同,但是不通的是改变内层中元素的值,并不影响拷贝后的变量,相当于两份独立的数据。

>>> a=[1,6 >>> b= >>> (17249480,17249608 >>> a[3][0]= >>> id(a[3][0]),id(b[3 (17245552,17245552 >>> [1,6 >>> [1,6]]

结果分析:从结果上看,list中的列表方法也是浅copy。

4.字典

>>> a={:,:22,:{:,: >>> b= >>> (6668040,6668040 >>> id(a[][]),id(b[][ (7087752,7087752 >>> a[][]= >>> id(a[][]),id(b[][ (7087976,7087976 >>> {: {: ,: },: 22,: >>> {: {: ,: >>> a[]= >>> id(a[]),id(b[]) (7087920,7087920 >>> {: ,: >>> {: ,: }

结果分析:字典的赋值操作和列表一样,无论修改外层元素还是内层元素,

>>> a={:1,:2,:{: >>> >>> b=copy.copy(a) >>> (6799112,7224648 >>> id(a[]),id(b[] (1509229040,1509229040 >>> id(a[]),id(b[ (1509229008,1509229008 >>> a[]= >>> id(a[]),id(b[ (7218656,1509229008 >>> {: ,: {: },: 2 >>> {: 1,: 2 >>> id(a[][]),id(b[][]) (7218600,7218600 >>> a[][]= >>> id(a[][]),id(b[][]) (7219272,7219272 >>> {: ,: {: },: 2 >>> {: 1,: 2 >>>

结果分析:字典的浅拷贝和列表一样,使用copy方法拷贝字典后,a,b字典外层内存地址不同,第二层内存地址相同,修改a字典中整个第二层变量不会影响b字典,修改a字典中第二层中的元素的时候,会影响b字典。

>>> a={:1,:2,:{: >>> >>> b=copy.deepcopy(a) >>> (10534664,17276488) >>> id(a[]),id(b[ (1528037840,1528037840) >>> a[]= >>> id(a[]),id(b[ (17318552,1528037840 >>> {: {: },: ,: 2 >>> {: {: },: 1,: 2 >>> a[][]= >>> {: {: },: 2} >>> {: {: },: 2 >>>

结果分析:字典的深copy和列表相同,相当于两份独立的数据。

>>> a={:1,:{: >>> b= >>> >>> a[]= >>> {: ,: {: },: 2 >>> {: 1,: 2 >>> a[][]= >>> {: ,: {: },: 2 >>> {: 1,: 2 >>>

结果分析:字典的copy方法也相当于浅copy。

总结:

1.对于数字、字符串这些“简单的”数据类型,赋值、深copy、浅copy都一样,并且随意修改其中一个变量,并不影响另一个变量的值。

2.对于列表、字典这些“复杂”的数据类型,赋值操作相当于给变量取了别名,修改变量里的内容,都会改变,修改整个变量则无影响;浅copy和copy方法结果相同,对外层进行拷贝,修改第一层的元素相互不会影响,当列表或者字典中嵌套了列表或字典,修改嵌套的列表或者字典(也可以叫做第二层中的元素)导致两个变量都会改变;深copy相当于复制两份互不影响的数据。

使用建议:

1.对于数字、字符串类型可以随心所遇,对于字典、列表如果想得到两份不同的数据,建议使用copy.deepcopy的方法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读