一个复杂的Python例外

2024-09-28 21:42:10 发布

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

stmt = "Iomrscr yn wore"
mix  = "C'r eotrA,snep!"
for i in range(0, len(stmt), 2):
    stmt = stmt[:i] + mix[i] + stmt[i + 1:]

    print stmt

我知道这个问题的答案。但是,我不知道这是怎么回事。有人能帮你解释一下你是怎么读这段代码的吗?泰铢


Tags: 答案代码inforlenrangeprintmix
2条回答

我认为从内而外解释比较容易

    stmt = stmt[:i] + mix[i] + stmt[i + 1:]
  • stmt[:i]是字符串的开始,直到但不包括偏移量i(因此字符串的头部不会改变
  • mix[i]是另一个字符串中偏移量i的字符
  • stmt[i+1:]是字符串的其余部分,从i之后的偏移量到结尾(因此字符串的尾部不会改变

所以总的来说,这意味着“创建一个新字符串,与旧字符串相同,但是在偏移量i处替换mix中的相应字符”。在

那么我们这样做是为了抵消什么呢?在

它被称为循环

^{pr2}$

范围(a,b,c)生成一系列数字:a,a+c,a+2c,a+3c。。。a+Nc<;b

Python字符串的索引从0开始-第一个字符是stmt[0]-len(string)是字符串中的字符数,因此最后一个字符是stmt[len(stmt)-1]。所以这个循环给i的值是(0,2,4,6…),但不包括第一个太高的索引。实际上,循环说“交换第一个字符、第三个字符和第五个字符。。。尽可能多的字符而不离开字符串的末尾”。在

更直接的写作方式是

stmt = "Iomrscr yn wore"
mix  = "C'r eotrA,snep!"

print ''.join(d[i%2] for i,d in enumerate(zip(mix,stmt)))

它说“将mix和stmt中的字符配对,索引它们,当索引为偶数时从mix中提取一个字母,当索引为奇数时从stmt中提取一个字母;然后将所有字符重新连接到一个字符串中并打印它”。在

让我给你讲讲:

stmt = "Iomrscr yn wore"
mix  = "C'r eotrA,snep!"

这两行简单地定义了两个字符串。在

for i in range(0, len(stmt), 2):

for语句对{}创建的数组中的i的每个值进行循环。重要的是,range()调用中的最后2个表示只每隔一个数取一次,即0、2、4、6。。。最多len(stmt)。在

^{pr2}$

这一行表示将stmt中的所有内容都带到索引i,从mix添加索引i处的项,然后从索引i + 1开始,将所有内容从索引i + 1添加到末尾。使用方括号表示一个段,可以使用someArray[from:to]的形式。它也适用于本例中的字符串,我相信它也适用于元组和字典。如果不提供from,那么它从0索引开始,如果不提供to,它会一直到最后。注意,to不包括在内。在

重要的是,记住你的范围是所有其他指数;0,2,4,6。。。因此,第一次循环时,将i替换为它的实际值:

stmt = stmt[:0] + mix[0] + stmt[0 + 1:]

第二次你将有:

stmt = stmt[:2] + mix[2] + stmt[2 + 1:]

如果您实际将stmtmix替换为我们在第二个循环中看到的子字符串(请注意,我已经对第一个循环进行了替换):

stmt = "Co" + "r" + "rscr yn wore"

你能看到你最终会用混合中的每一个字母替换stmt中的每一个字母吗?在

相关问题 更多 >