用python编写字符串和列表的通用函数

2024-05-29 02:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我是绿色的,从How to think like a computer scientist: Learn python 3学习编程。我能回答这个问题(见下文),但恐怕我错过了这节课。在

编写一个函数(称为insert_-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),他们是这样做的:

^{pr2}$

它似乎通过区分列表和字符串来解决问题。。。与暗示背道而驰。那么,有没有一种方法可以不加区分地回答这个问题(以及大约10个类似的问题)?i、 e未使用“type()”


Tags: to函数test版本序列learnatcomputer
3条回答

我的最大努力:

def insert_at_end(val, seq):
    t = type(seq)
    try:
        return seq + t(val)
    except TypeError:
        return seq + t([val])

这将尝试创建type(seq)的序列,如果val不可编辑,则生成一个列表并连接。在

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

  • +连接序列,但只连接相同类型的序列。在
  • 作为第一个参数传递给insert_at_end的值是“标量”,因此必须将它们转换为第二个参数所具有的序列类型。在
  • 为此,不能简单地用标量参数调用序列构造函数并创建该类型的一项序列:tuple(1)不起作用。在
  • str与其他序列类型不同:tuple(["a"])("a",)list(["a"])是{},但是{}是{},而不是{}。在

这使得+在这种情况下毫无用处,即使您可以轻松地构造一个给定类型的序列,而不需要instanceof,只需使用type()。在

也不能使用切片赋值,因为只有列表是可变的。在

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

我认为这个例子不是符号化的,这意味着它要求读者处理两种不同的情况:

  • 内景,列表
  • str,str

我认为,这项工作应该要求实现这一点:

  • 列表,列表:在结尾插入[5],[1,3,4,6])
  • str,str:在_end插入_('x','abc')

在这种情况下,读取器只需要处理两个使用相同序列类型的参数,提示将更有意义。在

相关问题 更多 >

    热门问题