首页 > 解决方案 > Python 中的命名条件和一本愚蠢的教科书——以及如何证明它们是错误的

问题描述

Python 的抽象经常被许多人视为魔术。来自 C 的背景,我非常清楚没有魔法这回事,只有由简单组件组成的冷硬代码产生抽象。

因此,当教科书和我的老师说我们可以“存储条件”或使用“命名条件”以提高可读性时,并说将布尔表达式分配给变量突然使其成为类似于宏的动态条件时,我失去了它。


编辑1:他们没有明确地说它像一个宏(直接引号放在引号内),因为我们不应该事先知道任何其他语言。

他们说“变量存储未评估的条件”的方式就像说它是一个宏,这是我的观点。他们通过他们的发音暗示它实际上相当于一个宏,只是没有说“宏”这个词。


这是代码形式的声明:

x,y = 1,2
less = x < y 
more = x > y

'''
less/ more claimed to store not boolean True/False but some magical way of storing the
expression itself (unevaluated, say like a macro) and apparently 
'no value is being stored to less and more'. 
'''

它被表现得好像一个人在做:

// C-style
#define less (x < y) 
#define more (x > y)

当然,这不是真的,因为所有lessmore存储在所谓的“命名条件”中只是 and 之间的运算符的返回xy

这是显而易见的,因为<, >, ==, <=,>=根据正式的手册页和规范,都具有布尔返回值,并且lessmore仅存储TrueorFalse布尔返回值,我们可以通过调用print()它们和/或调用它们来证明这一点type()

此外,更改 x 和 y 的值,比如通过做x,y = y,x不会更改 or 的值,less因为more它们存储的不是动态表达式,而是>or<操作数在初始值x和值上的静态返回y值。

问题不在于这种说法是对所谓的抽象的误解(它实际上不是抽象,类似的存储也可以在 asm 或 C 中实现),而是如何清楚有效地向我的老师表达它不工作类似于 C 宏,而是静态存储>or的布尔返回值。<

标签: pythonmacrosboolean-logicabstraction

解决方案


显然less = x < y,只查看 and 的当前值,x然后yTrueor存储False到变量less中。

如果我理解您和您的老师不同意的地方,那么你们两个对以下代码将打印出的内容有不同的想法:

x, y = 1, 2
less = x < y
print(less)
x, y = 2, 1
print(less)

推荐阅读