理解 Python 中的逻辑(Learn Python the Hard Way 练习 27)

Posted

技术标签:

【中文标题】理解 Python 中的逻辑(Learn Python the Hard Way 练习 27)【英文标题】:Understanding logic in python (Exercise 27 of Learn Python the Hard Way) 【发布时间】:2011-05-25 15:52:23 【问题描述】:

有人可以向我解释一下如何艰难地学习python的练习27吗?

这是一张图片,显示了我不明白的部分。

是说假设表格的左列是真的,答案是真的吗?

例如,如果 x = y 不为假,那么 x=y 是否为真?是的。

但是.. 如果 x = y 为假且为真,那么 x=y 是否为真?没有??

【问题讨论】:

只有我一个人想知道为什么有人会记住这些吗? 这本书是个笑话。至少,我认为是;它以前出现在这里。我不敢相信人们真的试图从中学习 Python……是吗? True/False 是布尔值。这些表描述了如何组合布尔值。一个条件永远不会既真又假(即使在现实生活中,除非你是神秘主义者),并且是真或假(由于过于简单化,这个条件在现实生活中并不是真的)。​​ 当他们说这是“艰难的道路”时,他们不是在开玩笑。 我想如果你不喜欢这些,那么你真的会讨厌 XOR 的...... 【参考方案1】:

对于每个表,如果输入(左列中的表达式),则结果为(右列中的对应值);表头显示正在解释的运算符。因此,例如,如果您输入“not True”作为表达式,结果将为 False。

编辑:

Geeze Louise - 看,这真的很简单。例如 AND 运算符表:

If a is True  and b is True,  then a AND b is True
If a is True  and b is False, then a AND b is False
If a is False and b is True,  then a AND b is False
If a is False and b is False, then a AND b is False

这就是表格试图告诉您的全部内容 - 这就是 AND 运算符的工作原理。它接受两个真或假值,并根据它们的组合方式返回结果。该表列出了每种可能的输入组合及其结果——它完整地描述了操作员可以做的所有事情。这就是它想要表达的全部内容。

对于其他运营商也是如此:

NOT is "the opposite of": if a is False, then Not a is True
AND is true if "both of" a and b are true
OR is true if "at least one of" a or b is true
== is "equal to", true if a and b have the same value
!= is "not equal to", true if a and b have different values

等等

编辑2:

如果您将其中一些运算符视为电路,可能会更容易(实际上,这种类比正是您的计算机的构建方式!)。

AND 是一个时序电路 - 通电连接到开关 A 的导线将开关 B 连接到灯泡。只有当开关 A 开启且开关 B 也开启时,灯泡才会准确开启。

OR 是一个并联电路 - 导线将 A 切换到灯泡,并将 B 切换到灯泡。如果任一开关都打开(或两个都打开),则灯泡亮。

== 是一对双向开关 - 仅当两个开关都打开或两个开关都关闭时,灯才会亮。

这有帮助吗?

【讨论】:

谢谢。到目前为止,这个答案是最有帮助的,但是我不明白为什么如果 a 为真且 b 为真,那么 a AND b 为真。两者都是假的。请参阅我已更新的原始帖子,以获取显示我不理解哪些内容的图片(与我发布此问题时保持不变)。 @tobe: a and b定义ab 都为真时为真。 好的,我可以记住这一点,但如果我能理解为什么会更容易。 @tobeannounced:这就是AND的定义;这就是它的作用。只有当 a 为真且 b 也为真时,a AND b 才准确得出 True。 太棒了!编辑是一种很好的思考方式!在我看到之前,我已经用 5 分钟的记忆学会了它们,但仍然非常有用。再次感谢【参考方案2】:

这是一个truth table:所描述的操作(orand==)都可以认为只适用于TrueFalse。在这种情况下,要完整地描述运算符,您只需要列出所有可能的输入即可。

因此,例如,运算符or定义为:

(True or True) is True
(True or False) is True
(False or True) is True
(False or False) is False

这完全解释了or 对布尔值的作用。


如果您有兴趣,该 wiki 页面实际上列出了所有可能的布尔二元运算符:

0. Opq, false, Contradiction
1. Xpq, NOR, Logical NOR
2. Mpq, Converse nonimplication
3. Fpq, ¬p, Negation
4. Lpq, Material nonimplication
5. Gpq, ¬q, Negation
6. Jpq, XOR, Exclusive disjunction
7. Dpq, NAND, Logical NAND
8. Kpq, AND, Logical conjunction
9. Epq, XNOR, If and only if, Logical biconditional
10. Hpq, q, Projection function
11. Cpq, if/then, Logical implication
12. Ipq, p, Projection function
13. Bpq, then/if, Converse implication
14. Apq, OR, Logical disjunction
15. Vpq, true, Tautology

【讨论】:

