Q1
题目描述:
代码实现:
1 def coords(fn, seq, lower, upper): 2 """ 3 >>> seq = [-4, -2, 0, 1, 3] 4 >>> fn = lambda x: x**2 5 >>> coords(fn, seq, 1, 9) 6 [[-2, 4], [1, 1], [3, 9]] 7 """ 8 "*** YOUR CODE HERE ***" 9 #seq序列中的数字经过函数变化之后要在lower和upper的区间之中,否则就会被舍弃 10 #输出是以list的形式存在的 11 #所以我可以使用recursion 12 if not seq: 13 return [] 14 if fn(seq[0])>=lower and fn(seq[0])<=upper: 15 return [[seq[0],fn(seq[0])]]+coords(fn,seq[1:],lower,upper) 16 else: 17 return coords(fn,seq[1:],lower,upper) 18 #return [[x,f(x)] for x in seq if fn(x)>=lower and fn(x)<=upper]
分析:
别人的实现非常的简洁,以后我也可以这么做。
我的实现好像有漏洞,当list只有一个了的时候,seq[1:]会超出list范围,可能会引起报错。
Q2:
题目描述:
代码实现:
1 def riffle(deck): 2 """Produces a single, perfect riffle shuffle of DECK, consisting of 3 DECK[0], DECK[M], DECK[1], DECK[M+1], ... where M is position of the 4 second half of the deck. Assume that len(DECK) is even. 5 >>> riffle([3, 4, 5, 6]) 6 [3, 5, 4, 6] 7 >>> riffle(range(20)) 8 [0, 10, 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7, 17, 8, 18, 9, 19] 9 """ 10 "*** YOUR CODE HERE ***" 11 M=len(deck)//2 12 return [deck[k//2 + M*(k%2)] for k in range(len(deck))]
分析:
这个代码实现很巧妙。
第一个亮点就是 for k in range(len(deck)) 来进行记数,为后面判断奇偶做好准备。
第二个亮点就是注意到 10 11 12 13…… 其实就是0 1 2 3 加上中间值。用k//2来重复两次,太妙了。
标签:11,seq,deck,DECK,Lab,CS61A,len,05,fn From: https://www.cnblogs.com/xuenima/p/17135559.html