Форум сайта python.su
0
Написал небольшой генератор предложений - выдает предложение, на основе словарей. Код следующий:
import sys from PyQt4 import QtCore, QtGui from random import randint def Gen_from_dic (way): # Загрузка словарей dic_file = open (way, 'rt') # Считываем полученный словарь и закрываем dic_txt = dic_file .read() dic_file .close() # Определяем количество строк в словаре dic_line = len (dic_txt .splitlines()) # Генерируем случайные ключи str_rand = randint (2, dic_line) # Выделяем строку по ключу из файла str_txt = open (way, 'rt') .readlines() [str_rand] .decode ('utf-8') # Разделение на список spis = str_txt .split(';') # Вывод результата return spis def main(): # Определение пути словарей features_way = 'F:/src/generator/dic/features.txt' characters_way = 'F:/src/generator/dic/characters.txt' actions_way = 'F:/src/generator/dic/actions.txt' # Генерация списков features_spis_1 = Gen_from_dic (features_way) features_spis_2 = Gen_from_dic (features_way) characters_spis_1 = Gen_from_dic (characters_way) characters_spis_2 = Gen_from_dic (characters_way) actions_spis = Gen_from_dic (actions_way) # Проверка рода и присвоение слов if characters_spis_1[3] == u'он': while features_spis_1[3] <> u'он': features_spis_1 = Gen_from_dic (features_way) characters_word_1 = characters_spis_1[1] features_word_1 = features_spis_1[1] elif characters_spis_1[3] == u'она': while features_spis_1[3] <> u'она': features_spis_1 = Gen_from_dic (features_way) characters_word_1 = characters_spis_1[1] features_word_1 = features_spis_1[1] if characters_spis_2[3] == u'он': while features_spis_2[3] <> u'он': features_spis_2 = Gen_from_dic (features_way) characters_word_2 = characters_spis_2[1] features_word_2 = features_spis_2[1] elif characters_spis_2[3] == u'она': while features_spis_2[3] <> u'она': features_spis_2 = Gen_from_dic (features_way) characters_word_2 = characters_spis_2[1] features_word_2 = features_spis_2[1] actions_word = actions_spis[1] print features_word_1 + ' ' + characters_word_1 + ' ' + actions_word + features_word_2 + ' ' + characters_word_2 return 0 if __name__ == '__main__': main()
Message File Name Line Position
Traceback
<module> F:\src\generator\main_new.py 85
main F:\src\generator\main_new.py 53
Gen_from_dic F:\src\generator\main_new.py 33
IndexError: list index out of range
Message File Name Line Position
Traceback
<module> F:\src\generator\main_new.py 94
main F:\src\generator\main_new.py 80
UnboundLocalError: local variable 'features_word_1' referenced before assignment
Офлайн
88
str_rand = randint (2, dic_line - 1)
if characters_spis_1[3] == u'он': while features_spis_1[3] <> u'он': features_spis_1 = Gen_from_dic (features_way) characters_word_1 = characters_spis_1[1] features_word_1 = features_spis_1[1] elif characters_spis_1[3] == u'она': while features_spis_1[3] <> u'она': features_spis_1 = Gen_from_dic (features_way) characters_word_1 = characters_spis_1[1] features_word_1 = features_spis_1[1] else # задать значение по-дефолту
Отредактировано Shaman (Март 21, 2013 16:29:41)
Офлайн
0
ShamanВ таком случае последняя строка словоря не будет участвовать в генерации. И чем вызвана ошибка последний строки? Не понимаю.str_rand = randint (2, dic_line - 1)
ShamanСтранно, почему последняя строка дерективной структуры проверяется перед ее назначением в условии??? Опять же, вы даете совет включить “иначе” в условие, которое выполняется ПОСЛЕ проверки значения в последней строке. Не вижу смысла в этом вообще. К тому же, значения по умолчанию быть не может. Здесь скорее логичнее вывести сообщение об ошибке в словаре и прервать генерирование… Но с этим я пок ане разбирался.else # задать значение по-дефолту
if __name__ == '__main__': main()
print features_word_1 + ' ' + characters_word_1 + ' ' + actions_word + features_word_2 + ' ' + characters_word_2
Отредактировано caufman (Март 22, 2013 06:58:36)
Офлайн
88
Я не настаиваю на конкретных решениях, а просто указываю в каких местах можно решить проблему, суть которой, похоже, в некорректных данных.
Офлайн
0
ShamanДык и я не против решения как такового. Я пытаюсь понять, почему оно именно так, ведь по логике мне видется немного иначе. Если можете, поясните указанные мною моменты. Буду признателен.
Я не настаиваю на конкретных решениях, а просто указываю в каких местах можно решить проблему, суть которой, похоже, в некорректных данных.
Отредактировано caufman (Март 22, 2013 09:06:33)
Офлайн
0
на счет некорректных данных. во вложении пример одного из словарей.
Прикреплённый файлы:
features.txt (578 байт)
Офлайн
0
неужели никто не может объяснить, почему данная программа не работает? просто написать какой то код недостаточно. Объясните, почему не работает основной.
Офлайн
568
>>> Почему то ругается на то, что переменная выводится до ее определения
>>>local variable ‘features_word_1’ referenced before assignment
Переменная features_word_1 у вас определяется внутри if - elif блока, логично предположить, что если ни одно условие ветвления не выполнится, то и переменная не будет определена, о чем Вам и сообщает интерпретатор.
>>> Это периодическая ошибка функции randint()
>>>str_rand = randint (2, dic_line)
random.randint(a, b)
Return a random integer N such that a <= N <= b.
Чтобы уже не рассуждать о том, может ли у Вас b стать меньше или равно a, достаточно в коде сделать так
dic_line = len (dic_txt .splitlines()) print dict_line
Офлайн