我想知道是否有任何方法可以缩短这段代码(在本文下方)。
我想先尝试a,然后是b,然后是c,d,e,f,g,然后再尝试aa,ab,ac等。
我有python 3.7。
我想在某种蛮力的东西中使用它。
from pynput.keyboard import Key, Controller
import time
letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
keyboard = Controller()
time.sleep(2)
for i in range(20):
for x in range(letters):
keyboard.type(x)
keyboard.type(y)
keyboard.press(Key.enter)
time.sleep(1)
此行代码:
for x in range(letters):
不应该。因为TypeError
需要一个,两个或三个整数,而不是字符串列表,所以将抛出range
。
这里是使用生成器的解决方案。生成器使用itertools.product
生成包含字符串的元组。字符串数与number_of_digits
关键字参数相对应。使用itertools.islice
可以获取下一个n元组(在这种情况下,n
为5)-由于26 ** 2 == 676(假设number_of_digits
是2)。
def main():
from itertools import islice
def get_product(*, number_of_digits=2):
from itertools import product
from string import ascii_lowercase
for tpl in product(*[ascii_lowercase] * number_of_digits):
yield tpl
product_generator = get_product()
for tpl in islice(product_generator, 5):
print(tpl)
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
输出:
('a', 'a')
('a', 'b')
('a', 'c')
('a', 'd')
('a', 'e')