递归里面的doSomething

<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在递归条件只后的,要确保 向回调用时可以执行的到

时间: 2024-10-18 05:56:50

递归里面的doSomething的相关文章

如何去除项目里面的SVN和CVS文件夹

SVN和CVS是我们常使用的项目版本管理工具,为我们的工作带来了很大的方便.但是,有时候我们需要删除里面的SVN和CVS文件夹. 1 如何快速的删除项目中的版本控制文件夹  (1) 删除项目中的SVN文件夹.我们可以使用bat脚本来实现快速递归删除,代码如下: @echo off echo Deleting SVN folders and files under: %1 REM Open Folder specified by parameter. cd %1 REM Recursive del

Afianl框架里面的FinalBitmap加载网络图片

在Afianl框架里,FinalBitmap如何加载网络图片?有什么简单的方法吗?现在让麦子学院的android开发老师讲讲afina框架里面的finalbitmap加载网络图片的方法,Afinal里边FinalBitmap:用于显现bitmap图像,而无需思考线程并发和oom等疑问. 1.测验恳求 运用页面翻开http://avatar.csdn.net/C/6/8/1_bz419927089.jpg"可以看到一张图像. 2.新建FinalBitmap目标 1 FinalBitmap bitm

函数的上下文就是函数里面的this是谁

规律1:函数用圆括号调用,函数的上下文是window对象 比如小题目: function fun(){ var a = 888; alert(this.a); //实际上访问的是window.a } var a = 666; fun(); //弹出666 函数function fun(){}的上下文是什么!不要看它怎么定义,要看它怎么调用!!此时是fun()函数名加上圆括号直接调用,此时上下文就是window对象! 而我们知道:所有的全局变量都是window对象的属性,(注意:函数里面的局部变量

提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载

要求:手机端打开某个页面的详细信息,因为网速或者别的原因,响应太慢,因为图片大的原因,希望先进来,图片在网页运行的情况再慢慢加载(jquer延迟加载) http://www.w3cways.com/1765.html()  困难:因为页面的图片是用编辑器加进去的        :图片与文字存到数据库的字段中 :实现思路:从数据库中读取这个字段,把字段里面的src替换成lazyload 然后再返回给页面 这里主要讲是怎么把从数据库取到的数据里面的字段里面的值替换然后与页面直接的数据转换 首先 pu

直接修改别人jar包里面的class文件 工具:jclasslib

出于某些原因 需要把别人jar包里面的class修改一下信息 配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK.. 在网上游荡了半天,没有找到合适的方法 开始我是先用jd-gui反编译 把我需要修改的那个A.class文件反编译出来把代码保存到A.Java 然后直接在dos里面用javac A.java编译 问题来了.. 因为A.java引用了很多其他jar下面的方法 而且A.java有package 鼓捣了半天以后 最终结果:编译无法

form里面的action和method(post和get的方法)使用

一.form里面的action和method的post使用方法 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="formsubmitpost.aspx.cs" Inherits="formsubmitpost" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh

gdb 和 addr2line 调试 crash(包含如何调试so里面的crash)

嵌入式编程中会遇到各种crash的问题. 对于这样的问题,有两种调试方法: addr2line  和 gdb. 第一章   先讲解下gcc 编译加不加 -g 对程序的影响, 还有strip. //1.1.cpp #include <iostream> using namespace std; bool IsUnique() {         int k = 0, m = 0;         k = k/m;      //这里会crash         return true; } in

javascript正则找script标签, link标签里面的src或者 href属性

1. [代码]javascript 简单的search    <script(?:(?:\s|.)+?)src=[\"\'](.+?)[\"\'](?!\<)(?:(?:\s|.)*?)(?:(?:\/\>)|(?:\>\s*?\<\/script\>)) <script  src="sdfsdf/sdfd.js"          type="text/javascript"  /><scr

打开office2010里面的access,总是提示要配置Office single image

刚安装了,office2010,打开里面的access时,总是提示要配置Office single image,但打开word和excel没问题,很是不舒服 在网上找到N种方法,试下来还是不行. 后来就把office2010卸掉,重新安装了一下,安装的时候,只把里面用不到的输入法.publish,outlook这三项去掉,其他的都勾上了,安装完后,再打开access,终于不提示要配置Office single image了,word,excel也没问题. 之前也遇到过这种情况,但印象中,也没有去