Найти - Пользователи
Полная версия: программа генерации предложений (проблемы и предложения)
Начало » Python для новичков » программа генерации предложений (проблемы и предложения)
1
caufman
Написал небольшой генератор предложений - выдает предложение, на основе словарей. Код следующий:
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()
Так вот этот код выдает пару ошибок. которые я не совсем понимаю.
1. Это периодическая ошибка функции randint(). Как я понял из описания ошибки, задается неверный диапазон возможных значений, но в коде вроде однозначно определяется диапазон. Замечу сразу, что длинна словарей - более 5 строк. то есть диапазон (2, 1) задан быть не может (со второй строки, так как первая несет информационный характер). описание ошибки:
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
2. Это перманентная ошибка вывода результата. Почему то ругается на то, что переменная выводится до ее определения, хотя вывод стоит последним в программе. не понял примерных причин данного феномена. Описание ошибки:
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
Это фактически моя первая программа, так что жду ваших замечаний по логике.
Shaman
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
        # задать значение по-дефолту
caufman
Shaman
str_rand  = randint (2, dic_line - 1)
В таком случае последняя строка словоря не будет участвовать в генерации. И чем вызвана ошибка последний строки? Не понимаю.

Shaman
    else
        # задать значение по-дефолту
Странно, почему последняя строка дерективной структуры проверяется перед ее назначением в условии??? Опять же, вы даете совет включить “иначе” в условие, которое выполняется ПОСЛЕ проверки значения в последней строке. Не вижу смысла в этом вообще. К тому же, значения по умолчанию быть не может. Здесь скорее логичнее вывести сообщение об ошибке в словаре и прервать генерирование… Но с этим я пок ане разбирался.

### чуть позже
Запустил прогу в режиме дебага. После инициализации функций Gen_from_dic и main идет инициализация условия:
if __name__ == '__main__':
    main()
после считывания посленей строки которого, выполняется строка:
    print features_word_1 + ' ' + characters_word_1 + ' ' + actions_word + features_word_2 + ' ' + characters_word_2
кто то может объяснить, почему первой из основной функции выполняется строка вывода результата, находящаяся в конце кода???
Shaman
Я не настаиваю на конкретных решениях, а просто указываю в каких местах можно решить проблему, суть которой, похоже, в некорректных данных.
caufman
Shaman
Я не настаиваю на конкретных решениях, а просто указываю в каких местах можно решить проблему, суть которой, похоже, в некорректных данных.
Дык и я не против решения как такового. Я пытаюсь понять, почему оно именно так, ведь по логике мне видется немного иначе. Если можете, поясните указанные мною моменты. Буду признателен.
caufman
на счет некорректных данных. во вложении пример одного из словарей.
caufman
неужели никто не может объяснить, почему данная программа не работает? просто написать какой то код недостаточно. Объясните, почему не работает основной.
FishHook
>>> Почему то ругается на то, что переменная выводится до ее определения
>>>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
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