将函数的输出馈送到与 for 循环相同的函数中

Feeding the output of a function into the same function as a for loop

我已经创建了一个函数来对字符串进行 MD5 散列,现在我想多次重复这个过程,并且每次都从十六进制散列输出中删除一定数量的字符,然后再 're' -散列。在花了很多时间寻找一种方法之后,我研究了 range() 函数、map() 函数,试图让它与 for 循环和嵌套函数一起工作,但我缺乏提出正确问题的知识.答案可能在于 class 功能,但我找不到将其应用到我的特定问题的方法。

下面是我的代码:

import hashlib

string = "randomstring"


def hash(string):
    en = string.encode()
    hex_result = hashlib.md5(en)
    return hex_result.hexdigest()
hash1 = hash(string)[:-10]
print("Hash #1", hash1)

def hash1a(hash1):
    en = hash1.encode()
    hex_result = hashlib.md5(en)
    return hex_result.hexdigest()
hash2 = hash1a(hash1)[:-10]
print("Hash #2", hash2)

def hash2a(hash2):
    en = hash2.encode()
    hex_result = hashlib.md5(en)
    return hex_result.hexdigest()
hash3 = hash2a(hash2)[:-10]
print("Hash #3", hash3)

def hash3a(hash3):
    en = hash3.encode()
    hex_result = hashlib.md5(en)
    return hex_result.hexdigest()
hash4 = hash3a(hash3)[:-10]
print("Hash #4", hash4)

def hash4a(hash4):
    en = hash4.encode()
    hex_result = hashlib.md5(en)
    return hex_result.hexdigest()
hash5 = hash4a(hash4)[:-10]
print("Hash #5", hash5)

def hash5a(hash5):
    en = hash5.encode()
    hex_result = hashlib.md5(en)
    return hex_result.hexdigest()
hash6 = hash5a(hash5)[:-10]
print("Hash #6", hash6)

我希望能够捕获第一个 hash 函数的输出,通过附加 [:-10] 对其进行修改,然后将该值提交回 hash 函数。能够在列表或字典中捕获它(通过使用 for 循环?)将是理想的。我花了大约 5 个小时研究这个,我学到了很多东西。希望我能做得更好,但真的只需要一些指导。谢谢!

使用循环,并将散列的结果分配给用作 hash() 函数参数的变量。

def hash_n_times(string, n):
    for _ in range(n):
        string = hash(string)[:-10]
    return string

print(hash_n_times("randomstring", 6))

@Barmar 完美地回答了这个问题,但我想我可能会添加一些解释以希望澄清一些事情。

第一件事:函数是执行此操作的好方法,但函数专门用于创建您可以调用的可执行代码块。在您的代码中,相同的代码块被冗余地用于创建“不同的”函数,这些函数仅在变量名称上不同,而在可执行代码上没有。因此,尽管您的想法是正确的,但应该只有一个函数可以做到这一点。

这将是您的代码中的一个示例,您的单一函数被调用了无数次:

def hash(string):
    en = string.encode()
    hex_result = hashlib.md5(en)
    return hex_result.hexdigest()

为了使用 for 循环调用此函数,您有两种选择:将 for 循环插入函数中,以便函数将调用自身,如@Barmar 所说,或者反之亦然,例如在 for 循环中调用函数。

如果你决定保持你的功能不变,而不是按照@Barmar 的建议修改它(我个人会接受他的修改,但那是我),那么你会在你的循环中调用上面的 hash() 函数:

for _ in range(6):
    string = hash(string)[:-10]

这是关于 for 循环的 link 到 Python 文档:https://docs.python.org/3/reference/compound_stmts.html#for

祝你好运,希望对你有所帮助:)