这个Python高阶函数的输出是什么?

时间:2018-02-14 03:51:16

标签: python-3.x

这是我在查看家庭作业中的代码后自己生成的一个问题。

def compose(f,g):
    return lambda x: f(g(x))

def thrice(f):
    return compose(compose(f,f),f)

def add1(x):
    return x+1

似乎当我尝试compose(thrice,add1)(x),其中x是我决定使用的一些随机整数时,它每次都返回一个不同的内存位置。根据我自己对lambda演算的了解,上面的代码将减少到thrice(integer),但我不太清楚为什么会调用某个函数的内存位置,即使这样,为什么它总是在变化而且不一样一个?

1 个答案:

答案 0 :(得分:0)

Python不做lambda演算。 Lambda演算不涉及“记忆位置”的概念。你在混合理论与实践:)

调用compose将始终创建一个新的lambda,因为这是In [2]: id(lambda: 1) Out[2]: 4380732272 In [3]: id(lambda: 1) Out[3]: 4380642296 表达式的作用。即使你用相同的,不变的参数调用它,你也会得到一个不同的对象:

In [14]: id(256)
Out[14]: 4497541712
In [15]: id(256)
Out[15]: 4497541712

In [16]: id(257)
Out[16]: 4528835408
In [17]: id(257)
Out[17]: 4528833008

此外,即使你到达数字本身,两个相等的值只会共享cPython中的内存位置,如果它们是< = 256.上面的值会在需要时分配。

  public String DuplicatesTEST(String s) {
    Set<Character> set = new HashSet<>();
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
      set.add(s.charAt(i));
    }
    set.forEach(result::append);
    return result.toString();
  }