所以我像草一样绿,从How to think like a computer scientist: Learn python 3学习编程。我能够回答这个问题(见下文),但担心我错过了这一课。
编写一个函数(称为insert_at_end),该函数将为所有三个函数传递(返回前面给出的两个参数的粗体):
test(insert_at_end(5, [1, 3, 4, 6]), **[1, 3, 4, 6, 5]**)
test(insert_at_end('x', 'abc'), **'abcx'**)
test(insert_at_end(5, (1, 3, 4, 6)), **(1, 3, 4, 6, 5)**)
该书给出了这样的提示:“这些练习很好地说明了序列抽象是通用的(由于切片,索引和串联如此通用,所以很普遍),因此可以编写适用于所有序列类型的通用函数。”
这个版本没有在线解决方案(我可以找到),但是在其中我找到了某人对先前版本的文本(对于python 2.7)的答案,他们这样做是这样的:
def encapsulate(val, seq):
if type(seq) == type(""):
return str(val)
if type(seq) == type([]):
return [val]
return (val,)
def insert_at_end(val, seq):
return seq + encapsulate(val, seq)
这似乎是通过区分列表和字符串来解决问题的……违背了提示。那么如何解决这个问题(还有大约10个类似问题)而又没有区别呢?即不使用“type()”
最佳答案
这不是一个解决方案,而是一个解释,为什么看起来不可能有一个真正优雅的解决方案。
+
可连接序列,但只能连接相同类型的序列。 insert_at_end
的tuple(1)
不起作用。 str
与其他序列类型的工作方式不同:tuple(["a"])
是("a",)
,list(["a"])
是["a"]
,但是str(["a"]))
是"['a']"
而不是"a"
。 即使您仅使用
+
即可轻松地干净地构造给定类型的序列,而无需使用instanceof
,这也使得type()
变得毫无用处。您也不能使用切片分配,因为只有列表是可变的。
在这种情况下,@ Hamish的解决方案看起来最干净。