问:1]为什么打印语句(注释)导致print(mapped)
不打印该集合?如果那些线
# print(list(word))
# print(list(palindrome))
未注释掉,然后输出结果为:
['N','你','r','s','e','s','r','你','n']
['n','你','r','s','e','s','r','你','N']
The zipped result is : set()
句子是回文。
问: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')} 句子是回文。
生成器类似于序列,因为它们都是可迭代的。但是发电机只提供一次其值,而容器可以反复询问。
你已经挂断了这个区别,麻烦就在这一行开始了:
palindrome = reversed(word)
你在想它,“哦,我有一个词,我可以看到,每次我看,它都是一样的。”不,抱歉。当你看到它被报告为:
<reversed object at 0x108ff7860>
你应该考虑“发电机”。
Q1。在
print(list(palindrome))
之后,为什么mapped
是空集?
因为list()
耗尽了发电机。当zip()
询问元素时,所有元素都已被消耗掉了。
Q2。为什么
for
循环永远不会遇到('N', 'n')
?
答案相同。第二个zip
获得零项目,因为第一个zip
已经耗尽了他们。
我可以看出为什么这种“疯狂”的行为可能会让你产生一些困惑,而第三个问题可能就在你的嘴边:
Q3。为什么
reversed()
懒惰,为什么不只是计算和存储整个结果?
嗯,在蟒蛇之地,懒惰是一种美德。考虑一下这段代码:
rev = reversed(very_long_sentence)
is_shouting = rev.startswith('!!')
现在startswith()
只需进行一对角色比较。并且reversed()
甚至不必检查整个非常长的字符串,它可以提前终止。允许提前终止是一件好事。它甚至可以让我们对无限生成器进行操作,充分了解由于终止条款,我们不会要求所有可能的值。
在您的情况下,对于这个特定的代码,您计划多次查看反转的单词。为了解决这个问题,容器更适合您的需求。幸运的是,存储所有生成的项目很简单:
palindrome = ''.join(reversed(word))
这样,你有一个str
而不是发电机。