Q:1]为什么打印语句(注释)导致print(mapped)
不打印该设置?如果这些行
# print(list(word))
# print(list(palindrome))
未注释掉,则输出结果为:
['N','u','r','s','e','s','r','u','n']
['n','u','r','s','e','s','r','u','N']
The zipped result is : set()
句子是回文。
Q:2] N==n
为什么不失败?我以为它会在for
循环中失败。
def palindrome(word):
if ' ' in word:
word = word.replace(' ', '')
palindrome = reversed(word)
# print(list(word))
# print(list(palindrome))
mapped = zip(word, palindrome)
# converting values to print as set
mapped = set(mapped)
# printing resultant values
print("The zipped result is : ",end="")
print(mapped)
for letter, rev_letter in zip(word, palindrome):
if letter != rev_letter:
return 'Not Palindrome'
return 'Palindrome'
# Driver program to test sentencePalindrome()
s = "Nurses run"
if (palindrome(s)):
print ("Sentence is palindrome.")
else:
print ("Sentence is not palindrome.")
如果以下这些行被注释
# print(list(word))
# print(list(palindrome))
结果是:
压缩结果为:{('u','u'),('n','N'),('s','s'),('N','n'),('e' ,'e'),('r','r')}
句子是回文。
答案 0 :(得分:1)
生成器类似于序列,因为两者都是可迭代的。 但是生成器只提供一次其值, 同时可以反复询问一个容器。
您对这种区别很感兴趣, 麻烦开始了:
palindrome = reversed(word)
您认为它是,“哦,我有一个单词我可以查看, 每次查看时,它都是一样的。” 不好意思 当您看到它报告为以下内容时:
<reversed object at 0x108ff7860>
您应该改为使用“发电机”。
Q1。在
print(list(palindrome))
之后,为什么mapped
是空集?
因为list()
耗尽了生成器。
到zip()
询问元素时,所有元素都已被消耗。
Q2。为什么
for
循环永远不会遇到('N', 'n')
?
相同的答案。
第二个zip
获得零个物品,因为第一个zip
已经耗尽了它们。
我明白了为什么这种“疯狂”行为可能会使您感到困惑, 第三个问题可能已经在您的唇上:
Q3。为什么
reversed()
很懒,为什么不只计算和存储整个结果呢?
好吧,在python领域,懒惰是一种美德。 考虑一下这段代码:
rev = reversed(very_long_sentence)
is_shouting = rev.startswith('!!')
现在startswith()
只需要进行一对字符比较。
而且reversed()
甚至不必检查整个很长的字符串,
它可以提早终止。
允许提前终止是一件好事。
它甚至可以让我们在无限发电机上运行,
非常了解由于终止条款,我们不会要求所有可能的值。
对于您而言,对于这段特定的代码, 您计划多次查看反向单词。 为了解决这个问题,容器更适合您的需求。 幸运的是,存储所有生成的项目很简单:
palindrome = ''.join(reversed(word))
这样,您将拥有一个str
而不是生成器。