1
    def __init__(self):
        self.planets = ['Mercury', 'Venus', 'Mars',
                        'Jupiter', 'Saturn','Uranus',
                        'Neptune', 'Pluto']
        self.planets[0] = 0.38
        self.planets[1] = 0.91
        self.planets[2] = 0.38
        self.planets[3] = 2.34
        self.planets[4] = 0.93
        self.planets[5] = 0.92
        self.planets[6] = 1.12
        self.planets[7] = 0.62

    def calculate_spaceweight(self, weight):
        for i in range(len(self.planets)):
            print("your weight on", self.planets[i], " is", weight * self.planets[i] )
if __name__ == '__main__':

    weight = float(input("what is your Earthly weight: "))
    obj1 = Planet()
    print(obj1.calculate_spaceweight(weight))

The outputs are wrong, and i know theres a better way to initialize the values in the list but i cant figure out how. Heres what it is outputting:

your weight on 0.38  is 57.0
your weight on 0.91  is 136.5
your weight on 0.38  is 57.0
your weight on 2.34  is 351.0
your weight on 0.93  is 139.5
your weight on 0.92  is 138.0
your weight on 1.12  is 168.00000000000003
your weight on 0.62  is 93.0
None

Okay i made an edit, so its now outputting the correct answers

2
  • In your code, you've defined self.planets as a list of strings. Then you overwrite every single element with a new values (e.g., self.planets[0] = 0.38). What are you trying to do? Commented Jul 13, 2022 at 19:28
  • 1
    self.planets can hold names or weights. It can't hold both. If you want both, use a dictionary instead of a list. Commented Jul 13, 2022 at 19:28

3 Answers 3

5

When you use

self.planets[0] =  0.38

you are changing 0. index "Mercury" to 0.38

if you want more proper way you can use dictionaries like this

self.planets = {"Mercury": 0.38, "Venus": 0.91}

and for loop

for planet_name, planet_arg in self.planets.items():
   print("your weight on", planet_name, " is", weight * planet_arg)
Sign up to request clarification or add additional context in comments.

2 Comments

I know a dictionary works better and the original code i had was using dictionaries, but i had to practice using classes and the assignement calls for a list instead of a dictionary.
Than you can use nested lists like self.planets = [["Venus", 0.38], ["Venus", 0.91]]
1
def __init__(self):
    self.planets = {
        'Mercury' : 0.38 , 
        'Venus'   : 0.91 , 
        'Mars'    : 0.38 ,
        'Jupiter' : 2.34 , 
        'Saturn'  : 0.93 ,
        'Uranus'  : 0.92 ,
        'Neptune' : 1.12 , 
        'Pluto'   : 0.62 }

def calculate_spaceweight(self, weight):
    for planet in self.planets:
        print("your weight on", planet, " is", self.planets[planet] * weight)
if __name__ == '__main__':

weight = float(input("what is your Earthly weight: "))
obj1 = Planet()
print(obj1.calculate_spaceweight(weight))

As John said, you cannot save the names and weights in a list, that is not how they work in python. A dictionary however can store values indexed by keys.

Comments

0

A dictionary, which holds key-value pairs, is a more appropriate data structure for what you seem to want. A dictionary provides for quick lookup of values based on the keys.

However, since you never look up the multipliers based on the planet name, and only ever iterate over the entire dictionary, you could also use a list of tuples. In this list, each item is a tuple, whose first element is the planet's name and the second element is the planet's weight multiplier.

    def __init__(self):
        self.planets = [('Mercury', 0.38), ('Venus', 0.91), ('Mars', 0.38),
                        ('Jupiter', 2.34), ... and so on ]

    def calculate_spaceweight(self, weight):
        for planet_info in self.planets:
            planet_name = planet_info[0]  # First element of the tuple is the planet name
            planet_mult = planet_info[1]  # Second element is the multiplier
            print("your weight on", planet_name, " is", weight * planet_mult) 

Note my modification to your for i in range(len(self.planets)) loop: it is more pythonic to loop over the elements of a list rather than its indices, so I changed it to for planet_info in self.planets. Now, in each iteration, planet_info contains an element of the list, e.g. in the first iteration planet_info = ('Mercury', 0.38).


Seeing as you've named your class Planet, objects of this class should represent a single planet. Here's what I would do:

class Planet:
    def __init__(self, name, weight_multiplier):
        self.name = name
        self.weight_multiplier = weight_multiplier

    def calculate_spaceweight(self, weight):
        return self.weight_multiplier * weight

Now, in the main part of your program, make these planets:

# Create an empty list
planets = [] 

# Add all planets to it
planets.append(Planet('Mercury', 0.38))
planets.append(Planet('Venus', 0.91))
planets.append(Planet('Mars', 0.38))
planets.append(Planet('Jupiter', 2.34))
planets.append(Planet('Saturn', 0.93))
planets.append(Planet('Uranus', 0.92))
planets.append(Planet('Neptune', 1.12))
planets.append(Planet('Pluto', 0.62))

# Ask for user's weight
weight = float(input("Enter your Earth weight: "))

# Loop over all Planet objects in the planets list
for planet in planets:
    # Calculate weight on this planet
    planet_weight = planet.calculate_spaceweight(weight) 
    # Print message
    print(f"Your weight on {planet.name} is {planet_weight}")

The whole point of object-oriented programming is that a class will encapsulate all properties and methods that are relevant to the objects of that class. So, for example, you could add a property like revolution_period to your Planet class, and add a method which uses that to calculate your age in "Planet years" given "Earth years":

class Planet:
    def __init__(self, name, weight_multiplier, revolution_period_days):
        self.name = name
        self.weight_multiplier = weight_multiplier_days
        self.revolution_period = revolution_period

    def calculate_space_weight(self, weight):
        return self.weight_multiplier * weight

    def calculate_space_age(self, age):
        return 365 / self.revolution_period * age

mars = Planet("Mars", 3.72/9.81, 687)
# Ask for user's weight
weight = float(input("Enter your Earth weight (in kg): "))

print(f"You would weigh {mars.calculate_space_weight(weight)}kg on Mars")

# Ask for user's age
age = float(input("Enter your Earth age (in years): "))

print(f"You are {mars.calculate_space_age(age)} Mars-years old")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.