Найти - Пользователи
Полная версия: Не коректно работает код
Начало » Python для новичков » Не коректно работает код
1 2 3 4
stasvoron
И того вот что у меня вышло:

#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')
пытался сделать как было в моем первоначальном коде - нормлано не вышло.
- запись в файл получается со второго раза, точнее каждый втрой ввод - записывается в файл, побороть не смог.

Спасибо за предоставленную помощь и на деюсь на новую.
terabayt
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()
stasvoron
Спасибо, по пробую, а можно с подробностятими почему нельзя и почему пишем именно так, а то я только учу python и новая информация очень полезна.
Спасибо.
terabayt
stasvoron
а можно с подробностятими почему нельзя и почему пишем именно так
я не очень в объяснениях, эт пусть кто-то другой расскажет
ну вот попробуйте и сами поймете:
def a():
    b()
def b():
    a()
b()
stasvoron
Консоль сразу выдаёт ошибку и это вродь логично, работает принцип очередности: типа неля в первом запустить второе, так как оно ещё не произошло в во времени, тогда возникает вопрос почему у меня работал возврат в меню?

Плюс здесь получается замкнутое кольцо, что не корректно, хотя это только мои догадки.
terabayt
stasvoron
и это вродь логично
нет, вы не поняли. вам выдало вот это ошибку
RuntimeError: maximum recursion depth exceeded
вот и почитайте о ней.а ошибку у вас не выдавало потому что вы мало раз переходили в меню поиска, а если бы вы превысили максимальное значение, по умолчанию это
>>> sys.getrecursionlimit()
1000
то и вам выдало бы ошибку
terabayt
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
и получается что когда мы выбираем меню, мы не возвращаемся в предыдущее меню, а создаем новое. как-то так…
stasvoron
переделал код по вашим рекомендациям
#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()

запись идет отлично, чтение тоже, вот только теперь вместо возврата в меню, просто завершает программу.
terabayt
да, забыл
while True: vibor()
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
выдает следующую ошибку
Введите запрос: 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
                                                                               
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