Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """ Бажано не вставляти імпорти інших модулів "про всяк випадок",
- якщо вони по факту не використовуються.
- """
- from itertools import groupby
- """ При іменуванні функцій бажано використовувати імена які вказують
- на дію. В даному випадку краще використовувати щось типу get_vocabulary.
- Ідентифікатори типу vocabulary (іменник, а не дієслово) більше
- підходять для змінних.
- """
- def vocabulary():
- with open('word.txt') as file:
- """ Наступний рядок демонструє цікаву річ - об'єкт file
- вміє працювати з циклом for і в даному випадку він неявно
- оброблюється як file.readlines()
- Так писати цілком допустимо. А от переприсвоювати отриманий список
- слів назад змінній, яка містить вказівник на файл, не правильно.
- Це не є помилкою з точки зору Пітона, але різко
- збільшує складність пошуку помилок.
- """
- file = [line.strip() for line in file]
- # print(file)
- """ У рядку вище ми згенерували список слів. Абсурдно використовувати
- для списка метод .split()
- """
- words = file.split()
- for word in words:
- """ Змінна temp обнулюється при кожному проході цикла.
- Тобто всі результати його заповнення, крім як для останнього
- проходу цикла будуть втрачені.
- """
- temp = []
- for word in words:
- """ Тут ми в середині одного цикла вставляємо ще один точно
- такий же цикл з аналогічними управляючими змінними. Це
- не має сенсу.
- """
- temp.append(word)
- return temp
- """ Насправді вся функція завантаження словника може виглядати так:
- def get_vocabulary():
- with open('words.txt') as f:
- return [x.strip() for x in f]
- Все
- """
- def read():
- with open('input.txt') as file:
- # mylist = f.readlines()
- """ Метод .rstrip('\n') прибирає лише символи переносу рядка з
- правої частини. Втім, для файла створеного на платформі Windows
- в кінці кожного рядка буде знаходитись пара символів '\r\n'. Краще,
- по можливості, писати кросплатформенний код. Таким чином, використання
- просто .strip() є бажанішим.
- """
- mylist = [line.rstrip('\n') for line in file]
- # print(mylist)
- for i, line in enumerate(mylist):
- """ Не бачу сенсу у використанні enumerate
- """
- # punctuation = ['.',',',':',';','!','?','(',')']
- line = line.lower()
- line = line.replace('.','')
- line = line.replace(',','')
- line = line.replace('-',' ')
- """ Код вище можна було б записати так:
- line = line.lower().replace('.','').replace(',','').replace('-','')
- """
- words = line.split()
- """ Далі йде аналогічна незрозуміла мені конструкція з двох
- однакових вкладених циклів. Не розумію, що малося на увазі.
- """
- for word in words:
- temp = []
- for word in words:
- temp.append(word)
- """ Даний return знаходиться в середині цикла for, відповідно
- при першому ж проході функція завершиться в даному місці. Можливо
- тут є помилка з відступами, але не схоже, що це виправить загальну
- ситуацію.
- """
- return temp
- # print(i, line, '\n')
- """ Наступний рядок ніколи не виконається, бо перед ним стоїть return
- """
- print(temp, '\n')
- """ Насправді вищенаведену функцію, якщо є бажання одразу бити на слова,
- можна було б переписати якось так:
- def read():
- with open('input.txt') as f:
- return [
- x.strip().lower().replace('.','').replace(',','').replace('-','').split()
- for x in f]
- Така функція поверне список рядків де кожен рядок буде
- представляти список слів.
- """
- def soundex(word):
- w_input = word
- code = ""
- w_input = w_input.upper()
- code = code + w_input[0]
- """ Немає сенсу в конкатенації з завідомо пустим рядком. Можна одразу
- писати
- code = w_input[0]
- """
- """
- Далі, цикл for правильніше було б оформити так:
- for nextletter in w_input[1:]:
- """
- for i in range (1, len(w_input)):
- nextletter = w_input[i]
- """ Перевірка входження символа в набор зручніше б виглядала як
- if nextletter in 'BFPV':
- """
- if nextletter in ['B','F','P','V']:
- """ Наступний рядок може виглядати так:
- code += '1'
- """
- code = code + '1'
- elif nextletter in ['C','G','J','K','Q','S','X','Z']:
- code = code + '2'
- elif nextletter in ['D','T']:
- code = code + '3'
- elif nextletter in ['L']:
- code = code + '4'
- elif nextletter in ['M','N']:
- code = code + '5'
- elif nextletter in ['R']:
- code = code + '6'
- """ Наскільки я бачу, тут функція soundex реалізує дещо спрощений
- варіант алгоритму soundex. З метою прискорення розробки, це має сенс.
- Втім обмеження довжини кода або підгонку його під необхідну довжину,
- потрібно було б дописати. Якось так:
- return code[:4].ljust(4, '0')
- """
- return code
- """ Не потрібно називати функцію словом function. Назва функції повинна
- нести смислове навантаження. Сама ж функція, наскільки я бачу, просто
- виводить тестову інформацію в термінал.
- """
- def function():
- for word in read():
- # print(word)
- w = soundex(word)
- print(word, w)
- for word in vocabulary():
- # print(word)
- voc_w = soundex(word)
- print(word, w)
- return voc_w
- function()
- # read()
- # vocabulary()
- """ Можливо був би сенс написати щось таке:
- def check():
- words = get_vocabulary()
- suggestions = {}
- for w in words:
- code = soundex(w)
- if code in suggestions:
- suggestions[code].append(w)
- else:
- suggestions[code] = [w]
- data = read()
- for i, row in enumerate(data):
- for w in row:
- if w not in words:
- print(
- 'Error in word "%s" in line %d.' % (w, i+1),
- 'Suggestions:',
- ', '.join(suggestions.get(soundex(w), [])) or 'NONE'
- )
- check()
- """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement