这看起来相当基本,但我已经阅读了 itertools 和理解的文档一段时间了,似乎找不到任何可以做到这一点的东西。
我有一个函数breakSingleChar
,它可以逐个字符地暴力破解密码,这就是我使用它来破解长度为 32 的密码的方法:
res = ""
for i in range(32):
res = breakSingleChar(res)
这感觉就像它可以很容易地变得更干净和 Pythonic,但我真的不知道如何。使用itertools.repeat
我能够想出这个:
for _ in itertools.repeat(None, 32):
res = breakSingleChar(res)
这或多或少是一样的。
我想如果我真的很有创意,我可以使用,reduce
但这种感觉就像我只是在滥用它。
有没有优雅的方法来做到这一点?
编辑
我被要求展示一些可运行的代码。首先,我没有发现这是必要的,因为这里的问题很简单。我调用的蛮力函数很长,可能会增加关于这个问题的混乱,所以我将展示一个玩具示例,其中同样的问题仍然存在。
所以假设我们有一个函数来检查一个数 n 是否是素数,如果不是,则返回 n+1,如果是,则返回 n-1:
# if number is prime, increment by one, else decrement
def PrimeChecker(n):
for i in range(2,int(n**0.5)+1):
if n%i==0:
return n + 1
return n - 1
我们现在要从某个数字开始,并在其上应用此函数 n 次,并且每次都在上次调用的输出上应用该函数:
res = 1007
for i in range(10):
res = PrimeChecker(res)
print(res)
递归函数会很酷,但可能不会更简洁
这可以以一种很好的方式完成,也许使用理解或 functools 资源?
编辑 2在该术语的评论中出现了一些讨论pythonic
。
也许这是由于我没有正确使用该术语。相反,我可能应该指定我希望限制程序的大小和行数,并且通常会更频繁地练习使用推导式/函数工具。我想看看在这种情况下是否可以做到
您可以使用functools.reduce
递归调用给定次数的函数。
import functools
print(functools.reduce(lambda v, f: f(v), [PrimeChecker] * 10, res))
或者
import functools
print(functools.reduce(lambda v, _: PrimeChecker(v), range(10), res))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句