30天Python入门到进阶——第5天:流程控制

时间:2022-09-29 14:37:17

30天Python入门到进阶——第5天:流程控制

已经进行了四天的Python学习体验。到目前为止,已经能够涵盖 Python 的一些基本语法以及数据类型,以及如何使用内置函数和方法以及一些最佳实践对它们执行操作。这可能是 Python 的枯燥部分。今天短期目标是理解逻辑和条件编程,以及在 Python 中使用循环重复任务。这可是很有意思的!


流程控制

流程控制指的是代码运行逻辑、分支走向、循环控制,是真正体现我们程序执行顺序的操作。流程控制一般分为顺序执行、条件判断和循环控制。这里面体现了一种传统编程中的“因果关系”,也就是有什么样的因就产生什么样的果,有什么输入就会有相应的输出,同一个输入不管执行多少次必然得到同样的输出,所有的都是确定的、可控的。与之相对的则是最近火得一塌糊涂的人工智能,比如机器学习、神经网络和深度学习,这些不再是“因果关系”编程,而是“统计关系”编程,同一个输入每次的执行结果有可能不一样。


流程图

再简要介绍一下流程图。程序流程图和伪代码在本质上其实是一样的,只不过一个用文字表达一个用图片表达,图片画着费点事,但看着直观,文字书写方便,但不够直观。

在程序流程图绘制过程中,主要使用下图中的图标:

30天Python入门到进阶——第5天:流程控制

通过带方向的箭头和相应的说明文字,连接各图标,形成了流程图,例子如下:

30天Python入门到进阶——第5天:流程控制

顺序执行

虽然我们有各种流程判断、循环、跳转、控制、中断等等,但从根本上程序还是逐行顺序执行的。

Python代码在执行过程中,遵循下面的基本原则:

  • 普通语句,直接执行;
  • 碰到函数,将函数体载入内存,并不直接执行
  • 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行
  • 碰到if、for等控制语句,按相应控制流程执行
  • 碰到@,break,continue等,按规定语法执行
  • 碰到函数、方法调用等,转而执行函数内部代码,执行完毕继续执行原有顺序代码


if __name__ == '__main__':

很多时候,我们经常在python程序中看到这么一行语句,这里简要解释一下:

首先,​​__name__​​​是所有模块都会有的一个内置属性,一个模块的​​__name__​​​值取决于你如何调用模块。假如你有一个​​test.py​​​文件,如果在​​a.py​​​文件中使用import导入这个模块​​import test.py​​​,那么​​test.py​​​模块的​​__name__​​​属性的值就是​​test​​​,不带路径或者文件扩展名。但是很多时候,模块或者说脚本会像一个标准的程序样直接运行,也就是类似​​python test.py​​​这种方式,在这种情况下, ​​__name__​​​ 的值将是一个特别缺省值​​"__main__"​​。

根据上面的特性,可以用​​if __name__ == '__main__'​​来判断是否是在直接运行该py文件!如果是,那么if代码块下的语句就会被执行,如果不是,就不执行。该方法常用于对模块进行测试和调试,区分直接运行和被导入两种情况的不同执行方式!


条件判断

条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块。

在Python语法中,使用if、elif和else三个关键字来进行条件判断。

30天Python入门到进阶——第5天:流程控制

age = input('Please enter your age')
if(int(age) >= 18):
print('You are allowed to enter the club')
else:
print('Sorry! you are not allowed!')

上面是Python中if-else条件语句的示例。它用于根据某些条件执行逻辑。如果未满足条件,则执行else块中的代码。来自JavaScript领域,我注意到的区别是if-else块周围没有花括号,而是在条件语句后使用​​:​​。条件语句中的块也缩进

exam_score = input('Enter your exam score')
if(int(exam_score) > 90):
print('You have got grade A+')
elif(int(exam_score) > 80):
print('You have got grade A')
else:
print('You have got grade B')

如果需要执行多个条件,则使用​​elif​​​块。在包括JavaScript在内的许多其他编程语言中,它被称为​​else if​​​块。可以有任意数量的​​else if​​块来检查不同的条件。Python使其更加紧凑。

is_adult = True
is_licensed = True

if(is_adult and is_licensed): ## In JavaScript && is used instead of 'and'
print('You are allowed to drive')
else:
print('You are not allowed to drive')

上面的代码检查单个表达式中的两个条件以执行块。​​and​​​关键字用于检查两个条件的计算结果是否都为​​True​​,然后仅执行块。这个语法很容易理解!Python无疑更具可读性。

条件判断的使用原则:

  • 每个条件后面要使用冒号(:)作为判断行的结尾,表示接下来是满足条件(结果为True)后要执行的语句块。
  • 除了if分支必须有,elif和else分支都可以根据情况省略。
  • 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
  • 顺序判断每一个分支,任何一个分支首先被命中并执行,则其后面的所有分支被忽略,直接跳过!
  • 在Python中没有switch – case语句


缩进

缩进是使用空格/制表符分隔代码行的方法,以便解释器可以区分代码块并相应地执行代码。与JavaScript不同,Python不使用任何大括号,而是使用缩进来大块代码。代码编辑器通过自动缩进使我们的生活变得轻松(比如Pycharm或者VS)。

if(10 > 8):
print('Such a silly logic. I will get printed')
else:
print('I will never get printed')
print('I am not get printed coz I am indented')

