2

作为 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 中实现这一点,需要更改打印语法(添加括号),但出现的另一个问题是错误“NameError: global name 'raw_input' is not defined”。我在学习中经常看到这个问题。当我在 Python2 中运行它时似乎没有出现,但在 3 中似乎需要将它声明为全局。但是,当我将“global raw_input”添加到函数中时,它似乎不起作用(在其他情况下,每次我这样做时它都起作用。)有人能告诉我我做错了什么吗?另外,我听说声明全局变量是在不必要时养成的坏习惯,那么处理它们的最佳方法是什么?

4

2 回答 2

7

raw_input()已在 Python 3 中重命名,input()请改用(旧的 Python 2input()已被删除)。参见PEP 3111

有关详尽的概述,请参阅Python 3.0 中的新增功能。还有Dive into Python 3 概述

于 2013-02-26T18:50:39.650 回答
0

修改Martijn 的回答,对于这些小的不兼容性,您可以使用以下一般技巧:

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.7print确实接受元组。这使得一些 Py3 语法在 Py2.7 中工作。简而言之,您可以只使用括号:

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 的东西,你实际上可以通过从future导入东西来在 Py2.7 中启用完整的 Py3 语法:

from __future__ import print_function

然后你不需要在write()和之间切换print()

在实际应用程序中,这完全取决于您是否以及如何与其他人的代码(包、团队中的其他开发人员、代码发布要求)进行交互,以及 Python 版本更改的路线图是什么。

于 2013-02-27T10:20:27.397 回答