潘传-AI新手学习笔记 2021-12-04 21:31 采纳率: 100%
浏览 42
已结题

求解决:python学习中关于lambda的一些问题

问题遇到的现象和发生背景

问题一:lambda函数究竟是什么原理?
问题二:请看代码

def switch(option):
        funcdic={
            1:lambda:searchMode(),
            2:lambda:editMode(),
            3:lambda:exit()
            }
        return funcdic[option]()

这一段代码 假如我在查询单词里我输入了数字9(代表退出查询,回到主菜单),那么请问return了什么使得这一段函数能成功跳出并执行下一段代码(即:怎么又回到了主菜单)

while True:
        print('----------欢迎实用英汉词典---------')
        print('1.查询单词\n2.添加单词\n3.退出\n')
        option=int(input('请输入你的选择:'))
        switch(option)

问题相关代码,请勿粘贴截图

```python
dict={}
digits='0123456789'
path='F:\\Users\\马欣桐\\Documents\\python\\本书资源\\字典\\dictionary.txt' #最后要把输入键放到下一行

def readFile(path,arg):
    try:
        file=open(path,arg,encoding='GBK')    #格式需要ANSI的
    except:
        file=open(path,'w',encoding='GBK')
    return file

def readWords():
    file=readFile(path,'r')
    while True:
        line=file.readline()
        #print(line)
        if not line:
            break
        word=line.split(' ',2)
        #print(word)
        dict[word[0]]=word[1][:-1]
        #print(dict)
    file.close()

def writeFile(word,dsp):
    file=readFile(path,'a')
    file.write('{} {}\n'.format(word,dsp))
    file.close()

def modifyFile(word,dsp):
    file=readFile(path,'r')
    line=file.readlines()
    #print(line)
    flen=len(line)-1
    #print(flen)
    for i in range(flen):
        if word in line[i]:
            file.close()
            line[i]='{} {}\n'.format(word,dsp)
            print(line[i])
            file=readFile(path,'w')
            print(line)
            file.writelines(line)
            break
    file.close()

def editMode():
    print('*'*50)
    print('*'*50)
    while True:
        word=input('(按数字键退出)请输入你想添加或修改的单词:')
        if word in digits:
            print('*'*50)
            print('*'*50)
            return
        try:
            print('该单词已存在于单词库,当前解释是:{}'.format(dict[word]))
        except:
            print('您添加的是一个新单词')
        print('----------------------------------')
        description=input('请输入您的解释:\n')
        try:
            dict[word]+=',%s'%description
            modifyFile(word,dict[word])
        except KeyError:
            dict[word]='%s'%description
            writeFile(word,dict[word])
        print('------------添加完成--------------')

def searchMode():
    print('*'*50)
    print('*'*50)
    while True:
        word=input("(按数字键退出)请输入你想查的单词:")
        if word in digits:
            print('*'*50)
            print('*'*50)
            return
        print('----------------------------------')
        try:
            print(dict[word])
        except KeyError:
            print('对不起,这个单词没有收录')
        print('----------------------------------')

def interface():
    readWords()
    def switch(option):
        funcdic={
            1:lambda:searchMode(),
            2:lambda:editMode(),
            3:lambda:exit()
            }
        return funcdic[option]()
    while True:
        print('----------欢迎实用英汉词典---------')
        print('1.查询单词\n2.添加单词\n3.退出\n')
        option=int(input('请输入你的选择:'))
        switch(option)

interface()

###### 运行结果及报错内容 
  • 写回答

1条回答 默认 最新

  • 关注

    lambda是函数表达式

    
    lambda:searchMode()
    就等同
    def xxxxxx():
        return searchMode()
    
    
    

    def switch(option):
    funcdic={
    1:lambda:searchMode(), 是创建一个没有名字的匿名函数,searchMode()是匿名函数体中执行的代码,把这个匿名函数的引用地址赋值给funcdic字典的1键名中,(这时不会执行函数)
    2:lambda:editMode(),
    3:lambda:exit()
    }
    当option=1时 funcdic[option] 就是lambda:searchMode()匿名函数的引用,在后面加括号funcdic[option]()就是调用执行这个匿名函数。并反回searchMode()的返回值。

    第二个问题函数调用过程是

    
    1 执行interface()
        2 进入 while True: 循环
            3 输入1赋值给option 调用 switch()
                4 执行funcdic[1]() 调用searchMode()函数
                    5searchMode()中输入数字退出 ,回到(4)处之后继续执行
                回到(4)处之后return退出switch函数 ,回到(3)处之后继续执行
            回到(3)处之后还是在 while 循环中,继续进行下一次循环又输出主菜单
    

    如有帮助,望采纳!谢谢!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 已采纳回答 12月6日
  • 创建了问题 12月4日

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)