python - 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)
当然,这不是真的,因为所有less
和more
存储在所谓的“命名条件”中只是 and 之间的运算符的返回x
值y
。
这是显而易见的,因为<
, >
, ==
, <=
,>=
根据正式的手册页和规范,都具有布尔返回值,并且less
或more
仅存储True
orFalse
布尔返回值,我们可以通过调用print()
它们和/或调用它们来证明这一点type()
。
此外,更改 x 和 y 的值,比如通过做x,y = y,x
不会更改 or 的值,less
因为more
它们存储的不是动态表达式,而是>
or<
操作数在初始值x
和值上的静态返回y
值。
问题不在于这种说法是对所谓的抽象的误解(它实际上不是抽象,类似的存储也可以在 asm 或 C 中实现),而是如何清楚有效地向我的老师表达它不工作类似于 C 宏,而是静态存储>
or的布尔返回值。<
解决方案
显然less = x < y
,只查看 and 的当前值,x
然后y
将True
or存储False
到变量less
中。
如果我理解您和您的老师不同意的地方,那么你们两个对以下代码将打印出的内容有不同的想法:
x, y = 1, 2
less = x < y
print(less)
x, y = 2, 1
print(less)
推荐阅读
- c# - Why did fluent assertion fail but Assert passed for an enum?
- c - 添加二进制字符串时结果不正确
- mips - 试图理解 SYSCALL 5 示例,文字 % 占位符的顺序令人困惑
- ruby-on-rails - 导轨 5.2 | Select2 多个逗号分隔的参数
- javascript - 本机反应中的数字总和
- java - 自动映射除一个以外的所有字段,该字段应通过其他函数传递
- java - 同步消费者 - 生产者与 java 中的线程
- java - 在java中手动触发CPU缓存写回:可能吗?必要的?
- java - 如何知道这个字符对应的Unicode?
- amazon-web-services - 使用 Runcloud 的 AWS Lighsail 网站显示网站不可用