在python中为字符串和列表编写通用函数

Dre*_*lee 7 python string list type-conversion

所以我像草一样绿色,学习如何像计算机科学家那样思考编程:学习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)**)
Run Code Online (Sandbox Code Playgroud)

本书给出了这样的提示:"这些练习很好地说明了序列抽象是通用的,(因为切片,索引和连接是如此通用),因此可以编写适用于所有序列类型的通用函数."

这个版本没有在线解决方案(我可以找到),但在我找到了某人对该文本的早期版本(对于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)
Run Code Online (Sandbox Code Playgroud)

这似乎是通过区分列表和字符串来解决问题......违背提示.那怎么样有没有办法回答这个问题(以及大约10个类似的问题)而没有区分?即不使用"type()"

900*_*000 1

不是一个解决方案,而是解释为什么真正优雅的解决方案看起来不可能。

  • +连接序列,但仅限相同类型的序列。
  • 作为第一个参数传递的值insert_at_end是“标量”,因此您必须将它们转换为第二个参数具有的序列类型。
  • 为此,您不能简单地使用标量参数调用序列构造函数并创建该类型的一项序列:tuple(1)不起作用。
  • str与其他序列类型的工作方式不同:tuple(["a"])is ("a",)list(["a"])is ["a"]、 but str(["a"]))is"['a']"和 not "a"

+即使您可以轻松地干净地构造给定类型的序列,而无需instanceof使用 ,这在这种情况下毫无用处type()

您也不能使用切片分配,因为只有列表是可变的。

在这种情况下,@Hamish 的解决方案看起来最干净。