我正试图使一个密码生成器,您输入的字母,符号和数字的数量,你想在密码。我必须按随机顺序来做。我心中有一个解决方案(见下文),但它需要我在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.")