我本周开始学习编码所以我正在玩我正在创建的小程序,试图更好地理解它是如何工作的。
我制作的程序之一是Pig Latin翻译器,它会一直循环直到用户退出。该程序有效,但逻辑对我没有任何意义。
pyg = "ay" #Pig Latin words end with ay.
def translate(): #Creating a function.
original = input("Enter a word: ").lower() #Ask for input then convert to lower.
if len(original) > 0 and original.isalpha() : #isalpha() verifies only abc's and more than one letter.
first = original[0] #Assigns the first letter of the string to first.
latin = original[1:] + first + pyg #Adds original starting at 2nd letter with first and pyg.
print(latin)
else:
print("You did not enter a valid word, please try again.")
translate() #If you did not enter valid word, then call function again until you do.
translate() #Don't forget to actually call the function after you define it.
#Set run to False.
#Can be set to True if while (run != True) is set to while (run == True).
run = False
#Defining cont(). Ask for imput and error handling.
def cont():
loop = input("Would you like to convert another word? (y/n): ").lower()
if loop == "y" :
run = True
elif loop == "n" :
run = False
print("Thank you for using this program, have a nice day!")
exit()
else :
print("You did not enter a valid response, please try again.")
cont()
cont()
#Infinite loop as long as run is not equal to True.
while (run != True) :
translate()
cont()
我的问题是,为什么这个程序有效?我设置run为False,并设置循环运行只要运行!= True。没问题,但是当我定义cont()时,如果用户输入“y”,我设置run取值True。 True!= True应该是False(如果我理解正确的话)并且循环应该结束,而是它正在按照我的意愿工作。
这是我犯过的编码错误,还是我只是想错了?提前谢谢。
编辑:非常感谢所有回答的人。我还没有了解过局部和全局变量。
答案 0 :(得分:1)
run
函数中的cont
是局部变量。更改其值对while循环引用的全局变量没有影响。
答案 1 :(得分:1)
要扩展其他人已经说过的话,run
就这些行
if loop == "y" :
run = True
elif loop == "n" :
run = False
不是指
定义的相同run
#Can be set to True if while (run != True) is set to while (run == True).
run = False
run
函数中的 cont
是函数的局部变量,而不是全局定义的run
。
有几种(至少)方法可以解决这个问题。首选(imo)方法是让cont
返回要分配给run
的新值。那看起来像是
#Defining cont(). Ask for imput and error handling.
def cont(_run):
loop = input("Would you like to convert another word? (y/n): ").lower()
if loop == "y" :
return _run
elif loop == "n" :
return not _run
else :
print("You did not enter a valid response, please try again.")
return cont(_run)
...
#Infinite loop as long as run is not equal to True.
while (run != True) :
translate()
run = cont(run)
另一种(不太受欢迎的)方式是在run
函数中使用全局cont
变量。这是使用global
关键字实现的。
看起来像这样:
#Defining cont(). Ask for imput and error handling.
def cont():
global run
loop = input("Would you like to convert another word? (y/n): ").lower()
if loop == "y" :
run = True
elif loop == "n" :
run = False
print("Thank you for using this program, have a nice day!")
exit()
else :
print("You did not enter a valid response, please try again.")
cont()
**情侣旁注
在我的第一个示例中,当值为_run
时返回y
,当值为not _run
时返回n
。这样,您就可以将初始run
值更改为True,并更改while
条件,而无需更改cont
函数本身。
如果您使用全局,则根本不需要实际更改run
值,并且用户输入n
,因为您在函数返回之前退出。
最好将if
条件检查更改为
if loop in ("yes", "y"):
if loop in ("no", "n"):
因为很多人都没有阅读完整的说明:)
答案 2 :(得分:0)
我认为这可能是因为你的run变量的范围;因为你没有从你的cont函数返回运行。我相信你的!=真正的检查看到在该函数之外总是假的,但显然你可以在函数内成功结束程序。
答案 3 :(得分:0)
问题是run
中定义的cont()
变量与全局范围中定义的run
变量不同。 (如果您不确定我的意思,您可能需要查看https://docs.python.org/3.4/tutorial/classes.html#python-scopes-and-namespaces。也许更好的方法是让cont()
返回True
或{{1当你想要继续使用False
时,它也更直观,更易读。这就是我将如何重写它。
True