Форум сайта python.su
Решил заняться программированием и самообразование. Язык ранее изучал только в школе. Знания не сохранились, поэтому изучаю с нуля. Ну судите строго. Для самопроверки решил написать программку, которая имитирует общение официанта и заказчика. Сначала спрашивает: чего бы Вы желали и выводит заказ на экран, а потом предлагает, что есть в менб и дает выбрать.
При решении возникли трудности:
1. Не хочу чтобы в списке фигурировал None (при отказе от какого либо пункта меню). Можно ли при появлении в списке None уменьшать список до реального числа позиций?
2. При ошибочном вводе (yes/no) при составлении меню как вернуться к вопросу, на который выкидывается ошибка.
3. Насколько адекватен текст программы и на что следует обратить внимание.
Спасибо за комментарии
# first part - what would you like. your choice
print ( u"What would you like?" )
b = raw_input ( u"1: " )
c = raw_input ( u"2: " )
d = raw_input ( u"3: " )
a = [ b, c, d ]
print ( u"your order: "), a
# second part. menu choise
a = [ 'egg', 'bacon', 'milk' ]
print ( u"what do your prefer? ") , a
b = raw_input ( u"Do you like eggs? ")
if b in ( 'y', 'yes' ) :
a1 = a [ 0 ]
elif b in ( 'n', 'no', 'not' ) :
a1 = None
else :
print ( u"Wrong. Make a choise")
c = raw_input ( u"Do you like bacon? ")
if c in ( 'y', 'yes' ) :
a2 = a [ 1 ]
elif c in ( 'n', 'no', 'not' ) :
a2 = None
else :
print ( u"Wrong. Make a choise")
return [ c ]
d = raw_input ( u"Do you like milk? ")
if d in ( 'y', 'yes' ) :
a3 = a [ 2 ]
elif d in ( 'n', 'no', 'not' ) :
a3 = None
else :
print ( u"Wrong. Make a choise")
print ( u"Your order: "), [ a1 ] + [ a2 ] + [ a3 ]
Отредактировано (Авг. 4, 2011 11:19:59)
Офлайн
Привет, а у тебя какая версия Питона (2, 3)? И оформи код в теги, пожалуйста: твой код
Офлайн
Voroshekустановлен питон 2.7
Привет, а у тебя какая версия Питона (2, 3)? И оформи код в теги, пожалуйста: твой код
Офлайн
К сожалению, я не очень хорошо могу проверить на ошибки, поелику у меня 3. Но сразу видно, что после
c = raw_input()
print g
if c in ('n', 'no', 'not'):
a.remove('bacon')
Отредактировано (Авг. 4, 2011 12:12:27)
Офлайн
VoroshekСпасибо за ответ. Сейчас поковыряюсь =)
К сожалению, я не очень хорошо могу проверить на ошибки, поелику у меня 3. Но сразу видно, что послеперед if (а затем и перед elif) поставлен отступ - это неверно. Теперь по вопросам:c = raw_input()
1. Ты можешь создать пустой список “g” после списка а “и” при выборе блюда добавлять его в список “g” (а не присваивать переменным “а1”, “а2” и “а3”). Тогда в нём не будет None. А список “а” вообще превратить в кортеж и он станет неизменяемым. В этом случае последняя строчка должна выглядеть как-то так(поправь на ваш print).print g
Вообще идея присваивать значения куче переменных - не очень хорошая идея. Ты мог бы удалять значения из “а”в этом случае последний print должен возвращать список “а”.if c in ('n', 'no', 'not'):
a.remove('bacon')
Кстати, ты каждый раз повторяешь кортежи ('y', ‘yes’) и ('n', ‘no’, ‘not’). Я бы вынес их в отдельные списки, но мабуть в 2.7 так нельзя?
2. Уточни, пожалуйста, о какой ошибке ты говоришь:
- едок дал ответ, которого нет в списках(('y', ‘yes’) и ('n', ‘no’, ‘not’))
- едок передумал и хочет изменить заказ?
А вообще при запуске в командной строке ошибок не выдаёт?
* * *
Ну и наконец вот здесь http://python.su/forum/viewtopic.php?id=12205 мы обсуждали учебник по Питону (сам я прочитал его примерно на треть, так что не такой уж я и гуру :D)
if d in ( 'y', 'yes' ) :
a3 = a [ 2 ]
elif d in ( 'n', 'no', 'not' ) :
a3 = None
else :
print ( u"Wrong. Make a choise")
Офлайн
ПетрДовольно ощутимые различия. И программы написанные на этих версиях без переделки друг с другом не совместимы
1. А что больше отличие между 2.7 и 3.0 ??
ПетрКак-то так
что сделать, чтобы при вводе неустановленного значения происходил возврат к строчке с выбором ответа?
while True:
b = raw_input ( u"Do you like eggs? ")
if b in ( 'y', 'yes' ) :
a3 = a [ 2 ]
elif d in ( 'n', 'no', 'not' ) :
a3 = None
else :
print ( u"Wrong. Make a choise")
continue
break
Офлайн
Восопльзовался предоставленными советами. Всем спасибо =).
Код стал более читабельным и логичным. Единственно мне кажется, что немного грамоздким + не очень ясно как верно составить условие if - указал а=а, но это не верно и не несет смысловой нагрузки (хотя можно наверное притянуть за уши, что список “а” остается неизменным), а без него не работает. Может можно как-то условия объеденить?
Спасибо за терпение к новичку =)
# second part. menu choise
a = [ 'egg', 'bacon', 'milk' ]
soglasie = ( 'y', 'yes' )
otkaz = ( 'n', 'no', 'not' )
print ( u"what do your prefer? ") , a
while True :
b = raw_input ( u"Do you like eggs? ")
if b in soglasie :
a = a
elif b in otkaz :
a.remove ( "egg" )
else :
print ( u"Wrong. Make a choise")
continue
break
while True :
c = raw_input ( u"Do you like bacon? ")
if c in soglasie :
a = a
elif c in otkaz :
a.remove ( "bacon" )
else :
print ( u"Wrong. Make a choise")
continue
break
while True :
d = raw_input ( u"Do you like milk? ")
if d in soglasie :
a = a
elif d in otkaz :
a.remove ( "milk" )
else :
print ( u"Wrong. Make a choise")
continue
break
print ( u"Your order: "), a
Отредактировано (Авг. 4, 2011 15:40:02)
Офлайн
А я и забыл как-то, что у нас предустановлен 2.7
А сделать очень просто - удалить. Зачем тебе лишнее условие?
c = raw_input ( u"Do you like bacon? ")
if c in otkaz :
a.remove ( "bacon" )
elif c not in soglasie:
print ( u"Wrong. Make a choise")
continue
break
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a = [ 'egg', 'bacon', 'milk' ]
g = []
soglasie = ( 'y', 'yes' )
otkaz = ( 'n', 'no', 'not' )
print ( u"what do your prefer? ") , a
def vybor(e): # создаём функцию с аргументом "е"
while True :
vopros = "Do you like " + e + "?"
c = raw_input (vopros)
if c in soglasie:
g.append(e)
elif c not in otkaz:
print("Wrong. Make a choise!")
continue
break
for f in range(3):
vybor(a[f]) # аргумент е - это переменная из списка "а"
print ( u"Your order: "), g
Отредактировано (Авг. 4, 2011 19:35:15)
Офлайн
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Все же стоит дать переменным пнятные имена:
MENU_LIST= ['egg', 'bacon', 'milk']
#g = [] Лишние глобальные переменные лучше убрать
def vybor(order):
"""
Переносим списки согласие и отказ - сюда
и меняем немножко мункцию что-бы возвращала
заказ.
И я бы сделал словарь вместо списков.
"""
choices = {'yes': True, 'yep': True, 'y': True,
'n': False, 'no': False, 'not': False}
# генерацию вопроса лучше вынести из цикла, сейчас это безразлично
# но на будущее копейка рубль бережет
vopros = "Do you like " + order + "? "
while True :
try:
answer = choices[raw_input (vopros)]
# если ответа нет в словаре и произошла ошибка продолжаем цикл
except KeyError:
print("Wrong. Make a choise!")
continue
return order if answer else None
if __name__ == '__main__':
print ( u"what do your prefer? ") , MENU_LIST
order_list = []
# More pythonic list iteration
for order in MENU_LIST:
choice = vybor(order)
if choice:
order_list.append(order)
print ( u"Your order: "), order_list
Отредактировано (Авг. 5, 2011 14:19:49)
Офлайн