最近,我一直在阅读一些关于的有趣文章。在一篇文章中,有人发明了一种新的语言,并让运行它。在另一篇文章中,有人在中运行一个虚拟机。后者启发我提出了下面这个问题。
你能在中运行一个交互式会话吗?
是的,你可以!而且知道相当多的知识!我玩了一下,给它一些不同的提示和指令,然后测试了的极限和对语言的理解。我被对的理解所震惊了。它理解并给出了正确的代码结果,这些代码包含以下内容:
还能够编写代码,解决我交给它的任务。
在这篇文章中,我将通过我与的对话摘录来强调所做的一些令人惊奇的事情,以及我所能发现的一些错误。
本节将包含我和之间的对话记录。
对话一
我希望你能模拟一个Python解释器。我将写Python代码,你的回答是REPL提示,然后是我的输入,最后是下面的结果。不写任何解释,除非某行以#?结束。如果有一行以#?结尾,在你的回答中加入对结果的解释。我输入的所有内容都应该是你可以直接在 REPL 中执行的 Python 代码。如果我需要与你互动,我将以#!开始一行。当我退出 REPL 时,我们将恢复正常的交互。
好的,我将尽力为你模拟一个Python解释器。请继续输入你的Python代码。
>>> 2 + 24
>>> "hello" + "world"'helloworld'
>>> [1, 2, 3] * 3[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> #?# The "#?" at the end of this line is a comment indicating that you# would like me to provide an explanation of the result. In ! this# case, there is no result since this line is just a comment and does# not contain any valid Python code.
>>> def add(a, b):... return a + b...>>> add(2, 3)5
>>> #!# To interact with me, start a line with "#!". Otherwise, I will# assume that everything you type is Python code to be executed in# the REPL.
马上,对我来说就有点太啰嗦了……。但至少它显示了理解我想要的东西的迹象,考虑到它给出的例子和它说的关于#!和#?的事情。
print("Hello, world!")
>>> print("Hello, world!")Hello, world!
好了,似乎理解了基本的函数打印,它知道REPL提示(>>)和没有提示的结果之间的区别。
x = 3y = 15
>>> x = 3>>> y = 15
x + yy ** xlist(range(y))
>>> x + y18>>> y ** x3375>>> list(range(y))[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
在这里,显示它记住了我们分配给以前的变量的值,并且能够使用这些值!
def fib(n): if n <= 1: return 1 return fib(n - 1) + fib(n - 2)
>>> def fib(n):... if n <= 1: return 1... return fib(n - 1) + fib(n - 2)...
显示它了解 REPL,因为多行块(如函数定义)以>>>前缀开始,但随后的行得到前缀….。
更酷的是,我们可以使用我们刚刚定义的函数,在一个列表理解中使用它,用“#?”来要求对方解释正在发生的事情。
[fib(i) for i in range(y)] #?
>>> [fib(i) for i in range(y)] #?[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
理解了列表和递归函数。它给出了正确的结果,解释了它,它甚至给了我们与所示的列表理解等价的for循环。难道会让我的列表变得毫无用处吗!?
在这一点上,我想知道我们运行的是什么版本。
import syssys.version_info
>>> import sys>>> sys.version_infosys.version_info(major=3, minor=10, micro=2, releaselevel='final', serial=0)这段代码导入了 sys 模块并访问了 version_info 属性,它是一个命名的元组,包含了关于当前使用的 Python 版本的信息。major属性指的是主要版本号(例如,3代表Python 3),minor属性指的是次要版本号(例如,10代表Python 3.10),micro属性指的是微型版本号(例如,2代表Python 3.10.2)。releaselevel属性表示版本的稳定性(例如,'final'表示稳定的版本,'alpha'表示alpha版本),serial属性是一个整数,在同一版本级别内的每个版本都是递增的。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...