【问题标题】:Difficulties with an unruly program不守规矩的程序的困难
【发布时间】:2016-03-08 10:44:56
【问题描述】:

我已经在这段代码上工作了几个小时,但我不太确定问题出在哪里。

import random#imports random
import os#Imports os
print("Welcome to the maths quiz") # Welcomes user to quiz
score = (0)


def details():
    plr_name = input ("Please Input Name:") # Asks user for name
    plr_class = input("Input class number: ") # Asks the user for class numer
return (plr_name, plr_class)

def Q():
    while qno < 10: # loops while qno is under 10
        ran_num1 = random.randint(1,99) # Generates the first random number
        ran_num2 = random.randint(1,99) # Generates the second random number
        ran_fun = random.choice("X-+") # Picks a random function
        print(ran_num1,ran_fun,ran_num2,"=") # Prints the Sum for the user
        if ran_fun == "X":
            sum_ans = ran_num1 * ran_num2 # Does the sum if it is a multiplication
        if ran_fun == "+":
            sum_ans = ran_num1 + ran_num2 # Does the sum if it is a addition
        if ran_fun == "-":
            sum_ans = ran_num1 - ran_num2 # Does the sum if it is a subtraction
        plr_ans = int(input()) # Gets the user's answer
        if plr_ans == sum_ans:
            print("Correct!") # Prints correct
            score = score + 1 # Adds 1 to score
        else:
            print("Incorrect!")
        qno = qno + 1 # Adds 1 to qno


def plr_list_make(lines, listoreder):
    index = 0
    plr_names =[]
    plr_scores =[]

    for line in lines:
        if listorder == 1:
            column =0
            rev = False
    else:
       column = 1
       rev = True
    return sorted(zip(plr_names, plr_scores),key = lambda x:(x[column]),reverse = rev)


def fileUP(plr_name, score, line ):
    found = False
    index = 0
    for line in lines:
        if line.startswith(plr_name):
            line = line.strip("\n") + ","+str(score+"\n")
            lines[index] = line
            found = True
        index = index + 1
    if not found:
        lines.append(plr_name+"|" +str(score)+"\n")
    return lines


def save (plr_name, plr_class, score):
    filename = "QuizScore_"+plr_class+".txt"
    try:
        fileI = open(filename)
    except IOError:
        fileI = open(filename, "w+")
        fileI = open(filename)
    lines = fileI.readlines()
    fileI.close

    lines = FileUP(plr_name, score, lines)
    fileO = open(filename, "w")
    fileO.writelines(lines)
    fileO.close


def disp_list(): ## intialise_list
    student_list=[] 
    filename = "QuizScore_"+plr_class+".txt"
    try:
        ## open file read into list "lines"
        input_file = open(filename)
        lines = input_file.readlines()   ## read file into list "lines"
        input_file.close

        student_list = create_student_list(lines, listorder) ### update "lines" with student list as requested by user

        ## output sorted list
        for counter in range(len(student_list)):
            print ("Name and Score: ", student_list[counter][0], student_list[counter][1])    

    except IOError:
        print ("no class file!!!")



def menu():
    print ("1 Test")
    print ("2 Alphabetical")
    print ("3 Highscore")
    print ("4 Avg Score")

def Run():
    selection = 0
    while selection != 5:
        menu()
        option = int(input("Please select option: "))     
        if option == 1:
            name, plr_class = details()
            save(name, plr_class, Q())
        else:
            plr_class = input("input class ")
            disp_list(plr_class, option-1)
Run()

错误:

回溯(最近一次通话最后一次):
文件“C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py”,第 117 行,在 运行()
运行中的文件“C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py”,第 113 行 保存(名称,plr_class,Q())
文件“C:\Users\user\Documents\CharlieStockham\cgsca\ca2.py”,第 74 行,保存 行= FileUP(plr_name,分数,行) NameError: 未定义全局名称“FileUP”

【问题讨论】:

  • 问题标题很可爱,但没有说明问题。
  • 当我运行程序时,菜单功能可以工作,但是当你输入学生姓名和学生班级时它会崩溃。
  • 你能把这些错误告诉我们吗?
  • 您的函数 Q() 不返回任何内容,但您将其返回值 (None) 传递给 save()。也许这是您问题的根源。
  • 以下是正在发生的错误: Traceback(最近一次调用最后一次):文件“C:\Users\user\Documents\IBliminse\cgsca\ca2.py”,第 115 行,在 Run() 文件“C:\Users\user\Documents\IBliminse\cgsca\ca2.py”,第 110 行,在运行名称中,plr_class= details() TypeError: 'NoneType' object is not iterable

标签: python


【解决方案1】:

第 110 行:

        name, plr_class = details()

但是details 函数没有返回任何东西——所以Python 尝试将默认返回值None 分配给元组name, plr_class。它不能这样做,因为None 不是可迭代的(你不能给它分配两个东西)。要修复它,请将以下行添加到您的 details 函数中:

    return (plr_name, plr_class)

(我没有测试过。)

【讨论】:

  • 代码中的99个错误修复了一个错误再次运行代码中的137个错误:)
【解决方案2】:

我喜欢你的游戏,但它作为一个 mofo 有问题:P

scoreqno 未正确定义。在需要它们的函数中定义它们,全局定义它们或将它们作为参数传递给相关函数。

details() 不返回任何内容,但您仍然尝试使用其输出来定义其他两个变量。将return (plr_name, plr_class)添加到details()

每次您将用户输入转换为 int 而不检查其值时,如果无法转换 int,您的程序将崩溃。这适用于这里:

option = int(input("Please select option: "))

这里

plr_ans = int(input())#Gets the user's answer

和其他地方。

由于您的程序输入量很大,您可以创建一个函数,将预期的数据类型和可选字符串传递给该函数以显示给用户。这样您就不必编写 try/except 10 次,并且您的程序不会因意外输入而崩溃。

def fileUP(plr_name, score, line ): 中有for line in lines: 但未定义lines。因此,调用FileUP()save() 函数也会失败。另外,FileUPfileUP 不是一回事。你用大写的“f”调用函数,但函数的定义用小写的“f”调用它fileUP

在我们处理它的同时,def save (plr_name, plr_class, score): 中的文件处理看起来很奇怪。在 Python 中打开文件以进行简单读写的标准方法是通过with open()

disp_list() 应该接受一两个参数,但目前没有,所以会引发此错误:

TypeError: disp_list() takes 0 positional arguments but 2 were given

这里给出了这 2 个位置参数:

disp_list(plr_class, option-1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2013-10-08
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多