gpt4 book ai didi

python - 如何显示自己的源代码的副本

转载 作者:行者123 更新时间:2023-12-03 23:44:49 26 4
gpt4 key购买 nike

问题
我试图了解程序是否可以打印自己的源代码,
我找到了以下源代码:

print((lambda str='print((lambda str=%r: (str %% str))())': (str % str))())
运行时,输出与源代码相同:
print((lambda str='print((lambda str=%r: (str %% str))())': (str % str))())
1.谁能详细解释一下源代码的语法?
2. 程序怎么可能打印自己的源代码?

最佳答案

首先要记住:这个表达式不会打印你放置它的任何文件的完整源代码。只有在这种特殊情况下,当源代码只包含这一行(后跟一个换行符,如果我们'正在迂腐),当这个文件运行时它会打印自己的源代码。
现在让我们把它分开,从头开始(在每个阶段运行它的输出应该是相同的):

print((lambda str='print(lambda str=%r: (str %% str))()': (str % str))())
首先,让我们将 lambda 表达式与 print 语句分开(您可以阅读有关 lambda 表达式 here 的信息,它们本质上是用于定义“小型匿名函数”的简明符号):
f = lambda str='print(lambda str=%r: (str %% str))()': (str % str)

print(f())
现在,为了更具可读性,我们可以用等效的函数替换这个 lambda 表达式:
def f(str='print(lambda str=%r: (str %% str))()'):
return str % str

print(f())
现在我们可以看到 print语句等效于:
str = 'print(lambda str=%r: (str %% str))()'

print(str % str)
这是旧式字符串格式的示例,您可以阅读有关 here 的更多信息。 .本质上,当字符串后跟 % 时运算符,它在概念上类似于 string.format方法。
特别是,如果我们有像 str1 % obj 这样的表达式,子字符串 "%%" 的任何实例在 str1被替换为子字符串 "%" ,如果子串 "%r"只出现一次,它会被调用 repr(obj) 的结果替换.举个具体的例子,调用 print("Test string: %% %r %%" % 23) 的输出是 Test string: % 23 % .
现在,回到Quine,我们所拥有的相当于:
r_string = repr('print(lambda str=%r: (str %% str))()')

print('print(lambda str={}: (str {} str))()'.format(r_string, "%"))
如果您对 Python 有合理的理解(您可能需要查找 the repr functionthe string.format method ),这些语句应该是有意义的,并且输出是:
print((lambda str='print(lambda str=%r: (str %% str))()': (str % str))())
这是原始源代码。
PS,如果您的问题不是“这种语法是如何工作的”而是“有人最初是如何想出这个特定示例的”,那么(在我的脑海中)我不知道。
但总的来说,程序很容易打印出自己的源代码。它所要做的就是包含语句 print(*open(__file__), sep="") .在此示例中,保存此语句的文件也可以包含其他命令。 __file__是 Python 中的一个特殊变量,它以字符串形式包含源代码的文件名,以及 *做“可迭代解包”。
编辑:我认为您的原始代码可能缺少一些括号?我认为应该是这样的(注意字符串文字中 print 之后的 2 个左括号,以及字符串文字末尾之前的额外右括号):
print((lambda str='print((lambda str=%r: (str %% str))())': (str % str))())

关于python - 如何显示自己的源代码的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63465695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com