【问题标题】:Why isnt the indexing in this python script working?为什么这个 python 脚本中的索引不起作用?
【发布时间】:2021-11-24 10:40:17
【问题描述】:

我正在为一项作业编写此脚本,因此我希望通过它来讨论而不是简单地得到答案。基本上,我正在尝试将英尺转换为米,将米转换为英尺,并在最后提供两者的总转换距离之和。没有 [] 索引,它工作得很好。我刚刚添加并且正在努力解决的新部分是 [] 索引,老实说,我正在研究它们是如何工作的。无论如何继承代码:

MAX = 256
switch = ""
feet = [0.0] * MAX
meters = [0.0] * MAX
feetpermeter = 3.28084
metersperfoot = 0.3048
sum_meters = 0
sum_feet = 0

def main():
    selector()


def selector():
    while True:
        print("Is your measurement in meters or feet?")
        switch = input("Or would you like to quit?")
        if (switch == "feet" or switch == "Feet"):
            ftm()
        elif (switch == "meters" or switch == "Meters"):
            mtf()
        elif (switch == "quit" or switch == "Quit"):
            end()
        else:
            print("Sorry, that wasn't one of the options.")
            print("Lets try that again")


def mtf():
    try:
        meters[sum_meters] = float(input("Enter the number of meters. "))
        feet[sum_feet] = meters * feetpermeter
        print("That is", feet, "feet.")
        main()
    except:
        print("Sorry, I didn't quite get that, lets try again.")
        mtf()


def ftm():
    try:
        feet[sum_feet] = float(input("Enter the number of feet. "))
        meters[sum_meters] = feet * metersperfoot
        print("That is", meters, "meters.")
        main()
    except:
        print("Sorry, I didn't quite get that, lets try again.")
        ftm()


def end():
    while True:
        switch2 = input("Are you sure you want to quit(y/n)?")
        if (switch2 == "y" or switch2 == "Y"):
            print("you converted a total of ", sum(feet), "feet")
            print("And", sum(meters), "meters.")
            print("Bye!")
            exit()
        elif (switch2 == "n" or switch2 == "N"):
            print("Ok, let's try that again.")
            main()
        else:
            print("Sorry, that wasn't one of the options.")
            print("Lets try that again")


main()

我确实尝试在每个结果之后使用 sum_feet + 1 和 sum_meters + 1,但这也没有用。

