Уведомления

Группа в Telegram: @pythonsu

#1 Март 21, 2013 16:16:30

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

программа генерации предложений (проблемы и предложения)

Написал небольшой генератор предложений - выдает предложение, на основе словарей. Код следующий:

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

Офлайн

#2 Март 21, 2013 16:29:04

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

программа генерации предложений (проблемы и предложения)

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)

Офлайн

#3 Март 22, 2013 06:28:59

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

программа генерации предложений (проблемы и предложения)

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
кто то может объяснить, почему первой из основной функции выполняется строка вывода результата, находящаяся в конце кода???

Отредактировано caufman (Март 22, 2013 06:58:36)

Офлайн

#4 Март 22, 2013 07:35:48

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

программа генерации предложений (проблемы и предложения)

Я не настаиваю на конкретных решениях, а просто указываю в каких местах можно решить проблему, суть которой, похоже, в некорректных данных.

Офлайн

#5 Март 22, 2013 09:03:33

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

программа генерации предложений (проблемы и предложения)

Shaman
Я не настаиваю на конкретных решениях, а просто указываю в каких местах можно решить проблему, суть которой, похоже, в некорректных данных.
Дык и я не против решения как такового. Я пытаюсь понять, почему оно именно так, ведь по логике мне видется немного иначе. Если можете, поясните указанные мною моменты. Буду признателен.

Отредактировано caufman (Март 22, 2013 09:06:33)

Офлайн

#6 Март 22, 2013 09:07:05

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

программа генерации предложений (проблемы и предложения)

на счет некорректных данных. во вложении пример одного из словарей.

Прикреплённый файлы:
attachment features.txt (578 байт)

Офлайн

#7 Апрель 1, 2013 07:33:41

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

программа генерации предложений (проблемы и предложения)

неужели никто не может объяснить, почему данная программа не работает? просто написать какой то код недостаточно. Объясните, почему не работает основной.

Офлайн

#8 Апрель 1, 2013 08:42:31

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

программа генерации предложений (проблемы и предложения)

>>> Почему то ругается на то, что переменная выводится до ее определения
>>>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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version