Как можно ещё сократить количество строк в коде?

Только изучаю Python.
Собственно вопрос в заголовке.
Вопрос возник потому, что изначаль кода было в два раза больше.

# coding=utf8
from math import sqrt

def fu(a, b):
    c = sqrt(a ** 2 + b ** 2)
    b = (a * b) / 2
    print c, "гипотенуза"
    print b, "площадь"

def fu1():
    'Функция проверяет чтобы введённые данные были числом'
    a = raw_input("Введите число: ")
    while a == str(a):
        try:
            a = int(a)
        except ValueError:
            a = raw_input("Введите число: ")
    return a

def fu2():
    'Функция проверяет чтобы введённое число было больше нуля'
    a = fu1()
    while a <= 0:
        a = fu1()
    return a

fu(fu2(), fu2())
  • Вопрос задан
  • 421 просмотр
Решения вопроса 1
@lega
fu1 и fu2 можно объединить в
def fu2():
    while True:
        try:
            a = int(raw_input("Введите число: "))
            assert a > 0
            return a
        except (ValueError, AssertionError):
            pass
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
winordie
@winordie
Лучшая документация -- исходники
Работает только для целых неотрицательных чисел
from math import sqrt

def input_int(count):
    cathetus = raw_input('Введите число {}: '.format(count)) # python2
    # cathetus = input('Введите число {}: '.format(count)) # python3
    return int(cathetus) if cathetus.isdigit() else input_int(count)

def calculation(a, b):
    hypotenuse = sqrt(a ** 2 + b ** 2)
    square = float(a * b)/2 # updated, old: square = (a * b)/2
    return {'hypotenuse': hypotenuse, 'square': square}

result = calculation(input_int(1), input_int(2))
print("\nгипотенуза: {hypotenuse}\nплощадь: {square}".format(**result))

И функции все таки по человечески надо называть.
PS по поводу того что только с целочисленными работает - исходный вариант также работал только с целыми числами (a = int(a), а не a = float(a))
Ответ написан
@MiiNiPaa
Адекватно назовите функции и удалите комменты.
Ответ написан
@Quirel
fu1, сократил на одну строку, символы не считал)
def fu1():                                                                      
    while True:
        try:
            a = int(raw_input('Введите число: '))
            return a
        except ValueError:
            a = int(raw_input('Введите число: '))
Ответ написан
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
Александр
1. Как уже говорили в одном из ответов Вам надо дать отличные названия и убрать комментарии. Есть такое правило, если есть кусок кода, который хочется прокомментировать, то стоит этот кусок выделить в отдельную функцию и дать ей хорошее названии
2. Функции нужно стремиться оформлять так чтоб они меньше побочных эффектов производили. Должна одна что-то спрашивать у юзера и выводить ему результат, а другие должны для нее выполнять вычислительную работу. У Вас же raw_input в одном месте, print в другом. Не зачем так писать.
3. Не обязательно в маленькой функции писать обработчик исключений. Вынесите это в высокоуровневый код.

Приведу аналогию с начальник-подчиненный. Начальник дает задачу , подчиненный берет ее и убеждается что понял ее, если что спрашивает уточняющие или сразу говорит "не могу выполнить, не хватает ...". Когда же он что-то делает, он не парится а хорошо ли плохо. Зато если вдруг что-то серьезное произошло, то он не парится на тему, а как бы это исправить, а просто уведомляет "Иван Иваныч, подшипники надо истерлись, надо бы купить новые" и это проблема начальника обратиться в другой отдел. От подчиненного все что было нужно уже имеется!
Ответ написан
Комментировать
@vintkor Автор вопроса
А так считается хорошо?
вместо
print c, "гипотенуза"
print b, "площадь"

Писать
print c, "гипотенуза","\n", b, "площадь"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы