当前位置: 首页 > news >正文

Python入门到进阶——流程控制

已经进行了四天的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 = 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
passwor = '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:

比较运算符

以下假设变量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) # 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。

身份运算符

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

三元运算符

在研究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 的​ ​?​ ​运算符语法进行了比较,以便于更好的理解。

运算符优先级

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

总结

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

相关文章:

  • 基于Docker的开源端到端开发者平台
  • Chapter2.2:控制系统的数学模型
  • 前端关于cookie那些事儿
  • git——仓库合并不丢失git记录
  • 【云原生】MySQL on k8s 环境部署
  • Jetpack ViewModel源码分析
  • 数字逻辑第二章笔记
  • 从开发角度看羊了个羊
  • 我用PaddleOCR把Halcon论坛的OCR帖子试了一遍,结果。。。
  • 微信号怎么改
  • Spring集成Apache Kafka教程
  • 基于SSM实现图书馆座位预约系统
  • java部分排序算法
  • Java8-特性
  • Mybatis-Plus快速入门|比Mybatis更简单好用的ORM框架
  • 【译】JS基础算法脚本:字符串结尾
  • [iOS]Core Data浅析一 -- 启用Core Data
  • canvas 高仿 Apple Watch 表盘
  • go语言学习初探(一)
  • PHP那些事儿
  • redis学习笔记(三):列表、集合、有序集合
  • 搭建gitbook 和 访问权限认证
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 力扣(LeetCode)22
  • 如何编写一个可升级的智能合约
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 用Visual Studio开发以太坊智能合约
  • 06-01 点餐小程序前台界面搭建
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (八)c52学习之旅-中断实验
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (三)终结任务
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转) Android中ViewStub组件使用
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)ObjectiveC 深浅拷贝学习
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET 读取 JSON格式的数据
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET下的多线程编程—1-线程机制概述
  • 。Net下Windows服务程序开发疑惑
  • :中兴通讯为何成功
  • @Autowired多个相同类型bean装配问题
  • @property python知乎_Python3基础之:property
  • @RequestBody与@ModelAttribute
  • [100天算法】-不同路径 III(day 73)
  • [20170713] 无法访问SQL Server
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [C++]C++基础知识概述
  • [CSS]CSS 字体属性
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [halcon案例2] 足球场的提取和射影变换