Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 17, 2014 03:14:31

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

И того вот что у меня вышло:

#coding: utf-8
import csv
def bible(a):
    if a == 'выход':
        exit()
    if a == 'меню':
        vibor()
    #a = raw_input('Введите запрос: ')
    reader = csv.reader(open("data.csv", "rb",),delimiter=';')
    name = 'По заданому запросу иформации не найдено'
    for x in reader:
        if len(x) == 3 and a == x[2]:
            name = x[0], x[1]
        elif len(x) == 3 and a == x[0]:
            name = x[1], x[2]
    
    print name
def writer(b):
    if b == 'выход':
        exit()
    if b == 'меню':
        vibor()
    writer = csv.writer(open('data.csv', 'a'), delimiter=';').writerow(raw_input('Внесите данные: ').split())
       
    
def vibor():
    v = raw_input('Выберите режим работы (внести, найти, выход): ')
    if v == 'внести':
        while not writer(raw_input('Внесите данные: ')):
            pass
    elif v == 'найти':
        while not bible(raw_input('Введите запрос: ')):
            pass
    else:
        exit()
vibor()

Меню работает отлично, возврать в меню из любой функции тоже работает, проблемму с пустыми строками вродь решил, но думаю , что можно более читабельно ресделать.

Возникли следующие проблеммы:
- при поиске выводит “не красивый” ответ,
Введите запрос: 4
('2', '3')
пытался сделать как было в моем первоначальном коде - нормлано не вышло.
- запись в файл получается со второго раза, точнее каждый втрой ввод - записывается в файл, побороть не смог.

Спасибо за предоставленную помощь и на деюсь на новую.

Офлайн

#2 Дек. 17, 2014 08:14:34

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

stasvoron
Возникли следующие проблеммы:
- при поиске выводит “не красивый” ответ,
или так:
    name = 'По заданому запросу иформации не найдено'
    for x in reader:
        if len(x) == 3 and a == x[2]:
            name = ' '.join(x[0], x[1])
        elif len(x) == 3 and a == x[0]:
            name = ' '.join(x[1], x[2])
    print name
или так:
    name = 'По заданому запросу иформации не найдено', ''
    for x in reader:
        if len(x) == 3 and a == x[2]:
            name = x[0], x[1]
        elif len(x) == 3 and a == x[0]:
            name = x[1], x[2]
    
    print ' '.join(name)
stasvoron
- запись в файл получается со второго раза, точнее каждый втрой ввод - записывается в файл, побороть не смог.
    csv.writer(open('data.csv', 'a'), delimiter=';').writerow(b.split())
и вот так делать нельзя!
    if b == 'меню':
        vibor()
вот так можно:
#coding: utf-8
import csv
def bible(a):
    if a == 'выход':
        exit()
    if a == 'меню':
        return True
    reader = csv.reader(open("data.csv", "rb",),delimiter=';')
    name = 'По заданому запросу иформации не найдено', ''
    for x in reader:
        if len(x) == 3 and a == x[2]:
            name = x[0], x[1]
        elif len(x) == 3 and a == x[0]:
            name = x[1], x[2]
    
    print ''.join(name)
def writer(b):
    if b == 'выход':
        exit()
    if b == 'меню':
        return True
    csv.writer(open('data.csv', 'a'), delimiter=';').writerow(b.split())
def vibor():
    v = raw_input('Выберите режим работы (внести, найти, выход): ')
    if v == 'внести':
        while not writer(raw_input('Внесите данные: ')):
            pass
    elif v == 'найти':
        while not bible(raw_input('Введите запрос: ')):
            pass
    else:
        exit()
while True: vibor()



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Дек. 17, 2014 08:33:28

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

Спасибо, по пробую, а можно с подробностятими почему нельзя и почему пишем именно так, а то я только учу python и новая информация очень полезна.
Спасибо.

Офлайн

#4 Дек. 17, 2014 08:48:38

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

stasvoron
а можно с подробностятими почему нельзя и почему пишем именно так
я не очень в объяснениях, эт пусть кто-то другой расскажет
ну вот попробуйте и сами поймете:
def a():
    b()
def b():
    a()
b()



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Дек. 17, 2014 08:49:04)

Офлайн

#5 Дек. 17, 2014 09:09:25

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

