已经进行了四天的Python学习体验。到目前为止,已经能够涵盖 Python 的一些基本语法以及数据类型,以及如何使用内置函数和方法以及一些最佳实践对它们执行操作。这可能是 Python 的枯燥部分。今天短期目标是理解逻辑和条件编程,以及在 Python 中使用循环重复任务。这可是很有意思的!
流程控制
流程控制指的是代码运行逻辑、分支走向、循环控制,是真正体现我们程序执行顺序的操作。流程控制一般分为顺序执行、条件判断和循环控制。这里面体现了一种传统编程中的“因果关系”,也就是有什么样的因就产生什么样的果,有什么输入就会有相应的输出,同一个输入不管执行多少次必然得到同样的输出,所有的都是确定的、可控的。与之相对的则是最近火得一塌糊涂的人工智能,比如机器学习、神经网络和深度学习,这些不再是“因果关系”编程,而是“统计关系”编程,同一个输入每次的执行结果有可能不一样。
流程图
再简要介绍一下流程图。程序流程图和伪代码在本质上其实是一样的,只不过一个用文字表达一个用图片表达,图片画着费点事,但看着直观,文字书写方便,但不够直观。
在程序流程图绘制过程中,主要使用下图中的图标:
通过带方向的箭头和相应的说明文字,连接各图标,形成了流程图,例子如下:
顺序执行
虽然我们有各种流程判断、循环、跳转、控制、中断等等,但从根本上程序还是逐行顺序执行的。
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三个关键字来进行条件判断。
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 = Trueis_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
password = 'superSecretPassword' # bool('superSecretPassword') => True
if username and password:
print('Details found')
else:
print('Not found')
短路
在单个语句中检查多个逻辑条件时,解释器足够聪明,可以在第一个条件失败时忽略其余的条件检查。这被称为短路。可以用一个例子更好地解释:
knows_javascript = Trueknows_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:
比较运算符
以下假设变量a为10,变量b为20:
赋值运算符
以下假设变量a为10,变量b为20:
注意对于 a /= b 之类的操作,等同于a = a / b, 而不是 a = b / a,方向一定不要搞反了。
位运算符
按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下: 下表中变量 a 为 60,b 为 13:
逻辑运算符
Python语言支持逻辑运算符,但是没有其它语言中的&&和||语法,取而代之的是更加人性化的英文单词and or not(全部都是小写字母)。除了 and和or之外,Python 中几乎没有逻辑运算符,例如not, >, <, ==, >=, <=,!=。
以下假设变量 a 为 10, b为 20:
print(10 > 100) # Falseprint(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) #Trueprint('' == 1) # False
print([] == 1) # False
print(10 == 10.0) # True
print([] == []) # True
==检查双方的值。如果它们不相同,它会转换类型。
Python 有一个严格的检查运算符is,它检查值及其内存位置。它几乎类似于JavaScript 中的===运算符。
print(True is True) # Trueprint('' is 1) # False
print([] is 1) # False
print(10 is 10.0) # False
print([] is []) # False
成员运算符
in 与 not in是Python独有的运算符(全部都是小写字母),用于判断对象是否某个集合的元素之一,非常好用,并且运行速度很快。返回的结果是布尔值类型的True或者False。
身份运算符
这也是Python的特色语法(全部都是小写字母)。
三元运算符
在研究Python中三元运算符的语法时,起初我觉得有点混乱,但后来发现与我在JavaScript世界中熟悉的运算符相比,它很容易阅读。
is_single = Truemessage = '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 的?运算符语法进行了比较,以便于更好的理解。
运算符优先级
下表列出了从最高到最低优先级的所有运算符。优先级高的运算符优先计算或处理,同级别的按从左往右的顺序计算(赋值运算符除外,它是按从右往左的顺序)
总结
这就是今天的全部内容。覆盖了流程控制中的顺序结构和条件判断模块,明天我们将学习循环模块,可能还会加入一点函数的基础知识。又度过了美好的一天,朝着学习 Python 的目标又迈出了一小步。希望你喜欢这个系列并从中获得一些价值。如果对你有点点帮助,可以点个关注和收藏,感谢你的支持,谢谢!