【问题标题】:How to fix while loop within function?如何修复函数内的while循环?
【发布时间】:2019-05-02 05:33:11
【问题描述】:

我的代码有效,并要求命名文件,以及多少个数字。但它只是不断地询问数字,如果我输入零,它就会做它应该做的事情。非常感谢任何帮助。我只是不知道如何修复代码,这真的让我很烦恼。

import random
def generateRandomNumber(myfile):
    try:
        fileToBeWrittenTo = open(myfile,"w")
        numberOfRandomNumbers = int(input("How many numbers" + \
                                      " should the random file hold?:" ))
    except Exception as potentialError:
        print("An error has occured:", potentialError )
    else:
        for randomNumberCount in range(1, numberOfRandomNumbers + 1 ):
            randomNumber = generateRandomNumber(myfile)
            fileToBeWrittenTo.write(str( randomNumber ) + '\n' )
        print( numberOfRandomNumbers, "numbers have been written" + \
               " to the file ")
    finally:
        fileToBeWrittenTo.close()
        print("\nEnd of program")
    displayNumber(myfile)
    randomNumber = random.randint(1,500)
    return randomNumber

def main():
    myfile = str(input("Enter file name here "))
    with open(myfile, 'w+') as f:
        generateRandomNumber(myfile)

    return f
    myfile.close    

def displayNumber(myfile):
    try:
        myfile = open(myfile,'r')
        total = 0
        NORN = 0
        Avg = 0
        line = myfile.readline()
        while line != "":
            randomNumber = int(line)
            total += randomNumber
            NORN += 1
            Avg = total / NORN
            print( randomNumber )
        line = myfile.readline()
    except IOError:
        print("Problem with file being opened")
    else:
        print("The average of the numbers is " + str(Avg))
        print("The total of all the numbers is " + str(total)+\
          "\nThere are " + str(NORN)+\
          " in the file")
        myfile.close()
    finally:
        print("End of program")

main()

【问题讨论】:

  • 请修复你的python缩进

标签: python function loops random while-loop


【解决方案1】:

使用try-except-else-finally 很好,但我认为它会让你感到困惑,请先尝试学习try-except

你没有结束循环

def generateRandomNumber(myfile):
    ....
            randomNumber = generateRandomNumber(myfile)

while line != "":
    ....
    print( randomNumber )
line = myfile.readline()

应该是

while line != "":
    ....
    print( randomNumber )
    line = myfile.readline()

这里是你的工作代码

import random

def generateRandomNumber():
    randomNumber = random.randint(1,500)
    return randomNumber

def writeRandom(myfile):
    try:
        fileToBeWrittenTo = open(myfile, "w")
        numberOfRandomNumbers = int(input("How many numbers" + \
                                      " should the random file hold?:" ))
    except Exception as potentialError:
        print("An error has occured:", potentialError )
    else:
        for randomNumberCount in range(1, numberOfRandomNumbers + 1 ):
            randomNumber = generateRandomNumber()
            fileToBeWrittenTo.write(str( randomNumber ) + '\n' )
        print( numberOfRandomNumbers, "numbers have been written" + \
               " to the file ")
        fileToBeWrittenTo.close()
        displayNumber(myfile)
    finally:
        print("\nEnd of program")

def main():
    myfile = str(input("Enter file name here "))
    writeRandom(myfile)  

def displayNumber(myfile):
    try:
        my_file = open(myfile,'r')
        total = 0
        NORN = 0
        Avg = 0
        line = my_file.readline()
        while line != "":
            randomNumber = int(line)
            total += randomNumber
            NORN += 1
            Avg = total / NORN
            print( randomNumber )
            line = my_file.readline()
    except IOError:
        print("Problem with file being opened")
    else:
        print("The average of the numbers is " + str(Avg))
        print("The total of all the numbers is " + str(total)+\
          "\nThere are " + str(NORN)+\
          " in the file")
        my_file.close()
    finally:
        print("End of program")

main()

【讨论】:

    【解决方案2】:

    generateRandomNumber 函数在 randomNumber = generateRandomNumber(myfile) 语句中递归调用自身,如果输入 0 则会跳过。

    另外,您的main 包含一个未使用的with open,并且myfile.close 语句既不会执行也不需要。尝试缩短它。

    def main():
        myfile = str(input("Enter file name here "))
        generateRandomNumber(myfile)
    

    您还可以使用with open 显着简化generateRandomNumberdisplayNumber 函数。

    处理文件时最好使用 with 关键字 对象。优点是文件在其后正确关闭 套件完成,即使在某些时候引发了异常。使用 with 也比编写等效的 try-finally 块要短得多

    最后,displayNumber 包含一个无限循环,尝试将第二个line = myfile.readline() 缩进一步或重写函数以一次读取完整文件并使用简单的for 循环。

    with open(myfile) as myfilehandle:
        lines = myfilehandle.readlines()
    
    for line in lines:
        # do things
    

    【讨论】:

    • 所以我解决了这个问题。我摆脱了它。现在代码可以工作了,但是当我输入一个数字时,它变成了一个无限循环
    • 如果我输入一个 0,它就不会作为一个无限循环。我需要完全摆脱 randomNumber = generateRandomNumber(myfile) 还是修改它?
    • 看起来您通过在with open 语句和常规open 语句之间切换来保持myfile 处于打开状态。 main 中的 with open 在函数返回之前不会关闭文件。
    • 所以我认为我需要将其更改为常规打开。
    • 我已经用一个例子main更新了我的答案。您可能应该使用with open 简化generateRandomNumber,以使代码更易于理解。
    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多