Week 3
2.2
1 | def pair(x, y): |
用函数定义 pair
的方式。
2.3
对解释器而言,下划线只是环境中的另一个名称,但对程序员具有约定俗成的含义,表示该名称不会出现在任何未来的表达式中。
以前乱用下划线很不规范。
1 | [<map expression> for <name> in <sequence expression> if <filter expression>] |
Lab 3
1 | checker = lambda x: False |
忽略 i
的范围,其实是用 lambda 更简洁地实现了筛法,得到的 checker
是 OR(x % p_i == 0)
。
需要注意的是 i
必须传值进去,如果内层调用则是地址,i
随循环改变后就会让 checker
出错。
Week 4
Q6
1 | (lambda g: lambda x: g(g, x))(lambda f, n: 1 if n == 1 else n * f(f, n - 1)) |
题目是不直接递归实现 lambda 阶乘函数。
巧妙的解法。lambda f, n
把函数自身传递到下一层避免了直接递归。而 f
本身未给定,单独后一个括号只是“循环论证”,故再通过 lambda g
调用它,让 g
作为形式函数代表 f
即可。