Исходный код
def desyatka(number):
    return int(number/10.0)
    
def edenica(number):
    return number-desyatka(number)*10
hours_string=[]
for a in range(0,30):
    zzz =""
    if edenica(a)<5:
        zzz = " часа "
    if edenica(a)==1:
        zzz = " час "
    if desyatka(a)==1:
        zzz = " часов "
    if edenica(a)==0:
        zzz = " часов "
    if zzz=="":
        zzz=" часов "
    hours_string.append(zzz)
minutes_string=[]
for a inrange(0,60):
    zzz=""
    if edenica(a)<5:
        zzz = " минуты "
    if edenica(a)==1:
        zzz = " минута "
    if desyatka(a)==1:
        zzz = " минут "
    if edenica(a)==0:
        zzz = " минут "
    if zzz=="":
        zzz=" минут "
    minutes_string.append(zzz)
    
seconds_string=[]
for a inrange(0,60):
    zzz=""
    if edenica(a)<5:
        zzz = " секунды "
    if edenica(a)==1:
        zzz = " секунда "
    if desyatka(a)==1:
        zzz = " секунд "
    if edenica(a)==0:
        zzz = " секунд "
    if zzz=="":
        zzz=" секунд "
    seconds_string.append(zzz)Что не так в исходном коде
Беглый взгляд на исходный код позволяет увидеть повторяющийся трижды алгоритм получения нужной формы слова в соответствии с количеством. Такое дублирование нельзя допускать, алгоритм должен быть перенесён в отдельную функцию.
Само собой разумеется, что знание о получении нужной формы слова — это отдельное самостоятельное знание, которое должно быть отделено от знания о том, что делать с полученной формой слова.
Важно, чтобы возвращаемая форма слова не подразумевала какого-то конкретного использования — то есть не содержала никаких лишних знаков включая пробелы. Это позволит применять результат функции любым способом в любом месте проекта.
Также необходимо скорректировать некоторые названия функций и переменных.
На мой взгляд, перезатирание значений переменных как правило (хотя и не всегда) свидетельствует о недостаточно продуманном алгоритме.
Как можно отрефакторить исходный код
def pluralize(number, word1, word2, word5):
    units = number % 10
    decades = number / 10 % 10if decades == 1:
        return word5
    if units == 1:
        return word1
    elif units >= 2and units <= 4
        return word2
    else
        return word5hours_string = []
for a in range(0, 30):
    hours_string.append(pluralize(a, "час", "часа", "часов"))
minutes_string = []
for a in range(0, 60):
    minutes_string.append(pluralize(a, "минута", "минуты", "минут"))
seconds_string = []
for a in range(0, 60):
    seconds_string.append(pluralize(a, "секунда", "секунды", "секунд"))В остальном исходный алгоритм мне непонятен, но по крайней мере внешне он не выглядит так безалаберно.
Теория
- Принцип единственной реализации
- Принцип единственного знания
- Рефакторинг «извлечение метода»