2014-02-05 2 views
1

Это код, который я в данный момент:Для писем цикла нахождения программы

message = input("Enter a message: ") 
etimes = 0 
print("Your message is",len(message),"characters long") 

print("The most common letter in the english language, 'e', is ", end="") 
for letter in message: 
    if "e" or "E" in letter: 
     etimes += 1 

if "e" or "E" in message: 
    print("in your message", etimes, "times") 
else: 
    print("is not in your message") 

почему если то, что вы входите в message содержит «е» выход утверждает, что она имеет так много «е» 'S, как сообщение персонажи? Я приведу пример: , если я напишу сообщение «как вы», он ответит: «Ваше сообщение имеет 11 символов Наиболее распространенное письмо на английском языке« e »в вашем сообщении 11 раз»

Почему он не ответит: «Ваше сообщение 11 символов самое обычное письмо на английском языке,„е“, в вашем сообщении 1 раз»

Поскольку не

for letter in message: 
     if "e" or "E" in letter: 
      etimes += 1 

итерация через "как вы "один элемент (персонаж) за раз как таковой :?

letter = "h" 
letter = "o" 
letter = "w" 
letter = " " 
letter = "a" 
letter = "r" 
letter = "e" 
letter = " " 
letter = "y" 
letter = "o" 
letter = "u" 

Если это верно, то когда, letter = "e", должен быть единственный раз, когда

if "e" or "E" in letter: 

является true, правильно? Что означает, что etimes должен быть равен только одному?

+6

Существует встроенный метод подсчета подстрок: 'message.lower(). Count (" e ")'. –

ответ

3
for letter in message: 
    if "e" or "E" in letter: 
     etimes += 1 

изменить это:

for letter in message: 
    if letter.lower() == 'e': 
     etimes += 1 

Ваш код не удалось, потому что or заявление не читался, как вы думаете, что это.

if "e" or "E" in letter: 

прочитан переводчиком (в псевдокоде):

if 'e' exists OR if 'E' in letter: 

or more pseudo code 

if True or if 'E' in letter: 

А так, как or работ:

true or false = true # what your logic was producing 
true or true = true 
false or false = false 

Чтобы правильно использовать or вы должны явно указать сравнение каждого время:

if "e" in letter or "E" in letter: 

Именно поэтому при сравнении строк, если капитализация не имеет значения, «e» совпадает с «E», как в этом случае, лучше изменить регистр на все одинаковые с помощью lower() или upper(), чтобы вы не приходится сравнивать столько вещей.

+2

Не могли бы вы включить резюме того, как 'или' работает в Python, когда они помещаются между типами, такими как' str' (вместо значений 'boolean')? – SimonT

+0

Спасибо! Но не возражаете ли вы объяснить, почему исходный код у меня был неправильным? – justin

+0

@SimonT: "или" он работает как в любом другом языке. Это оператор для 2 val. Левое значение - «e», правильное значение - «E» в букве. Для устранения неоднозначности лучше всего использовать скобки: if ('e') или ('E' в письме) vs if ('e' в письме) или ('E' в письме). – cox

0

Проблема заключается в линии

if "e" or "E" in letter: 

условие действительно означает ("e") or ("E" in letter), что всегда верно, потому что не пустые строки считаются истинно в Python, и <true> or <anything> верно.

Правильное условие будет

if "e" in letter or "E" in letter 

Вот соответствующий раздел из Python reference:

В контексте логических операций, а также когда выражения используются управления операторы потока, следующие значения интерпретируются как ложные: False, None, числовой ноль всех типов и пустые строки и контейнеры (включая строки, кортежи, списки, словари, наборы и фризонсет). Все остальные значения интерпретируются как истинные.
...
Выражение x or y сначала оценивает x; if x is true, возвращается его значение ; в противном случае вычисляется y, и полученное значение равно .

Это определение or имеет еще одно следствие: результат "e" or "E" in letter фактически "e", не True. Но "e" интерпретируется как истинный, поэтому условие все еще выполняется.

Смежные вопросы