用于获取调用输出并在其上再次应用函数的 Pythonic 方法

不太好1337

这看起来相当基本,但我已经阅读了 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

也许这是由于我没有正确使用该术语。相反,我可能应该指定我希望限制程序的大小和行数,并且通常会更频繁地练习使用推导式/函数工具。我想看看在这种情况下是否可以做到

jisrael18

您可以使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章