繁体   English   中英

python reduce return function reference 而不是function的值

[英]python reduce return function reference and not the value of the function

学习Python。我在学习reduce(),在玩初始化参数。 该代码仅输出字符串列表的 SHA256 hash。 起初我使用 for 循环生成 hash。然后,我使用 functools.reduce() 尝试做同样的事情。

import functools
import hashlib

def hash_two_strings(a,b):
  c = a + b
  h = hashlib.sha256(c.encode()).hexdigest()
  return h
  
c1 = ['3', 'sha256', 'C=US,O=Entrust', 'CN=review.mysite.com', '1c:08:ea:51', '2/11/2022', '2/11/2023', 'RSA', '2048']

h = hashlib.md5(c1[0].encode()).hexdigest()

for i in range(1, len(c1)):
  s = h+c1[i]
  h = hashlib.sha256(s.encode()).hexdigest()

print (h)

h = functools.reduce(lambda a, b: hash_two_strings, c1[1:], hashlib.sha256(c1[0].encode()).hexdigest())
print (h)

Output:2b9d651fee9c0ddc75477be6dba8d1d3600551cf2e355e9f4788d3c728d237a3 <函数 hash_two_strings 在 0x000001FF9B6A3E20>

但是,reduce() 似乎想要返回对我编写的 hash_two_strings() function 的引用,而不是我期望的实际 hash。 关于我如何错误地使用 reduce() 的任何想法,因为我看不到它。

有两种方法可以解决您的问题:

h = functools.reduce(hash_two_strings, c1[1:], hashlib.sha256(c1[0].encode()).hexdigest())
print (h)

或者:

h = functools.reduce(lambda a, b: hash_two_strings(a, b), c1[1:], hashlib.sha256(c1[0].encode()).hexdigest())

因为之前使用的lambda忽略了a,b arguments 并且只返回了hash_two_strings function object。

请记住,如果您在不带括号的情况下编写function ,则它只是一个 function object,而不是调用 function 的结果:

>>> def round_3_point_5(): return round(3.5)
... 
>>> round_3_point_5
<function round_3_point_5 at 0x7f04d347b700>
>>> round_3_point_5()
4
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM