您的程序生成列表中所有索引和元素的笛卡尔积。它获取每个索引并使用列表中的元素生成所有字符串。另外,请注意,您应该只迭代到列表的长度,当您执行len(items) + 1 时,您实际上超出了列表的实际长度。
你只能使用第一个循环,像这样
>>> def my_enumerate(items):
... lista = []
... for num in range(len(items)):
... lista.append("({0}, {1})".format(num, items[num]))
... return lista
...
>>> my_enumerate(['dog', 'pig', 'cow'])
['(0, dog)', '(1, pig)', '(2, cow)']
你也可以使用简单的list comprehension,像这样
>>> def my_enumerate(items):
... return ["({0}, {1})".format(num, items[num]) for num in range(len(items))]
...
>>> my_enumerate(['dog', 'pig', 'cow'])
['(0, dog)', '(1, pig)', '(2, cow)']
注意 1: 在 Python 3.x 中,除非必要,否则不必使用格式字符串中的位置。所以,"({}, {})".format 就足够了。
注意2:如果你真的想返回元组,比如enumerate,那么你不应该使用字符串格式,而是像这样准备元组
>>> def my_enumerate(items):
... return [(num, items[num]) for num in range(len(items))]
...
>>> my_enumerate(['dog', 'pig', 'cow'])
[(0, 'dog'), (1, 'pig'), (2, 'cow')]
注意 3:如果你真的想模拟 enumerate 就像它在 Python 3.x 中一样,那么你最好使用生成器函数,像这样
>>> def my_enumerate(items):
... for num in range(len(items)):
... yield (num, items[num])
...
...
>>> my_enumerate(['dog', 'pig', 'cow'])
<generator object my_enumerate at 0x7f5ff7abf900>
>>> list(my_enumerate(['dog', 'pig', 'cow']))
[(0, 'dog'), (1, 'pig'), (2, 'cow')]
注4:更好的消息是,你可以写同样的my_enumerate,用yield from和generator expression,像这样
>>> def my_enumerate(items):
... yield from ((num, items[num]) for num in range(len(items)))
...
>>> my_enumerate(['dog', 'pig', 'cow'])
<generator object my_enumerate at 0x7f5ff7abfe10>
>>> list(my_enumerate(['dog', 'pig', 'cow']))
[(0, 'dog'), (1, 'pig'), (2, 'cow')]