Задача «до ООП»: функции и данные фигур по отдельности
less_34__OOP/theory_01_OOP_00.py
Отправная точка урока: набор независимых функций площади и периметра для прямоугольника, квадрата и прямоугольного треугольника, никак не связанных с данными о конкретной фигуре. Показывает две попытки «собрать» данные и функции вместе без классов — через namedtuple с полями-функциями и через обычный dict, где значения — тоже функции, — и в обоих случаях стороны фигуры всё равно приходится передавать в функцию вручную второй раз.
- rectangle_area/square_area/right_triangle_area — функции площади
- rectangle_perimeter/square_perimeter/right_triangle_perimeter — функции периметра
- Shape = namedtuple(...) с полями area/perimeter как функциями
- rectangle_3_4.area(3, 4) — приходится дублировать стороны при вызове
- Вариант 2: dict с теми же полями-функциями, тот же недостаток
Что выводит: 12 (площадь), затем 14 (периметр) — дважды подряд: сначала через namedtuple rectangle_3_4, затем через словарь rectangle_2.
"""ВВОДНЫЕ:
Предположим, стоит задача обсчитывать периметр и площадь
для ОЧЕНЬ большого числа геометрических фигур разных размеров.
"""
""" ======================= AREA ============================== """
from collections import namedtuple
def rectangle_area(side1, side2):
"""Calculate the area of a rectangle"""
return side1 * side2
Показать файл целиком (68 строк)
"""ВВОДНЫЕ:
Предположим, стоит задача обсчитывать периметр и площадь
для ОЧЕНЬ большого числа геометрических фигур разных размеров.
"""
""" ======================= AREA ============================== """
from collections import namedtuple
def rectangle_area(side1, side2):
"""Calculate the area of a rectangle"""
return side1 * side2
def square_area(side1):
"""Calculate the area of a square"""
return side1 ** 2
def right_triangle_area(side1, side2):
"""Calculate the area of a right triangle"""
return (side1 * side2) / 2
""" ======================= PERIMETR ============================ """
def rectangle_perimeter(side1, side2):
"""Calculate the perimeter of a rectangle"""
return 2 * (side1 + side2)
def square_perimeter(side1):
"""Calculate the perimeter of a rectangle"""
return 4 * side1
def right_triangle_perimeter(side1, side2):
"""Calculate the perimeter of a right triangle"""
hypotenuse = (side1 ** 2 + side2 ** 2) ** 0.5
return side1 + side2 + hypotenuse
""" ======================= FIGURES ============================
Как систематизировать все эти данные, чтобы было удобно
хранить информацию обо всех фигурах?
"""
# =============== variant 1 =============
Shape = namedtuple('Shape',
["side1", "side2", "area", "perimeter"])
rectangle_3_4 = Shape(3, 4, rectangle_area, rectangle_perimeter)
print(rectangle_3_4.area(3, 4))
print(rectangle_3_4.perimeter(3, 4))
# =============== variant 2 =============
rectangle_2 = {
"side1": 3,
"side2": 4,
"area": rectangle_area,
"perimeter": rectangle_perimeter,
}
print(rectangle_2["area"](3, 4))
print(rectangle_2["perimeter"](3, 4))