xuzhengfu / pilot

进入编程世界的第一课
1 stars 0 forks source link

p1-4-structure-3 第四章 程序的基本结构(三):逻辑判断与分支 #22

Open xuzhengfu opened 4 years ago

xuzhengfu commented 4 years ago

1. 理解 逻辑判断与分支的意义

如果源代码是我们写出来的故事,那么 “逻辑判断与分支” 就是故事中的情节编排,是场景之间的关联、排列和衔接 —— 这一点程序和小说、影视剧不那么相近,倒是更像电子游戏。游戏是互动性最强的艺术形式,可以根据玩家的行为走向不同的情节,发生不同的事件和冲突,这种分支多样性极大地增加了表现力和趣味性。

程序也一样,如果一个程序只能顺序一条一条指令执行,能表达的东西就太少了。我们需要根据输入的不同执行不同的指令,最终给出不一样的结果,这样程序才有价值。所以所有的编程语言都会提供逻辑判断和分支执行的能力。

2. 了解 if...else 语句

所谓分支,其实也很简单,就是 “如果这样就 A 否则就 B”,通过这个句式的组合可以实现无穷无尽的变化,这个句式翻译成 Python 的语法就是:

if X:
    A
else:
    B

X 是一个 “逻辑判断”,其结果要么是真(True)要么是假(False);A 和 B 是两个代码段(code block),分别缩进以表示从属于 ifelse。上面的代码意思是:如果 X 是真就执行代码段 A,否则就执行代码段 B

Python 还可以连着写好几个 if,比如:

if X:
    A
elif Y:
    B
else:
    C

这里的 elifelse if 的简化写法,整个意思是:如果 X 是真就执行 A(不管 Y 如何),否则继续判断 Y —— 如果 Y 是真就执行 B,否则就执行 C。

3. 了解 逻辑表达式

只要最终给出一个逻辑真值或假值的东西 都可以算作 “逻辑表达式”,我们大致分分类可以有这么些:

  • 布尔类型的变量或者值,要么是 True 要么是 False
  • 上一章介绍的 大小比较操作符 的运算结果,例如 a <= 6 a + b == c 这类;
  • 返回布尔值的函数,例如我们上一章介绍的 isinstance()
  • 上面这些东西通过上一章介绍的 逻辑运算操作符 组合起来,例如 (a > 1) and (a <= 6) isinstance(x, int) or isinstance(x, float)

这些东西通称 “逻辑表达式”,因为其结果最终都是一个逻辑真值或者假值,根据其真假 if...else 语句就知道到底应该执行哪一个分支。

4. 了解 “万物皆为布尔值”

上一节列出了几类 逻辑表达式,它们都可以放在 if 后面做逻辑判断,但可以放在 if 后面的远不止这些,事实上几乎任何东西都可以。因为 Python 提供了一组规则来判断一个值 “相当于” 逻辑真 还是 假,这种定义是在所谓 “合理类比” 和方便性的基础上做出的,比如:

  • 数字 0 “相当于” 假,而其他数字都相当于真;
  • 空字符串 “相当于” 假,非空的字符串 “相当于” 真。

其他很多情形也类似,一般来说 0 啊、空啊之类的都 “相当于” 假,其他就算 真 了。如果我们搞不清楚某个东西相当于 真 还是 假,可以借助于内置函数 bool(),这个函数可以把任何东西变成布尔值(True 或者 False)。

这种 “相当于” 的逻辑,可以帮助我们写出更简洁的代码,比如下面两段代码是完全等价的:

a = 42
if n != 0:
    a = a / n
a = 42
if n:
    a = a / n

下面两段也完全等价:

s = input('请输入您的姓名')
if s == '':
    print('姓名不可为空,请重新输入')
s = input('请输入您的姓名')
if not s:
    print('姓名不可为空,请重新输入')

最后这个例子里的 input() 也是 Python 内置函数,它的作用是提示用户输入点什么,并把用户输入的东西作为函数值返回。

小结

  • "根据一个逻辑判断做分支执行" 的能力 使得计算机程序真正开始变得 “智能”,程序中的角色(变量与值)和交互(操作符与函数)通过它才最终编排成有用的东西;
  • if...else 的语法简单直观,但通过各种逻辑表达式组合可以实现丰富的逻辑选择;
  • Python 中的几乎任何值都能转换为布尔值 TrueFalsebool() 函数可以告诉我们特定值对应的是 逻辑真 还是 假。

Logging

2020-02-15 20:40:46 initialize