Консоль сразу выдаёт ошибку и это вродь логично, работает принцип очередности: типа неля в первом запустить второе, так как оно ещё не произошло в во времени, тогда возникает вопрос почему у меня работал возврат в меню?

Плюс здесь получается замкнутое кольцо, что не корректно, хотя это только мои догадки.

Отредактировано stasvoron (Дек. 17, 2014 09:12:08)

Офлайн

#6 Дек. 17, 2014 09:14:10

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

stasvoron
и это вродь логично
нет, вы не поняли. вам выдало вот это ошибку
RuntimeError: maximum recursion depth exceeded
вот и почитайте о ней.а ошибку у вас не выдавало потому что вы мало раз переходили в меню поиска, а если бы вы превысили максимальное значение, по умолчанию это
>>> sys.getrecursionlimit()
1000
то и вам выдало бы ошибку



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Дек. 17, 2014 09:17:36

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

stasvoron
Плюс здесь получается замкнутое кольцо, что не корректно, хотя это только мои догадки.
да, правильно, только не кольцо, а малек сложнее, но смысл похож. и это я просто убрал лишние строки, а теперь посмотрите на свой код, там такое же
def writer(b):
    if b == 'выход':
        exit()
    if b == 'меню':
        vibor() #------------- !!!
    writer = csv.writer(open('data.csv', 'a'), delimiter=';').writerow(raw_input('Внесите данные: ').split())
       
    
def vibor():
    v = raw_input('Выберите режим работы (внести, найти, выход): ')
    if v == 'внести':
        while not writer(raw_input('Внесите данные: ')): # ----------!!!!
            pass
и получается что когда мы выбираем меню, мы не возвращаемся в предыдущее меню, а создаем новое. как-то так…



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Дек. 17, 2014 09:19:16)

Офлайн

#8 Дек. 17, 2014 23:54:34

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

переделал код по вашим рекомендациям

#coding: utf-8
import csv
def bible(a):
    if a == 'выход':
        exit()
    if a == 'меню':
        return True        
    reader = csv.reader(open("data.csv", "rb",),delimiter=';')
    name = 'По заданому запросу иформации не найдено'
    for x in reader:
        if len(x) == 3 and a == x[2]:
            name = x[0], x[1]
        elif len(x) == 3 and a == x[0]:
            name =  x[2]
    print ' '.join(name) 
def writer(b):
    if b == 'выход':
        exit()
    if b == 'меню':
        return True        
    writer = csv.writer(open('data.csv', 'a'), delimiter=';').writerow(b.split())
       
def vibor():
    v = raw_input('Выберите режим работы (внести, найти, выход): ')
    if v == 'внести':
        while not writer(raw_input('Внесите данные: ')):
            pass
    elif v == 'найти':
        while not bible(raw_input('Введите запрос: ')):
            pass
    else:
        exit()
vibor()

запись идет отлично, чтение тоже, вот только теперь вместо возврата в меню, просто завершает программу.

Офлайн

#9 Дек. 18, 2014 00:13:07

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Не коректно работает код

да, забыл

while True: vibor()



————————————————
-*- Simple is better than complex -*-

Офлайн

#10 Дек. 18, 2014 00:39:56

stasvoron
Зарегистрирован: 2014-07-19
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не коректно работает код

с вовратом сделал, работает, спасибо
следующие проблеммы:
с этим кодом

    name = 'По заданому запросу иформации не найдено'
    for x in reader:
        if len(x) == 3 and a == x[2]:
            name = ' '.join(x[0], x[1])
        elif len(x) == 3 and a == x[0]:
            name = ' '.join(x[1], x[2])
    print name
выдает следующую ошибку
Введите запрос: 7
Traceback (most recent call last):
  File "bible.py", line 41, in <module>
    vibor()
  File "bible.py", line 36, in vibor
    while not bible(raw_input('Введите запрос: ')):
  File "bible.py", line 13, in bible
    name = ' '.join(x[0], x[1])
TypeError: join() takes exactly one argument (2 given)


с этим кодом
    name = 'По заданому запросу иформации не найдено', ''
    for x in reader:
        if len(x) == 3 and a == x[2]:
            name = x[0], x[1]
        elif len(x) == 3 and a == x[0]:
            name = x[1], x[2]
    
    print ' '.join(name)

при совпадении все работает, а вот если не нашло, то выдает следующее:

Введите запрос: 9
                                                                               

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version