如何在python中循环一个范围时后退一步



我正试图使一个密码生成器,您输入的字母,符号和数字的数量,你想在密码。我必须按随机顺序来做。我心中有一个解决方案(见下文),但它需要我在for循环中"后退一步"。我知道使用while循环会容易得多,但由于未公开的原因,我不得不使用for循环。以下是相关代码:

for i in range(1, letters_left + numbers_left + symbols_left + 1):  
char = random.randint(0, 2)

if char == 0:
if letters_left:
final_string += (letters[random.randint(0, 25)])
letters_left -= 1
else:
i -= 1

if char == 2:
if symbols_left:
final_string += (symbols[random.randint(0, 8)])
symbols_left -= 1
else:
i -= 1

if char == 3:
if numbers_left:
final_string += (numbers[random.randint(0, 9)])
numbers_left -= 1
else:
i -= 1

你可以看到,我已经尝试从i减去,但它不起作用。我已经读了一点,似乎在pythonfor循环使用__next__()方法(?)"前进"。有没有类似的"倒着走"的方法?我是python的新手。

所以今天没有while循环:

import random
import sys
final_string = ""
letters = []
for c in range(65, 65+26):
letters.append(chr(c))
numbers = []
for c in range(48, 58):
numbers.append(chr(c))
symbols = []
for c in range(97, 106):
symbols.append(chr(c))
letters_left = 2
numbers_left = 3
symbols_left = 4
LETTER = 0
SYMBOL = 1
NUMBER = 2
left = []
for i in range(0, letters_left):
left.append(LETTER)
for i in range(0, symbols_left):
left.append(SYMBOL)
for i in range(0, numbers_left):
left.append(NUMBER)
def build(list):

ret = ""
size = len(list)
if size == 0:
return ret
now = 0
if size > 1:
now = random.randint(0, 4321) % size
char = list.pop(now)
if char == LETTER:
ret += (letters[random.randint(0, 25)])

elif char == SYMBOL:
ret += (symbols[random.randint(0, 8)])

else: 
ret += (numbers[random.randint(0, 9)])
return ret + build(list)
final_string = build(left)
print (final_string)

这个怎么样?

import random
final_string = ""
letters = []
for c in range(65, 65+26):
letters.append(chr(c))
numbers = []
for c in range(48, 58):
numbers.append(chr(c))
symbols = []
for c in range(97, 106):
symbols.append(chr(c))
letters_left = 1
numbers_left = 1
symbols_left = 1
left = [letters_left, symbols_left, numbers_left]
print (left)
for i in range(1, letters_left + numbers_left + symbols_left + 1):
char = -1
while char == -1:
c = random.randint(0, 2)
if left[c] > 0:
char = c

print(char)
if char == 0:
final_string += (letters[random.randint(0, 25)])
left[0] -=1

elif char == 1:
final_string += (symbols[random.randint(0, 8)])
left[1] -=1

else: 
final_string += (numbers[random.randint(0, 9)])
left[2] -=1
print (final_string)

我找到了答案。可能不会(至少在不使用远超我的代码的情况下)。但是:我没有尝试"返回",而是扩展了我正在循环的数组。我的想法是,我将不断地扩展数组进行尽可能多的迭代,直到我不能这样循环就会中断。实际上,它是一个while循环。下面是代码:

for i in count_arr:  
char = random.randint(0, 2)

if char == 0:
if letters_left:
final_string += (letters[random.randint(0, 25)])
letters_left -= 1

if char == 1:
if symbols_left:
final_string += (symbols[random.randint(0, 8)])
symbols_left -= 1

if char == 2:
if numbers_left:
final_string += (numbers[random.randint(0, 9)])
numbers_left -= 1
if letters_left + numbers_left + symbols_left == 0:
incomplete = 0
if incomplete == 1:
count_arr.append("cont.")

最新更新