Advertisement
oleh_korkh

Untitled

Jan 3rd, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.47 KB | None | 0 0
  1. """ Бажано не вставляти імпорти інших модулів "про всяк випадок",
  2. якщо вони по факту не використовуються.
  3. """
  4. from itertools import groupby
  5.  
  6.  
  7. """ При іменуванні функцій бажано використовувати імена які вказують
  8. на дію. В даному випадку краще використовувати щось типу get_vocabulary.
  9. Ідентифікатори типу vocabulary (іменник, а не дієслово) більше
  10. підходять для змінних.
  11. """
  12. def vocabulary():
  13.     with open('word.txt') as file:
  14.         """ Наступний рядок демонструє цікаву річ - об'єкт file
  15.        вміє працювати з циклом for і в даному випадку він неявно
  16.        оброблюється як file.readlines()
  17.        Так писати цілком допустимо. А от переприсвоювати отриманий список
  18.        слів назад змінній, яка містить вказівник на файл, не правильно.
  19.        Це не є помилкою з точки зору Пітона, але різко
  20.        збільшує складність пошуку помилок.
  21.        """
  22.         file = [line.strip() for line in file]
  23.         # print(file)
  24.         """ У рядку вище ми згенерували список слів. Абсурдно використовувати
  25.        для списка метод .split()
  26.        """
  27.         words = file.split()
  28.         for word in words:
  29.             """ Змінна temp обнулюється при кожному проході цикла.
  30.            Тобто всі результати його заповнення, крім як для останнього
  31.            проходу цикла будуть втрачені.
  32.            """
  33.             temp = []
  34.             for word in words:
  35.                 """ Тут ми в середині одного цикла вставляємо ще один точно
  36.                такий же цикл з аналогічними управляючими змінними. Це
  37.                не має сенсу.
  38.                """
  39.                 temp.append(word)
  40.         return temp
  41.  
  42. """ Насправді вся функція завантаження словника може виглядати так:
  43.  
  44. def get_vocabulary():
  45.    with open('words.txt') as f:
  46.        return [x.strip() for x in f]
  47.  
  48. Все
  49. """
  50.  
  51.  
  52. def read():
  53.     with open('input.txt') as file:
  54.         # mylist = f.readlines()
  55.         """ Метод .rstrip('\n') прибирає лише символи переносу рядка з
  56.        правої частини. Втім, для файла створеного на платформі Windows
  57.        в кінці кожного рядка буде знаходитись пара символів '\r\n'. Краще,
  58.        по можливості, писати кросплатформенний код. Таким чином, використання
  59.        просто .strip() є бажанішим.
  60.        """
  61.         mylist = [line.rstrip('\n') for line in file]
  62.         # print(mylist)
  63.         for i, line in enumerate(mylist):
  64.             """ Не бачу сенсу у використанні enumerate
  65.            """
  66.             # punctuation = ['.',',',':',';','!','?','(',')']
  67.             line = line.lower()
  68.             line = line.replace('.','')
  69.             line = line.replace(',','')
  70.             line = line.replace('-',' ')
  71.             """ Код вище можна було б записати так:
  72.  
  73.            line = line.lower().replace('.','').replace(',','').replace('-','')
  74.            """
  75.             words = line.split()
  76.             """ Далі йде аналогічна незрозуміла мені конструкція з двох
  77.            однакових вкладених циклів. Не розумію, що малося на увазі.
  78.            """
  79.             for word in words:
  80.                 temp = []
  81.                 for word in words:
  82.                     temp.append(word)
  83.  
  84.             """ Даний return знаходиться в середині цикла for, відповідно
  85.            при першому ж проході функція завершиться в даному місці. Можливо
  86.            тут є помилка з відступами, але не схоже, що це виправить загальну
  87.            ситуацію.
  88.            """
  89.             return temp
  90.  
  91.             # print(i, line, '\n')
  92.             """ Наступний рядок ніколи не виконається, бо перед ним стоїть return
  93.            """
  94.             print(temp, '\n')
  95.  
  96. """ Насправді вищенаведену функцію, якщо є бажання одразу бити на слова,
  97. можна було б переписати якось так:
  98.  
  99. def read():
  100.    with open('input.txt') as f:
  101.        return [
  102.            x.strip().lower().replace('.','').replace(',','').replace('-','').split()
  103.            for x in f]
  104.  
  105. Така функція поверне список рядків де кожен рядок буде
  106. представляти список слів.
  107. """
  108.  
  109.  
  110. def soundex(word):
  111.  
  112.     w_input = word
  113.     code = ""
  114.     w_input = w_input.upper()
  115.     code = code + w_input[0]
  116.     """ Немає сенсу в конкатенації з завідомо пустим рядком. Можна одразу
  117.    писати
  118.    code = w_input[0]
  119.    """
  120.     """
  121.    Далі, цикл for правильніше було б оформити так:
  122.  
  123.    for nextletter in w_input[1:]:
  124.    """
  125.     for i in range (1, len(w_input)):
  126.         nextletter = w_input[i]
  127.  
  128.         """ Перевірка входження символа в набор зручніше б виглядала як
  129.        if nextletter in 'BFPV':
  130.        """
  131.         if nextletter in ['B','F','P','V']:
  132.             """ Наступний рядок може виглядати так:
  133.            code += '1'
  134.            """
  135.             code = code + '1'
  136.  
  137.         elif nextletter in ['C','G','J','K','Q','S','X','Z']:
  138.             code = code + '2'
  139.  
  140.         elif nextletter in ['D','T']:
  141.             code = code + '3'
  142.  
  143.         elif nextletter in ['L']:
  144.             code = code + '4'
  145.  
  146.         elif nextletter in ['M','N']:
  147.             code = code + '5'
  148.  
  149.         elif nextletter in ['R']:
  150.             code = code + '6'
  151.  
  152.     """ Наскільки я бачу, тут функція soundex реалізує дещо спрощений
  153.    варіант алгоритму soundex. З метою прискорення розробки, це має сенс.
  154.    Втім обмеження довжини кода або підгонку його під необхідну довжину,
  155.    потрібно було б дописати. Якось так:
  156.  
  157.    return code[:4].ljust(4, '0')
  158.    """
  159.  
  160.     return code
  161.  
  162.  
  163. """ Не потрібно називати функцію словом function. Назва функції повинна
  164. нести смислове навантаження. Сама ж функція, наскільки я бачу, просто
  165. виводить тестову інформацію в термінал.
  166. """
  167. def function():
  168.     for word in read():
  169.         # print(word)
  170.         w = soundex(word)
  171.         print(word, w)
  172.  
  173.     for word in vocabulary():
  174.         # print(word)
  175.         voc_w = soundex(word)
  176.         print(word, w)
  177.  
  178.     return voc_w
  179.  
  180. function()
  181. # read()
  182. # vocabulary()
  183.  
  184.  
  185. """ Можливо був би сенс написати щось таке:
  186.  
  187. def check():
  188.    words = get_vocabulary()
  189.    suggestions = {}
  190.    for w in words:
  191.        code = soundex(w)
  192.        if code in suggestions:
  193.            suggestions[code].append(w)
  194.        else:
  195.            suggestions[code] = [w]
  196.    data = read()
  197.    for i, row in enumerate(data):
  198.        for w in row:
  199.            if w not in words:
  200.                print(
  201.                    'Error in word "%s" in line %d.' % (w, i+1),
  202.                    'Suggestions:',
  203.                    ', '.join(suggestions.get(soundex(w), [])) or 'NONE'
  204.                )
  205.  
  206. check()
  207. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement