在codewars.com上,我遇到了以下任务:
创建一个
add在连续调用时将数字相加的函数.所以add(1)应该回来1,add(1)(2)应该回来1+2,......
虽然我熟悉Python的基础知识,但我从来没有遇到过能够连续调用的函数f(x),即可以被称为的函数f(x)(y)(z)....到目前为止,我甚至不确定如何解释这种表示法.
作为一个数学家,我怀疑f(x)(y)是分配到每个功能x的函数g_{x},然后返回g_{x}(y),同样也f(x)(y)(z).
如果这种解释是正确的,Python将允许我动态创建对我来说非常有趣的函数.我在网上搜索过去一小时,但未能找到正确方向的领先优势.因为我不知道如何调用这个编程概念,所以这可能不会太令人惊讶.
你如何称呼这个概念,我在哪里可以阅读更多相关信息?
为什么使用不同值初始化的范围在Python 3中相互比较?
当我在我的解释器中执行以下命令时:
>>> r1 = range(0)
>>> r2 = range(2, 2, 2)
>>> r1 == r2
True
Run Code Online (Sandbox Code Playgroud)
结果是True.为什么会这样?为什么range具有不同参数值的两个不同对象被视为相等?
我所做的显然不是人们想要做的事情,而是我只是在测试__hash__给定类的实现.
我想看看是否在字典中添加了一个虚假的'hashable'类,然后更改它的哈希值会导致它无法访问它.
我的班级看起来像这样:
class PhonyHash:
def __hash__(self):
val = list("A string")
return id(val) # always different
Run Code Online (Sandbox Code Playgroud)
在我的IPython控制台中执行以下操作:
>>> p = PhonyHash()
>>> d = { p: "a value"}
>>> hash(p) # changes hash
Run Code Online (Sandbox Code Playgroud)
然后尝试使用d[p]作品访问元素:
>>> d[p]
"a value"
Run Code Online (Sandbox Code Playgroud)
我明白,这不是应该做的事情,我真的很好奇为什么它有效.不dict使用hash()对象来存储/检索它?这为什么有效?
编辑:正如@VPfB在评论中所指出的sets那样,出于某种原因:
>>> p = PhonyHash()
>>> s = {p}
>>> p in s
False
Run Code Online (Sandbox Code Playgroud)