是的,你的功能会通过添加[2:]
在那里得到改进,但它也可能与丢失range(len(original))
. 每当你发现自己在写作range(len(something))
时,你应该退后一步,想想你真正想要做什么。
在这种情况下,您正在寻找字符串中的字符,并且您可以使用for x in string
. 考虑到这些想法,这是一个稍微改进的版本:
def expand(original):
var = ""
symbols = original[:2]
for digit in original[2:]:
var += (digit + symbols)
return var
这可以防止您在输出的开头得到奇怪的符号混合,但它仍然不完美:
>>> expand('+*1234')
'1+*2+*3+*4+*'
我们需要找到一种方法
- 交替使用符号,并且
- 将它们留在字符串的末尾。
我们可以使用itertools.cycle来处理其中的第一个,并使用字符串切片来处理第二个:
from itertools import cycle
def expand(original):
var = ""
symbols = cycle(original[:2])
for digit in original[2:]:
var += (digit + next(symbols))
return var[:-1]
这行得通,但在某些时候,有人会告诉你不应该使用+
或+=
构建字符串,因为它效率低下。如果我们改为构建一个列表,然后使用str.join()
将其转换为字符串,我们可以稍微改进一下:
from itertools import cycle
def expand(original):
chars = []
symbols = cycle(original[:2])
for digit in original[2:]:
chars.extend([digit, next(symbols)])
return "".join(chars[:-1])
但是,我们可以做得更好。不必next(symbols)
每次都调用,我们可以使用一次zip()
获取下一个符号和下一个数字:
from itertools import cycle
def expand(original):
chars = []
for symbol, digit in zip(cycle(original[:2]), original[2:]):
chars.extend([digit, symbol])
return "".join(chars[:-1])
...这可能就足够了:-)
编辑:由于在对另一个答案的评论中,您说您不允许从标准库中导入任何内容(IMO 的一个相当愚蠢的限制,但确实存在),您可以使用cycle()
链接中描述的 Python 实现在这个答案的前面:
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
...但是您可能必须准备好让您的老师相信您理解它,这意味着您需要理解yield关键字。