作为Python的新手,我有点学习Python2和3之间的一些差异。在Python课程中,似乎有些事情需要在代码中进行更改才能使其工作在3.这是代码;
def clinic():
print "In this space goes the greeting"
print "Choose left or right"
answer = raw_input("Type left or right and hit 'Enter'.")
if answer == "LEFT" or answer == "Left" or answer == "left":
print "Here is test answer if you chose Left."
elif answer == "RIGHT" or answer == "Right" or answer == "right":
print "Here is the test answer if you chose Right!"
else:
print "You didn't make a valid choice, please try again."
clinic()
clinic()
要在Python 3中完成这项工作,需要更改打印语法(添加parens),但出现的另一个问题是错误“NameError:全局名称'raw_input'未定义”。我在学习中经常看到这个问题。当我在Python2中运行它时似乎没有出现,但在3中它似乎需要将它声明为全局。但是,当我向函数添加“global raw_input”时,它似乎不起作用(在其他情况下,每次我都这样做时它都有效。)有人能告诉我我做错了什么吗?另外,我听说声明全局变量是一种不习惯的坏习惯,那么处理它们的最佳方法是什么?
答案 0 :(得分:7)
raw_input()
已在Python 3中重命名,请改用input()
(并删除旧的Python 2 input()
)。请参阅PEP 3111。
有关详尽的概述,请参阅What's new in Python 3.0。还有Dive into Python 3 overview。
答案 1 :(得分:0)
修改Martijn's answer,这是你可以为这些小的不兼容性做的一般技巧:
try:
input_func = raw_input
except NameError:
raw_input = input
之后,您可以在脚本中使用raw_input
和Py2和Py3。 unicode
和byte
类型可能需要类似的内容。
由于您表示您对从> = Py2.7迁移到Py3感兴趣,您应该知道Python 2.7主要是Python 2.6,其中包含大量Py3内容。
因此,虽然print函数在技术上仍然是Py2.7中的语句,而Py3中的函数,但Py2.7 print
确实接受元组。这使得一些Py3语法在Py2.7中起作用。简而言之,您可以使用parantheses:
print("Here is the test answer if you chose Right!")
要打印空行,两种版本中使用的最佳方法是
print("")
默认情况下,在不添加换行符的情况下进行打印我正在回归write()
,例如:
import sys
sys.stdout.write("no newline here")
sys.stdout.write(" -- line continued here, and ends now.\n")
另一方面,对于很多Py3的东西,你可以通过从the future导入东西来实际在Py2.7中启用完整的Py3语法:
from __future__ import print_function
然后您无需在write()
和print()
之间切换。
在实际应用程序中,这一切都取决于您是否以及如何与其他人的代码(包,您团队中的其他开发人员,代码发布要求)进行交互以及您的Python版本更改路线图。