【问题标题】:Are there any shortcuts for a case like this?这样的案例有什么捷径吗?
【发布时间】:2019-03-01 18:26:29
【问题描述】:

大家!我是编程新手,我无法找到这个问题的正确答案。我会尽力解释它:

我想知道是否有任何方法可以缩短我的代码,以免在以下情况下重复。

class vehicle:
    colour = 0
    turbo = 0
    quality = 1
    type = 0

    def create_vehicle(self, pick_colour, add_turbo, define_quality, pick_type):
        self.colour = pick_colour
        self.turbo = add_turbo
        self.quality = define_quality
        self.type = pick_type
        return (self.colour, self.turbo, self.quality, self.type)

#This is the part I want to shorten up#

    def check_vehicle(self):
        if self.type == 0:
            self.type = "motorbike"
        elif self.type == 1:
            self.type = "car"
        elif self.type == 2:
            self.type = "van"
        if self.quality == 1:
            self.quality = "basic"
        elif self.quality == 2:
            self.quality = "normal"
        elif self.quality == 3:
            self.quality = "good"
        elif self.quality == 4:
            self.quality = "superior"
        if self.colour == 0:
            self.colour = "white"
        elif self.colour == 1:
            self.colour = "red"
        elif self.colour == 2:
            self.colour = "yellow"
        elif self.colour == 3:
            self.colour = "blue"
        elif self.colour == 4:
            self.colour = "green"
        elif self.colour == 5:
            self.colour = "black"
        elif self.colour == 6:
            self.colour = "orange"
        elif self.colour == 7:
            self.colour = "grey"
        if self.turbo == 0:
            self.turbo = "does not have"
        elif self.turbo == 1:
            self.turbo = "has"
        print("The %s I've created has a %s quality. It is %s and %s turbo" % (self.type, self.quality, self.colour, self.turbo))

"""
Types:
    0 = Motorbike
    1 = Car
    2 = Van
Quality:
    From 1 to 4
    Increases general stats of the vehicle (Speed, Appearance, Maneuverability)
    1 = Basic
    2 = Normal
    3 = Good
    4 = Superior
Colour:
    0 = White
    1 = Red
    2 = Yellow
    3 = Blue
    4 = Green
    5 = Black
    6 = Orange
    7 = Grey
"""

vehicle1 = vehicle()
vehicle1.create_vehicle(5, 1, 4, 0)
vehicle1.check_vehicle()

我自己检查过,这段代码输出如下:

The motorbike I've created has a superior quality. It is black and has turbo

有效!耶! 但是,问题是我想缩短上面突出显示的部分代码。感谢您的帮助

【问题讨论】:

  • 也许这是一个愚蠢的问题:为什么不完全跳过数字而直接使用vehicle1.create_vehicle("black", "has", "superior", "motorbike")
  • 除了@Kevin 的建议(特定于您的特定实现),听起来您应该查看Python 字典。它们是用于将一个值映射到另一个值的数据结构,因此可以避免许多 if-else 情况。
  • 使用示例:color = {0: "white", 1: "red", 2: "yellow", 3: "blue", 4: "green"}; print(color[0])
  • 这可能更适合codereview.stackexchange.com,尽管它们往往比Stack Overflow 更加严格。

标签: python performance redundancy


【解决方案1】:

如果您使用的是 Python 2.7,您将希望从 Object 继承。即

class vehicle:

应该变成

class vehicle(Object):

有关原因的信息,请参阅Python class inherits object

根据您的用例,最好定义一个构造函数(又名 init)而不是 create_vehicle(..)。

欲了解更多信息,请参阅https://micropyramid.com/blog/understand-self-and-init-method-in-python-class/

对于check_vehicle,我会使用字典来简化。例如

types = {
    1: "motorbike",
    2: "car",
    3:......etc
}

然后在

def check_vehicle(self):
    if self.type in types:
        self.type = types[self.type]
    else:
        print "My error message"

https://www.w3schools.com/python/python_dictionaries.asp

【讨论】:

    【解决方案2】:

    您可以使用列表或字典将代码转换为描述。但是,如果您只想打印描述,我建议您避免更新对象的成员。

    def check_vehicle(self):
        types     = [ "motorbike", "car", "van" ]
        qualities = [ "", "basic", "normal", "good", "superior" ]
        colours   = [ "white", "red", "yellow", "blue", "green", "black" ]
        hasTurbo  = ["does not have","has"]
        self.type    = types[self.type]
        self.quality = qualities[self.quality]
        self.colour  = colours[self.colour]
        self.turbo   = hasTurbo[self.turbo]
        print("The %s I've created has a %s quality. It is %s and %s turbo" % (self.type, self.quality, self.colour, self.turbo))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2022-01-06
      • 2018-01-13
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多