Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2011 10:23:04

Петр
От:
Зарегистрирован: 2011-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

Решил заняться программированием и самообразование. Язык ранее изучал только в школе. Знания не сохранились, поэтому изучаю с нуля. Ну судите строго. Для самопроверки решил написать программку, которая имитирует общение официанта и заказчика. Сначала спрашивает: чего бы Вы желали и выводит заказ на экран, а потом предлагает, что есть в менб и дает выбрать.
При решении возникли трудности:
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 Авг. 4, 2011 11:13:06

Voroshek
От:
Зарегистрирован: 2011-03-11
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

Привет, а у тебя какая версия Питона (2, 3)? И оформи код в теги, пожалуйста: твой код



python3 openSUSE-43Leap

Офлайн

#3 Авг. 4, 2011 11:20:48

Петр
От:
Зарегистрирован: 2011-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

Voroshek
Привет, а у тебя какая версия Питона (2, 3)? И оформи код в теги, пожалуйста: твой код
установлен питон 2.7
с кодом работаю через notepad ++, реализация в командной строке



Офлайн

#4 Авг. 4, 2011 12:02:21

Voroshek
От:
Зарегистрирован: 2011-03-11
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

К сожалению, я не очень хорошо могу проверить на ошибки, поелику у меня 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)



python3 openSUSE-43Leap

Отредактировано (Авг. 4, 2011 12:12:27)

Офлайн

#5 Авг. 4, 2011 12:20:00

Петр
От:
Зарегистрирован: 2011-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

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")
что сделать, чтобы при вводе неустановленного значения происходил возврат к строчке с выбром ответа?



Офлайн

#6 Авг. 4, 2011 13:50:39

shep
От:
Зарегистрирован: 2011-07-02
Сообщения: 19
Репутация: +  2  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

Петр
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



Офлайн

#7 Авг. 4, 2011 15:39:04

Петр
От:
Зарегистрирован: 2011-08-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

Восопльзовался предоставленными советами. Всем спасибо =).
Код стал более читабельным и логичным. Единственно мне кажется, что немного грамоздким + не очень ясно как верно составить условие 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)

Офлайн

#8 Авг. 4, 2011 17:14:13

Voroshek
От:
Зарегистрирован: 2011-03-11
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

А я и забыл как-то, что у нас предустановлен 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



python3 openSUSE-43Leap

Отредактировано (Авг. 4, 2011 19:35:15)

Офлайн

#9 Авг. 5, 2011 14:11:15

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите новичку (третий день)

#!/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



Отредактировано (Авг. 5, 2011 14:19:49)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version