Найти - Пользователи
Полная версия: Помогите новичку (третий день)
Начало » Python для новичков » Помогите новичку (третий день)
1
Петр
Решил заняться программированием и самообразование. Язык ранее изучал только в школе. Знания не сохранились, поэтому изучаю с нуля. Ну судите строго. Для самопроверки решил написать программку, которая имитирует общение официанта и заказчика. Сначала спрашивает: чего бы Вы желали и выводит заказ на экран, а потом предлагает, что есть в менб и дает выбрать.
При решении возникли трудности:
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 ]
Voroshek
Привет, а у тебя какая версия Питона (2, 3)? И оформи код в теги, пожалуйста: твой код
Петр
Voroshek
Привет, а у тебя какая версия Питона (2, 3)? И оформи код в теги, пожалуйста: твой код
установлен питон 2.7
с кодом работаю через notepad ++, реализация в командной строке
Voroshek
К сожалению, я не очень хорошо могу проверить на ошибки, поелику у меня 3. Но сразу видно, что после
c = raw_input()
перед if (а затем и перед elif) поставлен отступ - это неверно. Теперь по вопросам:
1. Ты можешь создать пустой список “g” после списка а “и” при выборе блюда добавлять его в список “g” (а не присваивать переменным “а1”, “а2” и “а3”). Тогда в нём не будет None. А список “а” вообще превратить в кортеж и он станет неизменяемым. В этом случае последняя строчка должна выглядеть как-то так
print g
(поправь на ваш print).
Вообще идея присваивать значения куче переменных - не очень хорошая идея. Ты мог бы удалять значения из “а”
if c in ('n', 'no', 'not'):
a.remove('bacon')
в этом случае последний print должен возвращать список “а”.
Кстати, ты каждый раз повторяешь кортежи ('y', ‘yes’) и ('n', ‘no’, ‘not’). Я бы вынес их в отдельные списки, но мабуть в 2.7 так нельзя?
2. Уточни, пожалуйста, о какой ошибке ты говоришь:
- едок дал ответ, которого нет в списках(('y', ‘yes’) и ('n', ‘no’, ‘not’))
- едок передумал и хочет изменить заказ?
А вообще при запуске в командной строке ошибок не выдаёт?
* * *
Ну и наконец вот здесь http://python.su/forum/viewtopic.php?id=12205 мы обсуждали учебник по Питону (сам я прочитал его примерно на треть, так что не такой уж я и гуру :D)
Петр
Voroshek
К сожалению, я не очень хорошо могу проверить на ошибки, поелику у меня 3. Но сразу видно, что после
c = raw_input()
перед if (а затем и перед elif) поставлен отступ - это неверно. Теперь по вопросам:
1. Ты можешь создать пустой список “g” после списка а “и” при выборе блюда добавлять его в список “g” (а не присваивать переменным “а1”, “а2” и “а3”). Тогда в нём не будет None. А список “а” вообще превратить в кортеж и он станет неизменяемым. В этом случае последняя строчка должна выглядеть как-то так
print g
(поправь на ваш print).
Вообще идея присваивать значения куче переменных - не очень хорошая идея. Ты мог бы удалять значения из “а”
if c in ('n', 'no', 'not'):
a.remove('bacon')
в этом случае последний print должен возвращать список “а”.
Кстати, ты каждый раз повторяешь кортежи ('y', ‘yes’) и ('n', ‘no’, ‘not’). Я бы вынес их в отдельные списки, но мабуть в 2.7 так нельзя?
2. Уточни, пожалуйста, о какой ошибке ты говоришь:
- едок дал ответ, которого нет в списках(('y', ‘yes’) и ('n', ‘no’, ‘not’))
- едок передумал и хочет изменить заказ?
А вообще при запуске в командной строке ошибок не выдаёт?
* * *
Ну и наконец вот здесь http://python.su/forum/viewtopic.php?id=12205 мы обсуждали учебник по Питону (сам я прочитал его примерно на треть, так что не такой уж я и гуру :D)
Спасибо за ответ. Сейчас поковыряюсь =)
1. А что больше отличие между 2.7 и 3.0 ??
2. Ошибок в командной строке нет. Я имею в виду:
if d in ( 'y', 'yes' ) : 
a3 = a [ 2 ]
elif d in ( 'n', 'no', 'not' ) :
a3 = None
else :
print ( u"Wrong. Make a choise")
что сделать, чтобы при вводе неустановленного значения происходил возврат к строчке с выбром ответа?
shep
Петр
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
Voroshek
А я и забыл как-то, что у нас предустановлен 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
Конечно, программа очень громоздка. Но у нас есть возможность создать функцию и сократить в 3 раза (извини, но я вернулся к идее со списком “g”)
#!/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
pill
#!/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
словари: http://docs.python.org/tutorial/datastructures.html#dictionaries
try-except: http://docs.python.org/tutorial/errors.html#handling-exceptions
if __name__ … http://pyfaq.infogami.com/tutor-what-is-if-name-main-for
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB