Код не печатает набор при использовании карты () - PullRequest
2 голосов
/ 16 апреля 2019

Q: 1] Почему операторы print (с комментариями) приводят к print(mapped), чтобы не печатать набор?Если эти строки

# print(list(word))  
# print(list(palindrome))

не закомментированы, то в результате вы получите:

['N', 'u', 'r', 's', 'e', 's', 'r', 'u', 'n']
['n', 'u', 'r', 's', 'e', ​​'s', 'r', 'и ',' 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))

, результат будет следующим: zip результат: {('u',' u '), (' n ',' N '), (' s ',' s '), (' N ',' n '), (' e ',' e '), (' r',' r ')}
Приговор - палиндром.

1 Ответ

1 голос
/ 16 апреля 2019

генераторы и контейнеры

Генератор напоминает последовательность, так как оба являются повторяемыми.Но генератор предлагает свои значения только один раз, в то время как контейнер может быть опрошен многократно.

Вы зациклились на этом различии, и проблема началась в этой строке:

    palindrome = reversed(word)

Вы думаете об этом как: «О, у меня есть слово , которое я могу просмотреть, и каждый раз, когда я его вижу, оно будет одинаковым».Нет извините.Когда вы видите, что это что-то вроде:

<reversed object at 0x108ff7860>

, вместо этого вы должны думать «генератор».

Q1.После print(list(palindrome)), почему mapped пустой набор?

Поскольку list() исчерпал генератор.К тому времени, когда zip() попросил элементы, все они уже были израсходованы.

Q2.Почему в цикле for никогда не встречается ('N', 'n')?

Тот же ответ.2-й zip получает ноль предметов, так как 1-й zip уже истощил их.

Я понимаю, почему это "сумасшедшее" поведение может привести вас к некоторой путанице, и третий вопрос уже может быть на вашемгубы:

Q3.Почему reversed() ленив, почему он не просто вычисляет и сохраняет весь результат?

Что ж, в питон-лени лень - добродетель.Рассмотрим этот бит кода:

rev = reversed(very_long_sentence)
is_shouting = rev.startswith('!!')

Теперь startswith() нужно выполнить только пару сравнений символов.И reversed() даже не нужно проверять всю очень длинную строку, она может закончиться рано.Разрешить досрочное прекращение - это хорошо.Он может даже позволить нам работать с бесконечными генераторами, прекрасно зная, что из-за условия завершения мы не будем запрашивать все возможные значения.

исправление ошибки

В вашем случае, для этогоОсобый фрагмент кода, вы планируете просматривать перевернутое слово несколько раз.Чтобы справиться с этим, контейнер гораздо лучше подходит для ваших нужд.К счастью, все сгенерированные предметы просто хранить:

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

Таким образом, вместо генератора у вас есть str.

...