【问题标题】:Assignment: Python 3.3: Using while loop to check for condition of attribute in class作业:Python 3.3:使用 while 循环检查类中属性的条件
【发布时间】:2013-04-30 01:21:10
【问题描述】:

我正在尝试使用“while”循环来检查类中属性的条件。具体来说,我需要检查里程表以查看是否有任何物体达到 500。代码用于模拟比赛。所以它需要检查类作为一个整体,看看任何对象的里程表是否达到500(或以上),当发生这种情况时,停止添加到里程表,并宣布获胜者。但是,现在,“while”循环一直运行,直到每个对象的里程表达到 500。将“while”循环移动到“for”循环之前会导致错误,说汽车类没有里程表属性...

所以我的问题是,如何让我的“while”循环为整个类工作,而不是分别为每个对象工作?还是我试图完全错误地解决这个问题?我在这里不知所措,但我认为我正确地解决了这个问题。这是我所拥有的全部内容。

from random import randint
import time
class car:
    def __init__(self, Driver, Sponsor, Odometer=0, Speed=0):
        self.Driver = Driver
        self.Sponsor = Sponsor
        self.Odometer = Odometer
        self.Speed = randint(1,121)
drivers={'David': 'Burger King',
         'Travis': 'Dr Pepper',
         'Landon': 'Precon Marine',
         'Jamie': 'Cessna',
         'Juan': 'Target',
         'Ken': 'Federated Auto Parts',
         'Timmy': 'OXYwater',
         'Josh': 'MDS Transport',
         'Kurt': 'Furniture Row',
         'Casey': 'Geico',
         'Kasey': 'Farmers Insurance',
         'Jeff': 'Axalta',
         'Jimmie': 'Lowes',
         'Dale': 'National Guard',
         'Mike': 'Plinker Tactical',
         'Denny': 'FedEx',
         'Kyle': 'Mars Brands',
         'Matt': 'Husky',
         'Bobby': 'Kingsford',
         'Clint': '5-Hour Energy'
}
cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]
for car in cars:
    while car.Odometer < 500:
        car.Odometer=car.Odometer+car.Speed*0.17
        car.Speed = randint(1,121)
        print(car.Driver, car.Odometer, car.Speed)

【问题讨论】:

  • 你有什么问题?
  • 对不起!。我对其进行了编辑以澄清我的问题。虽然,我不确定它是否足够清楚......

标签: python class for-loop while-loop python-3.3


【解决方案1】:

也许是这样的?

from operator import attrgetter

cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]

# we find the car with the max Odometer
car_max_odometer = max(cars, key=attrgetter("Odometer"))
while car_max_odometer.Odometer < 500
    for car in cars:
        car.Odometer=car.Odometer+car.Speed*0.17
        car.Speed = randint(1,121)
        print(car.Driver, car.Odometer, car.Speed)
    car_max_odometer = max(cars, key=attrgetter("Odometer"))
print("We have a winner! {}, {}, {}".format(car_max_odometer.Driver, car_max_odometer.Odometer, car_max_odometer.Speed))

您还应该查看 PEP8,您的类名、变量名和空格不符合约定。

另外:

self.Speed = randint(1,121)

应该是:

self.Speed = Speed

因为您将速度作为关键字参数传递

如果你希望它在速度为 0 时默认为 randint(1,121) 或者如果它是 None 那么你可以这样做

self.Speed = Speed or randint(1,121)

【讨论】:

  • 谢谢!我继续阅读(大部分)PEP8 命名和格式约定。我将它们应用于我模块中的代码。你的建议很有效,我还在里程表更新之间添加了一小段时间延迟,这样打印看起来更整洁。再次感谢!
猜你喜欢
  • 2017-04-03
  • 2013-04-22
  • 2013-12-29
  • 2019-11-23
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2021-09-09
相关资源
最近更新 更多