好程序员Python培训分享Python的递归函数与匿名函数调用
off999 2024-10-28 16:47 94 浏览 0 评论
好程序员Python培训分享Python的递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数调用进行系统的介绍分析。
一. 递归函数
a) 引言:在一个函数中自己调用自己会怎么样呢?会陷入无限的调用循环。为了解决该问题就需要使用递归。
b) 应用:
i. 案例分析:编写一个函数,该函数接收一个整数n,然后计算输出n的阶乘。
1. 首先定义一个一个函数def factorial(n),该函数应该怎么实现呢?我们知道计算n的阶乘有如下规律:n!=n*[(n-1)*[n-2]…*1]=n*(n-1)!
2. 函数实现步骤可以是:
def factorial(n):
1.计算(n-1)的阶乘
2.返回step1的结果值*n
要完成第一步的事情,就是要计算(n-1)!。由于我们这个函数是计算n!,因此第一步也可以理解为,以n-1为参数,调用factorial函数。代码就会变成:
def factorial(n):
1.factorial(n-1)
2.返回step1的结果值*n
在该代码中,出现了在factorial函数中调用factorial函数的情况。出现了函数的递归。为了完善上述代码,可以将代码中的第二部也翻译成代码:
def factorial(n):
1. int result=factorial(n-1)
2. return result*n
但是问题也出现了,加入n=3,在fac(3)的内部会调用fac(2),在fac(2)中会调用fac(1),在fac(1)中会调用fac(0)-》fac(-1)……因此我们需要规定一个循环调用结束的条件。在当前程序中当参数n的值为1时,则计算1的阶乘,到这一步就没有必要继续递归下去的必要了,因此n=1是,应当直接返回。
def factorial(n):
if(n==1):
return 1
int result=factorial(n-1)
return result*n
二. 匿名函数
a) 引言:当我们在创建函数的时,有的时候不需要显示的定义函数,直接传入匿名函数会更加的方便,这会省去我们挖空心思为函数命名的麻烦,也能少些不少的代码,很多编程语言都提供匿名函数这种特性。匿名函数用好了,会起到画龙点睛的效果,没用好就容易画虎不成反类犬,
b) 在Python中使用lambda关键字来创建匿名函数。所谓匿名,即不再使用def这种标准形式定义函数,需要注意的有:
i. lambda是一个表达式而不是一个代码块
ii. 仅仅能在lambda表达式中封装有限的逻辑
iii. Lambda函数拥有自己的命名空间
c) 语法结构:lambda 参数:表达式 例如 lambda x:x*x, 冒号前的x表示的是参数,后面的表示函数的执行代码,,它相当于下面的函数:
Def f(x): return x*x
d) 注意:
i. 匿名函数只能有一个表达式
ii. 不用也不能写return语句,表达式的结果就是返回值
iii. 匿名函数也是一个函数对象,可以将其赋值给一个变量,然后通过变量来调用该函数。f=lambda x:x*x f(6)
三. 推导式:是一种独特的推导式语法,可帮我们在某些场合写出比较精简炫酷的代码。但是没有它,也不会有太多的影响。
a) 分类:
i. 列表推导式
ii. 字典推导式
iii. 集合推导式
iv. 元组推导式?
b) 列表推导式:是一种快速生成列表的方式,其形式使用方括号括起来的一段语句。
i. 案例:lis=[x*x for x in range(1,10) ] 首先执行for循环,对于每一个x带入x*x中进行运算,将运算的结果值逐一添加到一个新的列表内(x*x的式子中使用的变量必须为for中的x)。尤其可见,列表推导式为我们提供了一种在一行内实现较为复杂逻辑的生成列表的方法。其核心语法就是用中括号将生成的逻辑封装起来。
ii. 案例:[x*x for x in range(1,11) if x%2==0] 通过增加if语句对x进行过滤
iii. 案例:dic={“k1”:”v1”,”k2”:”v2”} a=[k+”:”+v for k,v in dic.items()]
c) 字典推导式:列表推导式使用的是中括号,那么如果使用大括号则可以制造字典推导式
i. 案例:dic={x:x*2 for x in(2,4,6)} x:x*2中间的冒号左边表示key右边表示value
ii. 案例:也可以添加if子句
d) 集合推导式:大括号除了可以用作字典推导式还可以用作集合推导式,注意两者差别。
i. 案例:a={x for x in “abcdefg” if x not in “abc”}
e) 元组推导式:那是用小括号的是不是元组推导式呢?no。在python中使用小括号的被叫做生成器的语法,在python中没有元组推导式。
i. 如果想通过上述类似的方法生成元组,需要显示调用元组的类型转换函数tuple。t=tuple(x for x in range(10))
f) 面试题:
result = [lambda x: x + i for i in range(10)]
print(result[0](10))
答案是19,并且result[0~9](10)的结果都是19。这是因为函数具有调用时才查找变量的特性。在你没调用它之前,它不会保存也不关心它内部变量的具体值。只有等到你调用它的时候,它才逐一去找这些变量的具体值。这里的result[0]被调用的时候,变量i已经循环完毕,变成9了,而不是想象中的动态0-9值。
那如果不想要这样的结果,想要i是循环的值怎么办?不要直接引用上层变量,把变量直接传进来。
result = [lambda x, i=i: x + i for i in range(10)]
print(result[0](10))
四. 迭代器
a) 迭代:通过for循环遍历对象的每一个元素的过程。For可以遍历任何可迭代的对象。
b) 可迭代对象类型:list/tuple/string/dict/set/bytes。可以通过collections模块的Iterable类型来判断一个对象是否可迭代:
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代
c) 迭代器:是一种可以被遍历的对象。特点如下:
i. 能调用next()函数。
ii. 使用iter()函数创建迭代器对象
iii. 迭代器对象从集合的第一个元素开始访问,直到所有元素被访问结束
iv. 只能往后遍历,不能回溯
v. 案例:
>>> lis=[1,2,3,4]
>>> it = iter(lis) # 使用Python内置的iter()方法创建迭代器对象
>>> next(it) # 使用next()方法获取迭代器的下一个元素
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it) # 当后面没有元素可以next的时候,弹出错误
或者使用for循环遍历迭代器:
lis = [1,2,3,4]
it = iter(lis) # 创建迭代器对象
for x in it: # 使用for循环遍历迭代对象
print (x, end=" ")
迭代器的作用:除了可迭代的类型可以进行迭代外,在开发中也会遇到一些自定义的类型也有迭代的需求,即将自定义类型定义成迭代器类型即可(需要在类里实现__iter__()和__next__()方法,可供next和iter函数调用该对象)。for循环本质上就是通过不断调用next()函数实现的
def iter(obj):
return obj.__iter__()
def next(obj):
return obj.__next__()
自定义迭代器类:
import random
class demo_iterator(object):
def __next__(self):
v = random.randint(0,10)
if v < 5:
raise StopIteration()
else:
return v
def __iter__(self):
return demo_iterator()
迭代作用:可以把这个元素流看做是一个有序序列,但却不能提前知道序列的长度,只能不断通过next()函数得到下一个元素,所以迭代器可以节省内存和空间。
五. 生成器
a) 引言:有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的。比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表内,这是粗暴的方式,有如此大的内存么?如果元素可以按照某种算法推算出来,需要就计算到哪个,就可以在循环的过程中不断推算出后续的元素,而不必创建完整的元素集合,从而节省大量的空间。在Python中,这种一边循环一边计算出元素的机制,称为生成器:generator。
b) 语法格式:类似推导式,使用小括号
c) 案例:
>>> g = (x * x for x in range(1, 4))
>>> g
at 0x1022ef630>
可以通过next()函数获得generator的下一个返回值,这点和迭代器非常相似:
>>> next(g)
1
但更多情况下,我们使用for循环。
for i in g:
print(i)
d) 关键字yield:
1. 用法:使用yield返回的函数会变成一个生成器。在调用生成器的过程中,每次遇到yield时,函数会暂停并保存当前所有的运行信息,返回yeild值。并在下一次运行next方法时从当前位置继续执行。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