【问题讨论】:

    标签: python indexing square-bracket


    【解决方案1】:

    您没有以正确的方式使用索引。例如,查看现有代码中的 cmets:

    def mtf():
        try:
            # Error 1. You stored all the inputs to index 0, as sum_meters is 0 always and its not incremented
            # So, all the inputs are not recorded, only last one gets in index 0
            meters[sum_meters] = float(input("Enter the number of meters. "))
    
            # Error 2: You multiplied the whole list against the conversion parameter.
            # Instead, you should multiply the value at current index
            feet[sum_feet] = meters * feetpermeter
    
            # This will print the whole list. Again use the current index here
            print("That is", feet, "feet.")
            main()
        except:
            print("Sorry, I didn't quite get that, lets try again.")
            mtf()
    

    您的函数的固定版本如下:

    def mtf():
        try:
            # For modifying global variables in a function scope
            global sum_meters
            global sum_feet
            meters[sum_meters] = float(input("Enter the number of meters. "))
            feet[sum_feet] = meters[sum_meters] * feetpermeter
            print(f"That is {feet[sum_feet]} feet.")
            sum_meters += 1
            sum_feet += 1
            main()
        except:
            print("Sorry, I didn't quite get that, lets try again.")
            mtf()
    

    此修复也适用于您的其他功能。 我还想给你另一条建议,你可以使用一个好的面向对象的方法来解决这些问题,这使得它更容易实现。你可以从中学到很多东西,然后你会更有信心。

    作为示例,请参见下面的代码 - 几乎相同,但方式更清晰。

    class Converter:
        FEET_PER_METER = 3.28084
        METERS_PER_FOOT = 0.3048
    
        def __init__(self):
            self.feet_store = []
            self.meter_store = []
            self.curr_index = 0
    
            self.menu_handlers = {
                "feet": self.feet_to_meter,
                "meters": self.meter_to_feet,
                "quit": self.summary
            }
    
        def run_selection(self, selected):
            #
            selected = str.lower(selected)
            if selected in self.menu_handlers:
                # call the relevant function
                return self.menu_handlers.get(selected)()
            return False
    
        def meter_to_feet(self):
            meters_in = float(input("Enter the number of meters."))
            to_feet = meters_in * self.FEET_PER_METER
            self.meter_store.append(meters_in)
            self.feet_store.append(to_feet)
            print(f"In Feet : {to_feet}")
            return to_feet
    
        def feet_to_meter(self):
            feet_in = float(input("Enter the number of feet."))
            to_meters = feet_in * self.METERS_PER_FOOT
            self.feet_store.append(feet_in)
            self.meter_store.append(to_meters)
            print(f"In Meters : {to_meters}")
            return to_meters
    
        def summary(self):
            confirm = input("Are you sure you want to quit(y/n)?")
            if confirm in ["y", "Y"]:
                print("you converted a total of ", sum(self.feet_store), "feet")
                print("And", sum(self.meter_store), "meters.")
                print("Bye!")
                exit()
            else:
                return False
    
    
    def main():
        converter = Converter()
        while True:
            choice = input("Is your measurement in meters or feet (meters/feet/quit)?")
            converter.run_selection(choice)
    

    我希望这能给您带来更好的见解。

    【讨论】:

    • 这很有帮助!感谢您花时间帮助我!
    • 如果您觉得有帮助,您可以接受并点赞一个答案
    • 嘿,克里斯,我对这两个答案都投了赞成票,但它说我没有必要的声誉。
    【解决方案2】:

    因此,您在这里尝试执行的操作存在两个问题:

    meters[sum_meters] = float(input("Enter the number of meters. "))
    feet[sum_feet] = meters * feetpermeter
    

    meters * feetpermeter 是将数组乘以一个数字,您需要执行meters[sum_meters] 以获得您想要的数字。其次,正如您所说,您每次都需要增加 sum_meters ,但是因为您在一个函数中,所以您需要在更改之前将变量声明为全局变量。此外,由于 sum_meters 和 sum_feet 总是相等的,您可以只使用一个变量来跟踪这一点:

    def mtf():
        try:
            global index
            meters[index] = float(input("Enter the number of meters. "))
            feet[index] = meters[index] * feetpermeter
            index += 1
            print("That is", feet, "feet.")
            main()
        except:
            print("Sorry, I didn't quite get that, lets try again.")
            mtf()
    
    
    def ftm():
        try:
            global index
            feet[index] = float(input("Enter the number of feet. "))
            meters[index] = feet * metersperfoot
            index += 1
            print("That is", meters, "meters.")
            main()
        except:
            print("Sorry, I didn't quite get that, lets try again.")
            ftm()
    

    我还想进一步说,对于这个问题,使用列表是不必要的,你可以简单地有两个数字,total_meters 和 total_feet,然后添加值。这将占用更少的内存,并且还消除了已施加的 256 次的任意限制。所以我会这样做:

    import sys
    
    MAX = 256
    switch = ""
    total_feet = 0
    total_meters = 0
    feetpermeter = 3.28084
    metersperfoot = 0.3048
    sum_meters = 0
    sum_feet = 0
    index = 0
    
    
    def main():
        selector()
    
    
    def selector():
        while True:
            print("Is your measurement in meters or feet?")
            switch = input("Or would you like to quit?")
            if switch == "feet" or switch == "Feet":
                ftm()
            elif switch == "meters" or switch == "Meters":
                mtf()
            elif switch == "quit" or switch == "Quit":
                end()
                sys.exit(0)
            else:
                print("Sorry, that wasn't one of the options.")
                print("Lets try that again")
    
    
    def mtf():
        try:
            global total_feet
            global total_meters
            meters = float(input("Enter the number of meters. "))
            feet = meters * feetpermeter
            total_meters += meters
            total_feet += feet
            print("That is", feet, "feet.")
            main()
        except Exception as e:
            print(e)
            print("Sorry, I didn't quite get that, lets try again.")
            mtf()
    
    
    def ftm():
        try:
            global total_feet
            global total_meters
            feet = float(input("Enter the number of feet. "))
            meters = feet * metersperfoot
            total_meters += meters
            total_feet += feet
            print("That is", meters, "meters.")
            main()
        except Exception as e:
            print(e)
            print("Sorry, I didn't quite get that, lets try again.")
            ftm()
    
    
    def end():
        while True:
            switch2 = input("Are you sure you want to quit(y/n)?")
            if switch2 == "y" or switch2 == "Y":
                print("you converted a total of ", total_feet, "feet")
                print("And", total_meters, "meters.")
                print("Bye!")
                exit()
            elif switch2 == "n" or switch2 == "N":
                print("Ok, let's try that again.")
                main()
            else:
                print("Sorry, that wasn't one of the options.")
                print("Lets try that again")
    
    
    main()
    
    

    【讨论】:

    • 我确信有很多东西是不必要的。此代码已在课程期间每周缓慢添加,具有特定的目标和要求。本周是名单。也就是说,这篇文章非常有帮助,我现在了解了我以前没有得到的这些功能的一部分。非常感谢。
    猜你喜欢
    • 2015-06-16
    • 2020-12-14
    • 2013-10-20
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多