# Now without indentation
if(10 > 8):
print('Such a silly logic. I will get printed')
else:
print('I will never get printed')
print('I will be printed anyways coz I am not indented')
# The above line gets printed always as interpreter treats it as a new line


真假

  • 计算为 true 的值称为
  • 计算为 false 的值称为

检查条件时,使用类型转换将条件内的表达式计算为布尔值。现在所有值都被认为是“真实的”,除了以下是“虚假的”:

  • ​None​
  • ​False​
  • ​0​
  • ​0.0​
  • ​0j​
  • ​Decimal(0)​
  • ​Fraction(0, 1)​
  • ​[]​​​- 一个空的​​list​
  • ​{}​​​- 一个空的​​dict​
  • ​()​​​- 一个空的​​tuple​
  • ​''​​​- 一个空的​​str​
  • ​b''​​​- 一个空的​​bytes​
  • ​set()​​​- 一个空的​​set​
  • 一个空的​​range​​​,像​​range(0)​
  • 对象
  • ​obj.__bool__()​​​返回​​False​
  • ​obj.__len__()​​​返回​​0​
username = 'santa' # bool('santa') => True
password = 'superSecretPassword' # bool('superSecretPassword') => True
if username and password:
print('Details found')
else:
print('Not found')


短路

在单个语句中检查多个逻辑条件时,解释器足够聪明,可以在第一个条件失败时忽略其余的条件检查。这被称为短路。可以用一个例子更好地解释:

knows_javascript = True
knows_python = True

if(knows_javascript or knows_python): # doesn't depend on value of knows_python
print('Javscript or python developer')
else:
print('Some other developer')
knows_javascript = False
knows_python = True

if(knows_javascript and knows_python): # doesn't depend on value of knows_python
print('Javscript or python developer')
else:
print('Some other developer')

​or​​​是python中的一个条件运算符。


运算符

Python语言支持以下类型的运算符:

  • 算术运算符
  • 比较(关系)运算符
  • 赋值运算符
  • 逻辑运算符
  • 位运算符
  • 成员运算符
  • 身份运算符
  • 三目运算符


算术运算符

以下假设变量: a=10,b=20:

30天Python入门到进阶——第5天:流程控制

比较运算符

以下假设变量a为10,变量b为20:

30天Python入门到进阶——第5天:流程控制

赋值运算符

以下假设变量a为10,变量b为20:

注意对于 ​​a /= b​​​ 之类的操作,等同于​​a = a / b​​​, 而不是 ​​a = b / a​​,方向一定不要搞反了。

30天Python入门到进阶——第5天:流程控制

位运算符

按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下: 下表中变量 a 为 60,b 为 13:

30天Python入门到进阶——第5天:流程控制


逻辑运算符

Python语言支持逻辑运算符,但是没有其它语言中的​​&&​​​和​​||​​​语法,取而代之的是更加人性化的英文单词​​and or not​​​(全部都是小写字母)。除了 ​​and​​​和​​or​​​之外,Python 中几乎没有逻辑运算符,例如​​not​​​, ​​>​​​, ​​<​​​, ​​==​​​, ​​>=​​​, ​​<=​​​,​​!=​​。

以下假设变量 a 为 10, b为 20:

30天Python入门到进阶——第5天:流程控制

print(10 > 100) # False
print(10 < 100) # True
print(10 == 10) # True
print(10 != 50) # True
print(2 > 1 and 2 > 0) # True
print(not(True)) # False
print(not False) # True

一些奇怪的操作

print(True == True) #True
print('' == 1) # False
print([] == 1) # False
print(10 == 10.0) # True
print([] == []) # True

​==​​检查双方的值。如果它们不相同,它会转换类型。

Python 有一个严格的检查运算符​​is​​​,它检查值及其内存位置。它几乎类似于​JavaScript 中的​​===​​运算符。

print(True is True) # True
print('' is 1) # False
print([] is 1) # False
print(10 is 10.0) # False
print([] is []) # False

成员运算符

​in 与 not in​​是Python独有的运算符(全部都是小写字母),用于判断对象是否某个集合的元素之一,非常好用,并且运行速度很快。返回的结果是布尔值类型的True或者False。

30天Python入门到进阶——第5天:流程控制

身份运算符

这也是Python的特色语法(全部都是小写字母)。

30天Python入门到进阶——第5天:流程控制

三元运算符

在研究Python中三元运算符的语法时,起初我觉得有点混乱,但后来发现与我在JavaScript世界中熟悉的运算符相比,它很容易阅读。

is_single = True
message = 'You can date' if is_single else 'you cannot date'
# result = (value 1) if (condition is truthy) else (value 2)
print(message) # You can date

三元运算符有时也称为条件表达式。这是在单个语句中检查条件的一种非常方便的方法。我将它与JavaScript 的​​?​​运算符语法进行了比较,以便于更好的理解。


运算符优先级

下表列出了从最高到最低优先级的所有运算符。优先级高的运算符优先计算或处理,同级别的按从左往右的顺序计算(赋值运算符除外,它是按从右往左的顺序)

30天Python入门到进阶——第5天:流程控制

总结

这就是今天的全部内容。覆盖了流程控制中的顺序结构和条件判断模块,明天我们将学习循环模块,可能还会加入一点函数的基础知识。又度过了美好的一天,朝着学习 Python 的目标又迈出了一小步。希望你喜欢这个系列并从中获得一些价值。如果对你有点点帮助,可以点个关注和收藏,感谢你的支持,谢谢!