码迷,mamicode.com
首页 > 其他好文 > 详细

递归里面的doSomething

时间:2015-08-31 07:36:00      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

<Python编程入门经典>里面有个例子,将某目录下Log文件重命名,log->log.0,log.0->log.1,log.1->log.2,log.2->log.3  ...

两个问题,1)先处理前面的,文件会相互覆盖导致丢失

                  2)第一个是个无编号的文件名,有可能不存在

书里的解决方案如下

import os,shutil

def make_version_path(path,version):
    if version==0:
        return path
    else:
        return path+.+str(version)

def rotate(path,version=0):
    old_path=make_version_path(path,version)
  ‘‘‘ #这块可以注释掉,没有log时创建了已经
if not os.path.exists(old_path): raise IOError("‘%s‘ doesn‘t exist" %path)
  ‘‘‘ new_path
=make_version_path(path,version+1) if os.path.exists(new_path): #new_path存在,进入 rotate,寻找不存在的 path+‘.‘+str(version+1) rotate(path,version+1) #找到后,先执行最后面的shutil.move ,再递归;在开始的连续调用中,只执行到每个函数的rotae,没到shutil.move shutil.move(old_path,new_path) def rotate_log(path): #没有文件Log,程序就创建一个 if not os.path.exists(path): new_file=open(path,w) del new_file rotate(path) rotate_log(/home/puma/test/log)

 自己写个(有写地方偷懒了)

import os
path=/home/puma/test/log

def rename(path,version=0):
    if os.path.exists(path+str(version+1)):
        rename(path,version+1)
    else:                                                    #问题在这里
        os.rename(path+str(version),path+str(version+1))

if __name__==__main__:
    if os.path.exists(path):
        os.rename(path,path+0)
    else:
        with open(path+0,w) as f:pass
    rename(path)

 

执行后有问题,问题在else那里:os.rename(和shutil.move在这个程序里的功能一样)是在path+str(version+1)==False,也就是找到最大的不存在的LogX,

向回迭代时必须调用的,写了else,相当于往回迭代时就是pass,什么都没做;

正确的

import os
path=/home/puma/test/log

def rename(path,version=0):
    if os.path.exists(path+str(version+1)):
        rename(path,version+1)
    
    os.rename(path+str(version),path+str(version+1))

if __name__==__main__:
    if os.path.exists(path):
        os.rename(path,path+0)
    else:
        with open(path+0,w) as f:pass
    rename(path)

----------------------------

ex:

def called(timer):
    if timer==5:
        pass
    else:
        called(timer+1)

        print timer: {}.format(timer)

called(1)

输出
timer: 4
timer: 3
timer: 2
timer: 1

#timer==5时,不会执行到 else中的print那里 

def called(timer): if timer==5: pass else: called(timer+1) print timer: {}.format(timer) called(1)

输出 timer:
5 timer: 4 timer: 3 timer: 2 timer: 1

 

这种doSomething在递归条件只后的,要确保 向回调用时可以执行的到

 

递归里面的doSomething

标签:

原文地址:http://www.cnblogs.com/Citizen/p/4772135.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!