我不明白为什么会这样:False and True = False(是因为它不能两者兼有吗?),True and True = True(如果它是假的呢?)。我得到了最后两张桌子很好 and 是一个运算符,就像所有其他运算符一样:它接受两个值并返回一个。在这种情况下,如果两个输入都是True,则返回True,否则返回False 我个人会使用is 而不是=;它读起来更好,并且在 Python 中有效:True or False is True。 @tobeannounced:“下雨了吗?没有下雨吗?”显然不是; True and False is False(或False and True is True,如果你所在的地方没有下雨。) True or True = True 之类的语句放入代码格式中可能会使人们感到困惑。你不能在 Python 代码中使用它,因为 True or True 不是 L-value 再次感谢。我更新了图片以显示我没有得到的图片 - 所有这些都基于我相信的相同理论。【参考方案3】:

我发现“真的吗?”标题有点误导。它应该是“值”或“结果”或类似的。所以,基本上True or False 的值(或结果)是True(第二个表),就像3 + 5 的值(或结果)是8。这就像算术,仅此而已。

【讨论】:

【参考方案4】:

真值表就像时间表一样。它们使您能够根据输入找到逻辑运算的结果。在类比中,乘法被替换为合取(and)、析取(or)等。

这可能有助于您思考真值表方法的一些潜在态度:

    “and”和“or”的含义不会根据上下文而改变。这与自然英语完全不同,在自然英语中,诸如“再说一遍,我会打断你的腿”和“你要吃那个还是把它扔进垃圾桶?”之类的语句,意思是“和”和“或" 受到周围环境的影响。

    涉及和、或、非等的逻辑语句是真还是假,取决于组件语句的真假。陈述的任何其他含义或含义之间的关系是不相关的。因此,“1=1 否则你很愚蠢”是简单、真实且没有问题的,而在正常对话中它可能会引起一些反对意见。

基于这两个假设,仅使用个人(“A”、“B”)是否为真的信息,就可以断然判断“A 或 B”形式的任何陈述是否为真。这就是真值表的作用。

希望这会有所帮助。

【讨论】:

【参考方案5】:

这并不难理解。它是一个介词。

假设有人说我:“他一只手拿着一个苹果并且另一只手拿着一个苹果”但我一只手只有一个苹果,那么那个人刚刚发表的声明是假的。

因此介词:a AND b 是说 a 和 b 都是真的,所以如果 a 是假的,那么介词就是假的。

比较棘手的是 OR。 OR 介词表示 2 中至少有一个必须为真,但如果它们都为真,则该陈述仍然为真,因为“2 中至少有 1 个为真”

所以这就像有人说:“我知道那个人至少一只手上拿着一个苹果”,即使我每只手上都有一个苹果,他们也不会撒谎,对吧?因此他们的说法是正确的。

【讨论】:

【参考方案6】:

左边的问题,右边的答案。

真 == 真 |是的 真 == 假 |错误

【讨论】:

【参考方案7】:

你为什么要记住这些?

您认为(例如)1 == 0 不正确是否符合逻辑?

【讨论】:

LOL - 这就是为什么它是困难的方式 比较的真值可能是显而易见的。布尔运算的真值几乎没有。有些符合直觉,有些则不符合(想想暗示,False => False is True)。我记得记住布尔运算的结果,我希望更多的程序员能记住他们的分支条件。【参考方案8】:

在上述所有标题中,将 whiteout 应用于“True?”标题,并写在“结果”中。然后就清楚多了。

【讨论】:

【参考方案9】:

曾经有一个人叫Boole。他有兴趣用真值“计算”,就像其他人用自然数计算一样。由于他是一名数学家,他知道他必须做什么来定义一个新的“微积分”或“代数”:找到一组,并找到一组运算 根据这些值,对某些值应用操作会再次生成基集的值。

他的新代数的值集只有两个,TrueFalse。然后他发明了“和”、“或”和“非”运算。为了与代数的数学规则保持一致,这些运算必须对来自值集的任何输入进行处理(无论它们有两个输入还是一个),并从值集中产生一个结果。由于在这种情况下没有更好的方法来实现这一点,因此对于每个操作,他列出了所有可能的参数值并为它们分配了一个结果。这就是你在真值表中看到的。

现在,正如您所发现的,结果的分配有点随意。有些人可以受到常识的激励,有些人则不能。 (其他海报试图激发你的一些“红点”的结果)。不要太努力地与之抗争。如果您可以在常识逻辑中找到动机,那很好,如果没有,请不要担心。布尔不得不以某种方式修补他的表格,以使他的操作“全面”。将“3+4”的结果命名为“7”也没有真正的逻辑。这就是我们记住这些基本内容的原因:)。

【讨论】:

以上是关于理解 Python 中的逻辑(Learn Python the Hard Way 练习 27)的主要内容,如果未能解决你的问题,请参考以下文章

scikit learn (python) 中的 Meanshift 不理解数据类型

Python - Learn Note

scikit-learn 中的逻辑回归特征值归一化

Scikit-learn 逻辑回归的性能比 Python 中自己编写的逻辑回归差

python中的逻辑回归测试输入格式帮助

在 Python 中实现逻辑回归时 Scikit-learn ValueError