Python在for循环的每次迭代中为范围函数生成随机步骤

时间:2014-01-21 11:06:50

标签: python for-loop random

我正在尝试将字符串拆分为随机大小的小块。例如,

string = 'qwertyuiopp'加入['qw','e','rty,'u','iopp']

for record in SeqIO.parse(args.fasta_file , "fasta"):
    step = 200
    for i in range(0, len(record),step):
        oline = ">"+record.id+"_"+str(i+1)+"\n"
        ofname.write(oline)
        step = random.randrange(200,2000)
        if len(record.seq[i:i+step]) >= 200:
            oline= str(record.seq[i:i+step])+"\n"
            ofname.write(oline)
        i=i+step
        else:
            oline= str(record.seq[i-200:])+"\n"
            ofname.write(oline)
        i=len(record)+1

我认为问题在于范围函数中的步长保持不变(200),尽管使用randrange修改步骤的值。但我不知道应该怎么做。感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

一旦遇到for循环,

range函数就会创建一个列表。它不会针对每次迭代进行评估。 您可以使用while循环来实现此目的。

import random
step = 1
count = 0
while count < len(record):     
    print count
    step = random.randint(1, 5)
    count += step

答案 1 :(得分:2)

range函数不记得它是如何获得它的构造值的。当您调用创建范围对象range(0, len(record), step)(Python 3.x)或列表range(0, 1000, 200)(Python 2.x)的[0, 200, 400, 600, 800]时。无论哪种方式,稍后更改step都不会改变任何内容。

您可以构建一个自定义迭代器,让您重置其步骤,或者更改其步骤并迭代(start, end)(start, step)对的自定义迭代器。但对你来说这可能有点先进。*

在这种情况下,当您无法找到或编写迭代器进行循环时,您必须转到while循环,并手动更新循环变量。

值得注意的是,您已经尝试使用i = i + step手动更新循环变量。这在for循环中通常是一个坏主意 - 但在while循环内,它正是你想要的。所以,真的,只需改变这一行:

for i in range(0, len(record),step):

......对这两行:

i = 0
while i < len(record):

您的代码中还有其他问题需要修复(包括至少两个IndentationError s),但是一旦超过这个问题就可以修复它们。

最后一件事:无论你有for循环还是while循环,如果你想早点爆发,那么这样做的方法是break语句,不是试图改变循环条件,所以下一个测试将失败。因此,最后也将i=len(record)+1替换为break


*此外,这种迭代器的明显实现仍然是同一种while循环......