g = lambda x:[lambda x:x*1, lambda x:x*x, lambda x:x*x*x, lambda x:42][x%4](x)
[g(x) for x in xrange(12)]
Run Code Online (Sandbox Code Playgroud)
这个序列的下一个值是什么?
你试过吗?
>>> g = lambda x:[lambda x:x*1, lambda x:x*x, lambda x:x*x*x, lambda x:42][x%4](x)
>>> [g(x) for x in xrange(12)]
[0, 1, 8, 42, 4, 25, 216, 42, 8, 81, 1000, 42]
Run Code Online (Sandbox Code Playgroud)
以下是每个值的计算方法:
[
0, # x is 0, x%4 is 0, so g(x) becomes (lambda x:x*1)(0) or 0*1
1, # x is 1, x%4 is 1, so g(x) becomes (lambda x:x*x)(1) or 1*1
8, # x is 2, x%4 is 2, so g(x) becomes (lambda x:x*x*x)(2) or 2*2*2
42, # x is 3, x%4 is 3, so g(x) becomes (lambda x:42)(3) or 42
4, # x is 4, x%4 is 0, so g(x) becomes (lambda x:x*1)(4) or 4*1
25, # x is 5, x%4 is 1, so g(x) becomes (lambda x:x*x)(5) or 5*5
216, # x is 6, x%4 is 2, so g(x) becomes (lambda x:x*x*x)(6) or 6*6*6
42, # x is 7, x%4 is 3, so g(x) becomes (lambda x:42)(7) or 42
8, # x is 8, x%4 is 0, so g(x) becomes (lambda x:x*1)(8) or 8*1
81, # x is 9, x%4 is 1, so g(x) becomes (lambda x:x*x)(9) or 9*9
1000, # x is 10, x%4 is 2, so g(x) becomes (lambda x:x*x*x)(10) or 10*10*10
42 # x is 11, x%4 is 3, so g(x) becomes (lambda x:42)(11) or 42
]
Run Code Online (Sandbox Code Playgroud)
基本上g(x)调用列表中的一个函数x作为参数,当在列表中进行调用时,xrange它将遍历函数,每个第四个调用都是相同的函数.
我知道这只是一个有助于理解Python的练习,但你应该注意到这是非常低效的代码,因为所有四个函数都是在每次调用时重新创建的g().如果你真的需要这种行为,最好只创建一个def包含多个if语句的函数(这将使代码更具可读性).
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |