使用Map()时代码不打印设置

问题描述 投票:2回答:1

问: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')} 句子是回文。

python-3.x string palindrome
1个回答
1
投票

generators & containers

生成器类似于序列,因为它们都是可迭代的。但是发电机只提供一次其值,而容器可以反复询问。

你已经挂断了这个区别,麻烦就在这一行开始了:

    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()甚至不必检查整个非常长的字符串,它可以提前终止。允许提前终止是一件好事。它甚至可以让我们对无限生成器进行操作,充分了解由于终止条款,我们不会要求所有可能的值。

fixing the bug

在您的情况下,对于这个特定的代码,您计划多次查看反转的单词。为了解决这个问题,容器更适合您的需求。幸运的是,存储所有生成的项目很简单:

palindrome = ''.join(reversed(word))

这样,你有一个str而不是发电机。

© www.soinside.com 2019 - 2024. All rights reserved.