2013-11-06 2 views
-3

Я написал эту программу, чтобы можно было найти количество пар A/U и C/G от входа пользователя. Когда я запускаю его, он продолжает говорить «Недопустимый синтаксис», выделяя первое «else:» после кратковременного цикла while. Кто-нибудь знает, что мне нужно изменить, чтобы исправить это?Python: Почему он продолжает говорить недействительный синтаксис?

def main(): 

    first = input("Please enter the RNA sequence for which you wish to find the number of pairs. \nFirst line:") 
    second = input("Second String:") 

    a1base = first.count('A') 
    u1base = first.count('U') 
    c1base = first.count('C') 
    g1base = first.count('G') 
    a2base = second.count('A') 
    u2base = second.count('U') 
    c2base = second.count('C') 
    g2base = second.count('G') 

    while (a1base >= 1) and (u1base >= 1) or (a2base >= 1) and (u2base >= 1): 
     abases = (a1base+ a2base) 
     ubases = (u1base + u2base) 
     firstset = min(abases, ubases) 
     print("You have", firstset,"A/U bases.") 
     else: 
      print("You have zero A/U bases.") 

    while (c1base >= 1) and (g1base >= 1) or (c2base >= 1) and (g2base >= 1): 
     cbases = (c1base + c2base) 
     gbases = (g1base + g2base) 
     secondset = min(cbases, gbases) 
     print("You have", secondset,"C/G bases.") 
     else: 
      print("You have zero C/G bases.") 



main() 
+3

'Почему это твердят неверный синтаксис' => Обычно, потому что ваш синтаксис является недопустимым. В вашем случае ваш отступ в другом случае не соответствует, если, для или в то время. – njzk2

+0

В качестве побочного примечания, это не вопрос «стиль кодирования». Стиль кодирования заключается в выборе между различными законными способами написания или выкладки эквивалентного, действительного кода, а не написания действительного кода в первую очередь. – abarnert

ответ

3

У вас есть else:, не прикрепленные к любому if, for, while или try заявлению, что является незаконным.

Если вы имели в виду для else быть прикрепленным к while, решение простое: Изменение отступов, чтобы прикрепить ее:

while (a1base >= 1) and (u1base >= 1) or (a2base >= 1) and (u2base >= 1): 
    abases = (a1base+ a2base) 
    ubases = (u1base + u2base) 
    firstset = min(abases, ubases) 
    print("You have", firstset,"A/U bases.") 
else: 
    print("You have zero A/U bases.") 

См break and continue Statements, and else Clauses on Loops в учебнике (и Compound statements в справочнике языка для полной Детали).

+0

Но блок 'else' всегда будет вызываться в этом случае. Не имеет смысла. –

+0

@OlehPrypin Ваш плохо отложенный 'else' делает еще меньше смысла. – Hyperboreus

+0

@OlehPrypin: Правда, но пытаться угадать, что на самом деле пытался использовать OP, это игра в кружку. Возможно, он захотел сломаться после первой «печати», и в этом случае ему нужно добавить «break». Или, может быть, он хотел следить за тем, были ли какие-либо «печати», и только «else», если они не были, и в этом случае он злоупотребляет «else». Или, может быть, он хотел чего-то совершенно другого. Я понятия не имею, но в любом случае ему сначала нужно собрать код, прежде чем он сможет понять, что делать дальше. – abarnert

1

Ваши else потребности с отступом на том же уровне, что и ваш while, который на самом деле не имеет смысла в данном случае, потому что нет в вашем цикле не break, или вам нужно добавить if на некоторой линии перед ним.

0

Я вижу две очевидные вещи:

  1. Все после def main(): должны быть отступы;
  2. Else должен быть на том же уровне отступа, что и while. Это не ребенок, а родной брат while.
0

Другие уже объяснили эту ошибку.

Попробуйте изменить вам while петли на это:

abases = (a1base+ a2base) 
ubases = (u1base + u2base) 
firstset = min(abases, ubases) 
print("You have", firstset if firstset else 'zero',"A/U bases.") 

cbases = (c1base + c2base) 
gbases = (g1base + g2base) 
secondset = min(cbases, gbases) 
print("You have", secondset if secondset else 'zero',"C/G bases.") 

Без while или else:.

Также следующий фрагмент должен делать то же самое:?

first = input("Please enter the RNA sequence for which you wish to find the number of pairs. \nFirst line:") 
second = input("Second String:") 
bases = {k: (first + second).count(k) for k in 'AUCG'} 
print('You have', min(bases['A'], bases['U']), 'A/U bases.') 
print('You have', min(bases['C'], bases['G']), 'C/G bases.') 
Смежные вопросы