簡體   English   中英

如何在Python中重復代碼塊

[英]How to repeat blocks of code in Python

我創建了一個代碼,允許用戶查看文件中值的平均分數。 在示例中,文本文件如下所示:

第1類的文本文件: 每個文本文件都相似; 2和3。只是名稱和值不同

Matt 2
Sid 4
Jhon 3
Harry 6

共有3個類別,提示用戶選擇他們要預覽的類別。

碼:

def main_menu():
        print ("\n         Main Menu        ")
        print ("1.Average Score of class = 'avg'")

main_menu()

option = input("option [avg]: ")
option_class = input("class: ")
one = "1.txt"
two = "2.txt"
three = "3.txt"
if option.lower() == 'avg' and option_class == '1':
    with open(one) as f:
        the_list = [int(l.strip().split()[-1]) for l in f]

        b = sum(the_list)
        length = len(the_list)
        avg = float(b) / length if length else 0
        print ("Average of Class is: ", avg)

if option.lower() == 'avg' and option_class == '2':
    with open(two) as f:
        the_list = [int(l.strip().split()[-1]) for l in f]

        b = sum(the_list)
        length = len(the_list)
        avg = float(b) / length if length else 0
        print ("Average of Class is: ", avg)

if option.lower() == 'avg' and option_class == '3':
    with open(three) as f:
        the_list = [int(l.strip().split()[-1]) for l in f]

        b = sum(the_list)
        length = len(the_list)
        avg = float(b) / length if length else 0
        print ("Average of Class is: ", avg)

問題如果我想繼續重復上面的代碼,以便用戶可以繼續使用它直到退出。 因此,是否有可能將代碼放入while循環中,並且僅在用戶願意時才停止代碼,即,如果用戶要選擇其他選項和類,則提示用戶。 注意:會有其他選項,例如字母順序,但是現在我只想知道平均部分的用法。

最好的辦法是使用戶輸入循環,並編寫一個列出文件的函數。

def main_menu():
    print ("\n         Main Menu        ")
    print ("1.Average Score of class = 'avg'")

main_menu()

option = ""
options = ["1", "2", "3"]

one = "1.txt"
two = "2.txt"
three = "3.txt"

def read_text_file(file): # standalone function for viewing files to reduce duplicate code
    file += ".txt"
    with open(file) as f:
            the_list = [int(l.strip().split()[-1]) for l in f]

            b = sum(the_list)
            length = len(the_list)
            avg = float(b) / length if length else 0
            print ("Average of Class is: ", avg)

while True:

    option = input("option [avg]: ").lower()
    if option == "exit":
        break # checks if user want to exit a program
    else:
        option_class = input("class: ")

        if option == 'avg' and option_class in options:
            read_text_file(option_class)

        else:
            print("nothing to show, asking again")

print("end of program")

是的,您可以將代碼放入while循環中,並提示用戶輸入:

def main_menu():
        print ("\n         Main Menu        ")
        print ("1.Average Score of class = 'avg'")
# End main_menu()

one = "1.txt"
two = "2.txt"
three = "3.txt"

keepGoing = True
while(keepGoing):
        main_menu()

        option = input("option [avg]: ")
        option_class = input("class: ")
        if option.lower() == 'avg' and option_class == '1':
            with open(one) as f:
                the_list = [int(l.strip().split()[-1]) for l in f]

                b = sum(the_list)
                length = len(the_list)
                avg = float(b) / length if length else 0
                print ("Average of Class is: ", avg)

        if option.lower() == 'avg' and option_class == '2':
            with open(two) as f:
                the_list = [int(l.strip().split()[-1]) for l in f]

                b = sum(the_list)
                length = len(the_list)
                avg = float(b) / length if length else 0
                print ("Average of Class is: ", avg)

        if option.lower() == 'avg' and option_class == '3':
            with open(three) as f:
                the_list = [int(l.strip().split()[-1]) for l in f]

                b = sum(the_list)
                length = len(the_list)
                avg = float(b) / length if length else 0
                print ("Average of Class is: ", avg)

        # Prompt user for input on whether they want to continue or not:

        while(True):
                keepGoingStr = input("Would you like to continue? (Y/N)\n>>> ").lower()
                if(keepGoingStr[0] == 'y'):
                        # Keep going
                        keepGoing = True
                        break
                elif(keepGoingStr[0] == 'n')
                        # Stop
                        keepGoing = False
                        break
                else:
                        print("Sorry, your input did not make sense.\nPlease enter either Y or N for yes or no.")
                # end if
        # end while - keep going input

# End While(keepGoing)

但是,如注釋中所述,您應該考慮將代碼分解為功能。

正如我在評論部分中提到的,您應該在此處利用功能的強大功能。 通過將組件分解為可管理的部分,您實際上可以提供可讀性和靈活性。 請參閱下面的代碼,其中我有兩個函數,一個用於平均值,一個用於總計。

def get_class_average(class_number):

    filename = "{0}.txt".format(class_number)
    try:
        with open(filename) as f:
            the_list = [int(l.strip().split()[-1]) for l in f]
            b = sum(the_list)
            length = len(the_list)
            avg = float(b) / length if length else 0
            return avg
    except:
        print "No file with that name found."


def get_class_total(class_number):

    filename = "{0}.txt".format(class_number)
    try:
        with open(filename) as f:
            the_list = [int(l.strip().split()[-1]) for l in f]
            b = sum(the_list)
            return b
    except:
        print "No file with that name found."


def check_class_number(string_input):

    try:
        int(string_input)
        return True
    except ValueError:
        return False

if __name__ == "__main__":

    while True:

        input_val = raw_input(
            "Enter class number (enter 'exit' to quit program): ")
        if input_val == 'exit':
            break

        if check_class_number(input_val):  # If it's a valid class number.
            method = raw_input("Enter method: ")
            if method == 'avg':
                avg = get_class_average(int(input_val))
                print "The average of Class {0} is {1}".format(input_val, avg)
            elif method == 'sum':
                total = get_class_total(int(input_val))
                print "The total of Class {0} is {1}".format(input_val, total)
        else:
            print "That is not a valid class number."
            continue

樣品運行:

在此處輸入圖片說明

這里的真正有趣的部分是,你甚至可以重構get_class_averageget_class_total是一個單一的功能,它檢查的傳入methodavgsum並返回有各自的值(這是容易可行的,因為你有幾乎相同線路這兩個函數的代碼, get_class_average僅涉及一個額外的除法)。

玩得開心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM