Python 我腌了我的元组
我对python还是新手。我正在为一个更大的项目设计框架。这个程序让你想到一个圆或正方形,然后问四个问题,然后决定答案 我正处于框架的最后一步,但遇到了一个问题。我得到“全局名称'qas1'未定义” getQuestion question='qas'全局名称'qas'中的第50行未定义 当我试图腌制我的元组时发生了这种情况 下面是我的加载程序,用于创建包含元组的pickle文件:Python 我腌了我的元组,python,tuples,pickle,Python,Tuples,Pickle,我对python还是新手。我正在为一个更大的项目设计框架。这个程序让你想到一个圆或正方形,然后问四个问题,然后决定答案 我正处于框架的最后一步,但遇到了一个问题。我得到“全局名称'qas1'未定义” getQuestion question='qas'全局名称'qas'中的第50行未定义 当我试图腌制我的元组时发生了这种情况 下面是我的加载程序,用于创建包含元组的pickle文件: import cPickle import os qas1 = [ ('Are you more like Wa
import cPickle
import os
qas1 = [
('Are you more like Waffle or a Pancake'),
('1. Waffle', 1, 0),
('2. Pancake', 0, 1)
]
qas2 = [
('Do you have a straight edge?'),
('1. Yes', 1, 0),
('2. No', 0, 1)
]
qas3 = [
('Are you simliar in shape to a lolipop?'),
('1. Yes', 0, 1),
('2. No', 1, 0)
]
qas4 = [
('Is the world rounded like a planet, or flat like a map?'),
('1. Rounded', 0, 1),
("2. Flat", 1, 0)
]
def hasFile():
print 'I see the file'
qas_file = open('qas.dat', 'r')
qas1 = cPickle.load(qas_file)
qas2 = cPickle.load(qas_file)
qas3 = cPickle.load(qas_file)
qas4 = cPickle.load(qas_file)
qas_file.close
confirmer()
def noFile():
print 'I dont see a file...'
saver()
def confirmer():
print qas1
print qas2
print qas3
print qas4
def saver():
qas_file = open('qas.dat', 'w')
print 'No worries, creating one now'
cPickle.dump(qas1, qas_file)
cPickle.dump(qas2, qas_file)
cPickle.dump(qas3, qas_file)
cPickle.dump(qas4, qas_file)
qas_file.close
print 'all done'
fname = "qas.dat"
if os.path.isfile(fname):
hasFile()
else:
noFile()
代码运行正常,但当我试图使用它创建的文件时,遇到了问题
import cPickle
#Counters
counterCircle = 0
counterSquare = 0
# tuples
def hasFile():
print 'I see the file'
qas_file = open('qas.dat', 'r')
qas1 = cPickle.load(qas_file)
qas2 = cPickle.load(qas_file)
qas3 = cPickle.load(qas_file)
qas4 = cPickle.load(qas_file)
qas_file.close
#varibles Im made to assign
messageDisplayed = 0
question = 'beer'
#prints to screen
def showQaA():
print question[0]
print question[1][0]
print question[2][0]
#recieves and implements responses
def getResponce():
global counterCircle
global counterSquare
global qas1, qas2, qas3, qas4
ansew = raw_input('>> ')
if ansew == "1":
counterSquare = counterSquare + question[1][1]#(+1)
counterCircle = counterCircle + question[1][2]#(+0)
elif ansew == "2":
counterSquare = counterSquare + question[2][1]#(+0)
counterCircle = counterCircle + question[2][2]#(+1)
print counterCircle
print counterSquare
#Gets the current tuple infomation to display (Will be more advanced)
def getQuestion():
global question
if messageDisplayed == 0:
question = qas1
elif messageDisplayed == 1:
question = qas2
elif messageDisplayed == 2:
question = qas3
elif messageDisplayed == 3:
question = qas4
else:
print 'youre screwd'
#figures out and prints results
def results():
print "This is the circle results", counterCircle
print "This is the square results", counterSquare
if counterSquare < counterCircle:
print "You are a circle!"
elif counterSquare > counterCircle:
print "You are a square!"
else:
print "You are the elusive squircle!"
#mainLoop currently set to 4 questions
hasFile()
while messageDisplayed <=3:
getQuestion()
showQaA()
getResponce()
messageDisplayed +=1
results()
导入cPickle
#计数器
反圆=0
对角尺=0
#元组
def hasFile():
打印“我看到文件了”
qas_文件=打开('qas.dat','r')
qas1=cPickle.load(qas_文件)
qas2=cPickle.load(qas_文件)
qas3=cPickle.load(qas_文件)
qas4=cPickle.load(qas_文件)
qas_文件.close
#我要分配的变量
messagedisplated=0
问题=‘啤酒’
#打印到屏幕
def showQaA():
打印问题[0]
打印问题[1][0]
打印问题[2][0]
#接收并执行响应
def getresponse():
全局反循环
全局对角尺
全局qas1、qas2、qas3、qas4
ansew=原始_输入('>>'))
如果ansew==“1”:
副方=副方+问题[1][1]#(+1)
反循环=反循环+问题[1][2]#(+0)
elif ansew==“2”:
副方=副方+问题[2][1]#(+0)
反循环=反循环+问题[2][2]#(+1)
打印计数器圆
打印对角尺
#获取要显示的当前元组信息(将更高级)
def getQuestion():
全球问题
如果messageDisplayed==0:
问题=qas1
elif messagedisplated==1:
问题=qas2
elif messagedisplated==2:
问题=qas3
elif messagedisplated==3:
问题=qas4
其他:
打印“你疯了”
#计算并打印结果
def results():
打印“这是循环结果”,反循环
打印“这是方形结果”,对方形
如果对角规<对角规:
打印“你是一个圆!”
elif反方形>反圆形:
打印“你是一个正方形!”
其他:
打印“你是难以捉摸的哑炮!”
#mainLoop当前设置为4个问题
hasFile()
在第二个文件中显示消息时,qas[1-4]都是hasFile
函数的本地文件。使其全球化,您的代码将起作用:
def hasFile():
global qas1, qas2, qas3, qas4
# etc
同样的错误也出现在第一个代码中,但更难注意到——这四个变量仍然只在函数中赋值——这会隐藏同名的全局变量,使它们保持不变。但是,由于加载它们不会更改其内容,因此它似乎可以工作。在hasFile()中,您正在设置qas1、qas2、qas3和qas4的值,但您没有将它们声明为全局优先,这意味着它们不在全局范围内设置
# tuples
def hasFile():
global qas1, qas2, qas3, qas4 # <-- global declaration
print 'I see the file'
qas_file = open('qas.dat', 'r')
qas1 = cPickle.load(qas_file)
qas2 = cPickle.load(qas_file)
qas3 = cPickle.load(qas_file)
qas4 = cPickle.load(qas_file)
qas_file.close
#元组
def hasFile():
全局qas1、qas2、qas3、qas4 35;当您仅使用新值分配像qas这样的变量时,就像您在hasFile()
中所做的那样,您正在创建一个局部变量。。。不是全球性的。在分配给全局qas之前,请确保指定它 经典问题标题:)旁注:在hasFile
中,您已经编写了qas_文件。关闭。这会导致引用qas_文件
的close
方法,但不会调用它。您需要参数(qas_file.close()
)或文件句柄,直到python关闭。谢谢!我仍然不知道如何在函数中传递变量,Ima noob。现在我正试图摆脱我的全局变量。所有的论坛似乎都建议像plauge一样避免使用它们。我可以把“问题”转到本地,但我的计数器有问题。我唯一的理想方法是尝试将它们保存到txt文件或对它们进行pickle,然后在循环重新启动时重新加载。这是一种不好的做法吗?@user3479560您可以将变量存储在程序外、pickle或文本文件中,但这并不是很有用,除非您希望保存一些内容以供将来执行程序。我认为在主循环中管理它们将是最好的。可以让getResponse()为正方形或圆形返回不同的值。我建议您熟悉函数、参数、返回内容等,这样您就可以看到有多少程序是结构化的,并且让函数在没有全局变量的情况下协同工作。有很多东西需要学习,但您的代码将更有组织性和可重用性。祝你好运@用户3479560如果你想找教程的话,我喜欢这本书。