Можно ли сделать код красивее (много вложеных циклов)

401 просмотра
0
0 Комментариев

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
 
def odd_even_counter(in_file, count_letter):
    '''Function: Get a number of symbols if it even or odd in any text file'''
 
    odd_counter = 0
    even_counter = 0
 
    with open(in_file, 'r') as f0:
        phrase_to_check = ''.join([x for x in f0.read() if x.isalpha()])
 
    for position, item in enumerate(phrase_to_check):
        if item == count_letter:
            if (position + 1) % 2 == 1:
                odd_counter += 1
            else:
                even_counter += 1
 
    print('Символ [', count_letter, '] на нечетной позиции:', odd_counter, 'раз')
    print('Символ [', count_letter, '] на четной позиции:', even_counter, 'раз')
 
 
if __name__ == '__main__':
    test_file = 'lorem_ipsum.txt' # любой текстовый файл
    test_letter = 'o' # любой символ
    odd_even_counter(test_file, test_letter)


Добавить комментарий

1 Ответы

Python Опубликовано 09.12.2018
0

Следует разделять вычисления и ввод/вывод — такой код проще, его легче тестировать и повторно использовать.

Вычисления:

from collections import namedtuple
Counters = namedtuple('Counters', 'even odd')
def odd_even_counter(text, char):
    """How many times *char* is in even/odd positions in *text*.
    Indexing starts with one.
    """
    counters = [0, 0] # even, odd
    for position, current_char in enumerate(text, start=1):
        if current_char == char:
            counters[position % 2] += 1
    return Counters(*counters)

[/apcode]

Пример:

>>> odd_even_counter('abbb', 'b')
Counters(even=2, odd=1)

[/apcode]

Ввод/вывод:

with open('lorem_ipsum.txt') as file:
    letters = (c for line in file for c in line if c.isalpha())
    char = 'o'
    count = odd_even_counter(letters, char)
    print('Символ [ {char} ] на нечётной позиции: {count.odd} раз'.format(**vars()))
    print('Символ [ {char} ] на чётной позиции: {count.even} раз'.format(**vars()))

[/apcode]

Если необходимо, определение и вычисление letters (casefold(), NFKD, grapheme clusters) можно также в отдельную функцию вынести.
Код читает по одной строчке за раз, вместо всего файла целиком.

Результат

Символ [ o ] на нечётной позиции: 20 раз
Символ [ o ] на чётной позиции: 18 раз

[/apcode]

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up