Найти - Пользователи
Полная версия: Обнуление атрибута функции
Начало » Python для новичков » Обнуление атрибута функции
1
Slasheg
Добрый день!

Столкнулся с такой проблемой: при написании скрипта транслитерации сделал проверку предыдущего символа (для того что бы такие слова, как например: пятно, писались не pyatno, а p'atno), но теперь при транслитерации нескольких слов появляется обратная неточность

Введите строку: Привет
Pr'iv'et
Введите строку: Ёлка
'Olka

def Translit(input_char):
    list_rus = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К',
                'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц',
                'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в',
                'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н',
                'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ',
                'ъ', 'ы', 'ь', 'э', 'ю', 'я']
    list_eng = ['A', 'B', 'V', 'G', 'D', 'YE', 'YO', 'J', 'Z', 'I', 'Y', 'K',
                'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C',
                'CH', 'SH', 'SCH', '', 'I', '\'', 'E', 'YU', 'YA', 'a', 'b',
                'v', 'g', 'd', 'ye', 'yo', 'j', 'z', 'i', 'y', 'k', 'l', 'm',
                'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh',
                'sch', '', 'i', '\'', 'e', 'yu', 'ya']
    list_rus_cons = ['Б', 'В', 'Г', 'Д', 'З', 'К', 'Л', 'М', 'Н', 'П', 'Р',
                     'С', 'Т', 'Ф', 'б', 'в', 'г', 'д', 'з', 'к', 'л', 'м',
                     'н', 'п', 'р', 'с', 'т', 'ф']
    list_rus_vowel = ['Е', 'Ё', 'Ю', 'Я', 'И', 'е', 'ё', 'ю', 'я', 'и']
    list_eng_vowel = ['\'E', '\'O', '\'U', '\'A', '\'I', '\'e', '\'o', '\'u',
                      '\'a', '\'i']
    try:
        prev_char = Translit.prev_char
    except AttributeError:
        prev_char = ''
    if input_char in list_rus_vowel:
        if prev_char in list_rus_cons:
            Translit.prev_char = input_char
            return str(list_eng_vowel[list_rus_vowel.index(input_char)])
    
    Translit.prev_char = input_char
    if input_char in list_rus:
        return str(list_eng[list_rus.index(input_char)])
    else:
        return input_char
    return output_char
input_string = input('Введите строку: ')
output_list = []
for input_char in input_string:
    output_list.append(Translit(input_char))
print(''.join(output_list))
input_string = input('Введите строку: ')
output_list = []
for input_char in input_string:
    output_list.append(Translit(input_char))
print(''.join(output_list))

Как тут лучше поступить, что бы не менять атрибуты функции не из нее?

Заранее спасибо!
doza_and
Транслитерация тема писаная избитая донельзя http://habrahabr.ru/post/137089/
https://pypi.python.org/pypi/pytils
https://pypi.python.org/pypi/trans
str(list_eng[list_rus.index(input_char)])
для длинных строк однозначно медленнее чем использование словаря.
Slasheg
что бы не менять атрибуты функции не из нее?
В не вижу где вы меняете снаружи.

В случае сложной логики, управляемой входным потоком данных можно использовать или конечный автомат или yield

def tr(seqv):
   translater=translater_default
   for ch in seqv:
       yield  translater(ch)
       if ch in some_set:
           translater=translater_default
       else:
           translater=translater_special
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