<p>看起来你在努力寻找一个花园所需要的植物数量</p>
<p><a href="https://i.stack.imgur.com/h503K.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/h503K.png" alt="enter image description here"/></a></p>
<p>所以这里有一个过度设计的解决方案(使用一个抽象基类和两个子类):</p>
<pre><code>from abc import ABC, abstractmethod
from math import pi
INCHES_PER_FOOT = 12.
def get_float(prompt):
"""
Prompt until a float value is entered, then return it
"""
while True:
try:
return float(input(prompt))
except ValueError:
pass
class PlantedArea(ABC):
spacing = 0.5
@abstractmethod
def __init__(self, name, *args):
self.name = name
self.args = args
@property
@abstractmethod
def area(self):
return 1
@property
def plants(self):
"""
Return the number of plants which can be placed in `area`
with `spacing` separation between each plant.
Note: this is the theoretical maximum number, assuming
a square planting grid; the actual number needed
may vary slightly depending on the shape of the border
"""
return int(self.area / self.spacing**2)
class TriangleArea(PlantedArea):
def __init__(self, name, width, height):
self.name = name
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height / 2
class CircleArea(PlantedArea):
def __init__(self, name, radius):
self.name = name
self.radius = radius
@property
def area(self):
return pi * self.radius ** 2
def main():
length = get_float("What is the garden width (in feet)? ")
spacing = get_float("What is your plant spacing (in inches)? ") / INCHES_PER_FOOT
PlantedArea.spacing = spacing
beds = [
TriangleArea("NW corner", length/2, length/2),
TriangleArea("NE corner", length/2, length/2),
TriangleArea("SW corner", length/2, length/2),
TriangleArea("SE corner", length/2, length/2),
CircleArea ("center", length/4)
]
total_plants = 0
for bed in beds:
plants = bed.plants
print("The {} bed needs {} plants".format(bed.name, plants))
total_plants += plants
print("The whole garden needs a total of {} plants.".format(total_plants))
if __name__ == "__main__":
main()
</code></pre>
<p>就像</p>
<pre><code>What is the garden width (in feet)? 20
What is your plant spacing (in inches)? 6
The NW corner bed needs 200 plants
The NE corner bed needs 200 plants
The SW corner bed needs 200 plants
The SE corner bed needs 200 plants
The center bed needs 314 plants
The whole garden needs 1114 plants.
</code></pre>