鱼C论坛

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

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

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

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

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

x
本帖最后由 hyftee 于 2017-6-20 21:54 编辑
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' 
    temp.close()
    return(display)
'''该函数用于查找文件夹中的每个文件,若文件后缀为txt.在调用searchkey函数,并记录文件位置'''       
def searchtxt(key_name,search_result):
    for each in os.listdir(os.curdir):
        if os.path.isdir(each):
            os.chdir(each)
            searchtxt(key_name,search_result)
            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)
                '''print(search_result)'''
                '''这个位置我用print查看,发现信息是有记录的,但是search_result这个变量好像在某个位置被重新覆盖了'''
    return(search_result)

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

                
在答题中,我是采用将记录全部储存到 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-20 16:11:49 | 显示全部楼层
for循环每一次result这个变量都被重新定义成'  ' 所以, 请把result变量的定义放在for循环以外就行了
想知道小甲鱼最近在做啥?请访问 -> 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值作为参数,而是做为一个全局变量使用,这个代码就产生我需要的效果了,但是这个并没有解决掉我的疑问,我感觉不需要声明全局变量,也是可以达到同样的效果的

可能相关名词表示不清,造成的阅读困难请谅解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-8 22:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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