鱼C论坛

 找回密码
 立即注册
查看: 1934|回复: 2

python零基础第三十讲课后作业 使用递归遇到问题

[复制链接]
发表于 2017-6-20 09:01:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hyftee 于 2017-6-20 21:54 编辑
  1. import os
  2. '''该函数用于读取并记录含有关键字的行和位置信息,并返回'''
  3. def searchkey(txt_name,key_name):
  4.     temp=open(txt_name)
  5.     line = 0
  6.     display=''
  7.     for each in temp:
  8.         line +=1
  9.         result= ' '
  10.         if key_name in each:
  11.             p=each.find(key_name,0)
  12.             while p != -1:
  13.                 result =result + str(p+1) + ','
  14.                 p=each.find(key_name,p+1)
  15.             display=display+'关键字出现在第%d行,第[%s]个位置.'%(line,result)+'\n'
  16.     temp.close()
  17.     return(display)
  18. '''该函数用于查找文件夹中的每个文件,若文件后缀为txt.在调用searchkey函数,并记录文件位置'''      
  19. def searchtxt(key_name,search_result):
  20.     for each in os.listdir(os.curdir):
  21.         if os.path.isdir(each):
  22.             os.chdir(each)
  23.             searchtxt(key_name,search_result)
  24.             os.chdir(os.pardir)
  25.         elif os.path.splitext(each)[1] == '.txt':
  26.             if searchkey(each,key_name) is not '':               
  27.                 search_result=search_result + '==========================================\n'
  28.                 search_result=search_result +'在文件['+os.getcwd()+os.sep+each+']中找到关键字'+'[%s]'%(key_name)+'\n'
  29.                 search_result=search_result + searchkey(each,key_name)
  30.                 '''print(search_result)'''
  31.                 '''这个位置我用print查看,发现信息是有记录的,但是search_result这个变量好像在某个位置被重新覆盖了'''
  32.     return(search_result)

  33. key_name = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
  34. result=''
  35. result=searchtxt(key_name,result)
  36. print(result)

  37.                
复制代码

在答题中,我是采用将记录全部储存到 result这个变量里,再一次读取出来,但是最后输出结果只有一条信息,我在searchtxt()这个自定义函数内部用print()输出发现值都是有存储记录的,但是在某个位置被覆盖了,请教大家这个问题应该如何解决比较好


============================================================
更改后的代码如下 不再将要传出的结果search_result定义为函数的一个参数,将search_result作为一个全局变量再函数中做修改

import os
def searchkey(txt_name,key_name):
    temp=open(txt_name)
    line = 0
    display=''
    for each in temp:
        line +=1
        result= ' '
        if key_name in each:
            p=each.find(key_name,0)
            while p != -1:
                result =result + str(p+1) + ','
                p=each.find(key_name,p+1)
            display=display+'关键字出现在第%d行,第[%s]个位置.'%(line,result)+'\n'
            '''print(display)'''
    temp.close()
    return(display)
        
def searchtxt(key_name):
    for each in os.listdir(os.curdir):
        global search_result
        if os.path.isdir(each):
            os.chdir(each)
            searchtxt(key_name)
            os.chdir(os.pardir)
        elif os.path.splitext(each)[1] == '.txt':
            if searchkey(each,key_name) is not '':               
                search_result=search_result + '==========================================\n'
                search_result=search_result +'在文件['+os.getcwd()+os.sep+each+']中找到关键字'+'[%s]'%(key_name)+'\n'
                search_result=search_result + searchkey(each,key_name)               
    return(search_result)

key_name = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
search_result=''
search_result=searchtxt(key_name)
print(search_result)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-20 16:11:49 | 显示全部楼层
for循环每一次result这个变量都被重新定义成'  ' 所以, 请把result变量的定义放在for循环以外就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-20 22:06:12 | 显示全部楼层
yongxi 发表于 2017-6-20 16:11
for循环每一次result这个变量都被重新定义成'  ' 所以, 请把result变量的定义放在for循环以外就行了

你好,在解这题时我已经将result的定义放在整个自定义函数外了
现在是否为递归过程中(第23行)中没有使用自定义函数searchtxt()内(25行-30行内查找产生的新的search_result的值,而是调用了外部的result

最后我的解决方法是不再将search_result值作为参数,而是做为一个全局变量使用,这个代码就产生我需要的效果了,但是这个并没有解决掉我的疑问,我感觉不需要声明全局变量,也是可以达到同样的效果的

可能相关名词表示不清,造成的阅读困难请谅解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 18:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表