Python中的“未来”用于什么,如何/何时使用,以及它是如何工作的
Python中的“未来”用于什么,如何/何时使用,以及它是如何工作的,python,python-2.x,Python,Python 2.x,\uuuuu future\uuuuu经常出现在Python模块中。我不明白什么是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu以及阅读后如何/何时使用它 有人能举例说明吗 我收到的一些关于\uuuuu future\uuuu基本用法的答案似乎是正确的 但是,关于\uuuu future\uuuu的工作原理,我还需要了解一件事: 对我来说,最令人困惑的概念是当前python版本如何包含未来版本的特性,以及如何在当前python版本中
\uuuuu future\uuuuu
经常出现在Python模块中。我不明白什么是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
以及阅读后如何/何时使用它
有人能举例说明吗
我收到的一些关于\uuuuu future\uuuu
基本用法的答案似乎是正确的
但是,关于\uuuu future\uuuu
的工作原理,我还需要了解一件事:
对我来说,最令人困惑的概念是当前python版本如何包含未来版本的特性,以及如何在当前python版本中成功编译使用未来版本特性的程序
我猜当前版本包含了未来可能的功能。但是,这些功能仅可通过使用
\uuuuu future\uuuu
获得,因为它们不是当前的标准。如果我是对的,请告诉我。包含\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
模块后,您可以慢慢习惯于不兼容的更改或引入新关键字的更改
例如,对于使用上下文管理器,您必须在2.5中使用语句从uuu未来uu导入,因为with
关键字是新的,不应再用作变量名。为了在Python2.5或更早版本中使用with
作为Python关键字,您需要使用上面的导入
另一个例子是
from __future__ import division
print 8/7 # prints 1.1428571428571428
print 8//7 # prints 1
如果没有\uuuuu future\uuuuuu
的东西,两个print
语句都会打印1
内部区别在于,如果没有该导入,/
将映射到\uuuu div\uuu()
方法,而使用该方法时,将使用\uuu truediv\uu()
。(在任何情况下,/
调用\uuu floordiv\uuu()
)
关于print
:print
成为3.x中的一个函数,失去了作为关键字的特殊属性。因此,情况正好相反
>>> print
>>> from __future__ import print_function
>>> print
<built-in function print>
>>>
>>打印
>>>来自未来导入打印功能
>>>印刷品
>>>
当您这样做时
from __future__ import whatever
实际上,您使用的不是import
语句,而是一个。您读取了错误的文档,因为您实际上没有导入该模块
未来的语句是特殊的——它们改变了Python模块的解析方式,这就是为什么它们必须位于文件的顶部。它们赋予文件中的单词或符号新的或不同的含义。从文档中:
future语句是对编译器的一个指令,指示特定模块应使用Python未来特定版本中可用的语法或语义进行编译。future语句旨在简化到Python未来版本的迁移,这些版本会对语言引入不兼容的更改。它允许在每个模块上使用新功能,然后在该功能成为标准之前发布
如果您真的想导入\uuuuuuuuuuuuuuuuuuuuuu
模块,只需执行以下操作即可
import __future__
然后像往常一样访问它。它可以用来使用新版本中出现的功能,而旧版本的Python则会出现这些功能
比如说
>>> from __future__ import print_function
将允许您使用打印
作为一项功能:
>>> print('# of entries', len(dictionary), file=sys.stderr)
或者说“既然这是PythonV2.7,就使用在Python3中添加的PythonV2.7中添加的另一个‘print’函数。因此,我的‘print’将不再是语句(例如print“message”),而是函数(例如print(“message”,options)。这样,当我的代码在Python3中运行时,‘print’就不会中断。”
在
print_函数是包含“print”的新实现的模块,根据它在python v3中的表现
这有更多的解释:是一个伪模块,程序员可以使用它来启用与当前解释器不兼容的新语言功能。例如,表达式11/4
当前的计算结果为2
。如果执行它的模块启用了true以执行方式划分:
来自未来进口部门
表达式11/4
的计算结果将为2.75
。通过导入\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>模块并计算其变量,您可以看到新功能何时首次添加到语言以及何时将成为默认功能:
>>> import __future__
>>> __future__.division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
我发现非常有用的一个用途是\uuu future\uu
模块中的打印功能
在Python2.7中,我希望将来自不同print语句的字符打印在同一行上,不带空格
可以在结尾使用逗号(“,”)完成,但也会附加一个额外的空格。
上述声明在用作:
from __future__ import print_function
...
print (v_num,end="")
...
这将在不带空格的单行中打印每次迭代的v_num
值。在Python 3.0之后,打印不再只是一个语句,而是一个函数。它包含在PEP 3105中
此外,我认为Python 3.0包仍然具有这些特殊功能。让我们通过Python中的传统“金字塔程序”来了解其可用性:
from __future__ import print_function
class Star(object):
def __init__(self,count):
self.count = count
def start(self):
for i in range(1,self.count):
for j in range (i):
print('*', end='') # PEP 3105: print As a Function
print()
a = Star(5)
a.start()
Output:
*
**
***
****
如果我们使用普通的打印功能,我们将无法实现相同的输出,因为print()是带有一个额外的换行符。因此,每次执行内部for循环时,它都会将*打印到下一行。已经有一些很好的答案,但没有一个能够完整列出\uuuuuu future\uuu
语句当前支持的内容
简单地说,这个\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
语句迫使Python解释器使用该语言的更新功能。
它当前支持的功能如下:
嵌套的\u范围
在Python 2.1之前,以下代码将引发一个名称错误:
def f():
...
def g(value):
...
return g(value-1) + 1
...
from\uuuu future\uuuu导入嵌套的\u作用域
指令将允许启用此功能
生成器
引入了生成器函数,如t
def f():
...
def g(value):
...
return g(value-1) + 1
...
def fib():
a, b = 0, 1
while 1:
yield b
a, b = b, a+b
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
LEFT, DISABLED, NORMAL, RIDGE, END)
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
LEFT, DISABLED, NORMAL, RIDGE, END
from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END
with open('workfile', 'r') as f:
read_data = f.read()
>>> from __future__ import division
>>> division
_Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072)
(
PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
PY_MINOR_VERSION, # the 1; an int
PY_MICRO_VERSION, # the 0; an int
PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
PY_RELEASE_SERIAL # the 3; an int
)