使用Map()时代码不打印集合

时间:2019-04-16 02:09:20

标签: python-3.x string palindrome

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

1 个答案:

答案 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而不是生成器。