2016-06-05 3 views
1

Это небольшая программа, которая работает как арифметический калькулятор. Здесь я прочитал предыдущие вопросы, но все еще есть сомнения. В моем коде я использовал 'is' и not == в моем цикле while, но мой цикл не останавливается. Это неожиданно, потому что запрос переменной присваивается новым объектом, если пользователь нажимает «n» при запросе ввода. Буду признателен, если кто-то может взглянуть на код и помочь.Дополнительная информация о «==» и «is» в Python

def Add(x,y): 
    add = x+y 
    print("Answer:",add) 

def Sub(x,y): 
    sub = x-y 
    print("Answer:",sub) 

def Mult(x,y): 
    product = float(x*y) 
    print("Answer:",product) 

def Div(x,y): 
    if y!=0: 
     div=float(x/y) 
     print("Answer:",div) 
    else: 
     print("Invalid input!") 


ask='y' 
while(ask is 'y' or 'Y'): 

    x=float(input("\nEnter x:")) 
    y=float(input("Enter y:")) 

    print("\nCALCULATOR:") 
    print("\nPlease select any of the following options:") 
    print("1.Add") 
    print("2.Subtract") 
    print("3.Multiplication") 
    print("4.Division") 
    opt=int(input("\nYour option:")) 


    if(opt is 1): 
     Add(x,y) 

    elif(opt is 2): 
     Sub(x,y) 

    elif(opt is 3): 
     Mult(x,y) 

    elif(opt is 4): 
     Div(x,y) 

    else: 
     print("Invalid option!") 
    ask=input("\nDo you want to continue?(y/n or Y/N)") 
+0

это время цикла не останавливается, потому что 'что-нибудь или«y'' всегда 'true'. См. Здесь: http://stackoverflow.com/q/15112125/1639625 –

+0

Я верю, что 'while (ask in ['y', 'Y'])' это то, что вы ищете. Я считаю, что ваш текущий оператор оценивается: '(ask is 'y') или 'Y'', который всегда' True', за @tobias_k –

ответ

5

is сравнивает идентификатор объекта. Но есть много разных строковых объектов, которые имеют значение 'y'. Поэтому всегда сравнивайте с ==, если вы хотите сравнить значения.

Кроме того, or является булевой операцией на двух выражениях, а не лексической или.

Так условие должно быть:

while ask == 'y' or ask == 'Y': 
    ... 

или более компактны:

while ask in ['y', 'Y']: 
    ... 

или с помощью lower метода:

while ask.lower() == 'y': 
    ... 
+0

Это правильно, но просто для того, чтобы немного разъяснить: в Python, -пустая строка, преобразованная в boolean, оценивается как 'True'. Таким образом, ваше условие равно эквиваленту 'while (ask is 'y') или (True):'. – bjudson

+0

@bjudson: wrong, 'ask is 'y' или 'Y'' оценивает значение' True' (если 'ask' равно' 'y'') или' 'Y'' в противном случае. Теперь условие 'while' оценивается как логическое, поэтому' True' остается true или '' Y'' становится, наконец, 'True'. – Daniel

+0

Отредактированный комментарий, чтобы уточнить, я имел в виду строку для логического преобразования – bjudson

1

Как Даниил упоминает в своем отлично ответ, в Python, это для идентичности, а не для равенства. Если вы не знаете, что это значит, я дам краткое объяснение.

сравнивается, если две переменные ссылаются на один и тот же объект в памяти, а не на равные. Например

im_a_list = [1,2,3] 
im_a_similar_list = [1,2,3] 

теперь

im_a_list is im_a_similar_list 

будет Ложные, в то время как

im_a_list == im_a_similar_list 

является True. на otherhand, если у вас есть

im_a_list = im_seriously_the_same_list = [1,2,3] 

затем

im_a_list is im_seriously_the_same_list 

оценит Истинных