本节将会讲到在编程中个人认为最重要的知识之一,逻辑控制。与其说是介绍语法,不如说是阐述看待事物的方法。我们身处的世界,每天有海量信息向我们袭来,每天我们要处理若干的事件,对于每一个事件,它都由若干个小步骤组成,这些小步骤的过程,抽象来看无非三种,即顺序执行的、判断是否满足某种条件而后执行的,再就是循环执行的。计算机之于人类的根本作用,是模拟人类剖析问题的思维方式、从时间和空间两方面以指数级的碾压优势提升人类的效能。要完成使计算机达成这个目标,就需要明确事务的处理过程,准确的告诉计算机如何去做,如何去思考;反过来也带给编程的你对待事情的方法论,当我们在处理一件事情的时候,应首先从全局的角度,拆分成若干个步骤或阶段,明确这些步骤之间的执行关系,再将其串联起来从头到尾的流通。也许你以前面对问题时时常张皇无措满地抓瞎,希望学习完本节后能对你有所启发,不然计算机对于你的问题也只能是三条黑线了。

【顺序控制】

在没有特殊语法时,我们的代码在被解释器执行时基本上是顺序执行的,所以顺序执行是很好理解的。在顺序执行中我们介绍两个语法,一个是pass,另一个是yield。

pass就如这个单词的意思一样,他本身没有特别的语法含义,只是为了保持代码的结构性而使用的,类似于占位符。我们知道,在python的语法中,代码块是通过缩进来划分的,在一些语法块内,如果不能省略,就必须要有代码语句,这个时候pass就派上了用场。

a 

以上代码中,由于在else分支中我们没有任何的代码语句,为了保持if-else代码块的完整性,我们使用pass关键字,这对整个的代码运行没有产生影响;这里的例子可能不具代表性,因为在if-else代码块中,else的部分是可以省略的,所以,最好的写法当然是如果else里面没有内容,那么就没必要写出来了。

在python中,使用了yield的函数被称为生成器(generator),在调用生成器运行的过程中,每次遇到yield关键字时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行nex()方法时从当前位置继续执行。这个概念可能还比较晦涩,待我们介绍完函数以及迭代器和生成器的概念后,我们再举例说明yield的使用方法。

【条件控制】

老话说的好,人生就是一道道的选择题组成的,每当我们做出选择的时候,人生的下一步就已注定。对于代码来说,也面临着若干的选择,当然,不论是一个条件判断还是多个条件的组合,最后得出的都只有真与假两种结果,计算机不会有感性的冲动,它只有逻辑运算的绝对理性。

最基本的条件控制代码块是if-else,它只有两个分支;条件为真执行if中的代码块,条件为假执行else中的代码块。当然我们前面说到了,else在这里是可以省略的,那么最简单的形式也就是只有if的情况,当条件为真时执行if中的代码块,否则跳过继续执行后续代码。

if和if-else的伪代码示意如下。

# 以下是伪代码形式,只表明结构,不局限语法<pre_statement>
if <condition>:  # 当条件为真时,才执行if代码块中的语句<statement1><statement2>
<later_statement><pre_statement>
if <condition>:  # 当条件为真时,执行if代码块中的语句;为假时,执行else代码块中的语句<statement_block_1>
else:<statement_block_2>
<later_statement>

a = 25
b = 190print(a, b)
if a < b:print(a+b)
print(a**2)if a >= b:print(b / 2)
else:print(b ** 3)print(b / a)

随着我们的学习,代码的结构会逐渐复杂起来,这主要体现在代码块的增加;从缩进上面看,以前的代码都是同样的缩进量,也就是说所有代码语句是同一级的;但从有了条件控制开始,就会形成不同缩进级别的代码块了,甚至在条件判断之中还会嵌套条件判断语句,缩进的级别甚至是两三层或者更多。所以我们在键入代码时一定要注意处于同一代码块或者同一代码层级的缩进量是相同的,不然就会造成代码运行时的结果与我们的预期结果的偏差。

a,b,c,d = 10, 98, 197, 445if a > b:print(a - b)
else:if c > a:if d > c:print(d-a)else:print(a - 100)else:print(b - d)print(a+b+c+d)

除了if-else结构外,我们还可以对其进行扩展,使其同时对多种情况进行判断,这时使用的结构是if-elif-else。elif实际上就是else if的缩写,从结构的字面上也可以理解它的用法。

# 以下是伪代码形式,只表明结构,不局限语法# 当条件<condition_x>为真时,执行对应if或elif代码块中的语句;
# 当以上条件都不满足时,执行else代码块中的语句
<pre_statement>
if <condition_1>:  <statement_block_1>
elif <condition_2>:<statement_block_2>
...
elif <condition_n>:<statement_block_n>
else:<statement_block_else>
<later_statement>

str1 = 'china'
str2 = 'baby'
str3 = 'god'if (len(str1) < len(str2)):print(str2)
elif (str1.find('b') > 0):print(str1)
elif (len(str3) < len(str2)):print(str3)
else:print("unknown")

以上我们举例时判断条件都是单一条件的,并没有使用逻辑运算符做多个条件的组合判断,但这不影响条件控制结构的本质,不论是if还是elif,它所得出的结果都只能是真或假,给它的条件再多,逻辑运算再复杂,都不会有其它的结果,小伙伴们可以使用多条件进行练习。

【循环控制】

当我们做完选择后,面临的下一个事情,可能就是在长期的过程中重复一系列的动作,比如,我们的工作,绝大多数的工作内容,都只是熟悉后的机械重复,并不会有多少的创造性;那么,为什么不编写个程序交给计算机来完成呢,很多时候你得承认,他比你做得更快,也可能比你做得更好。

循环的基本逻辑是:当循环条件满足时,执行循环体中的内容,直到循环条件不满足为止,结束循环。这里最重要的就是循环条件,如果循环条件一直满足,甚至永远都满足,那么这个循环体就会永远的执行下去,这种情况称之为死循环(或永真循环,即条件永远为真);因为我们的代码运行都会消耗内存,而计算机的内存是有限的,死循环会使得计算机的内存耗尽,导致计算机死机或其他更严重的问题,所以我们对待循环条件一定要谨慎,避免发生死循环现象。

python中基本的循环语句有for和while,我们不用太过于纠结两者的运行机制,只需要选择写代码更方便的语法即可。

while的一般形式如下:

while <condition>:<statement(s)>

我们使用while循环来对1-100进行求和运算。

n = 100sum = 0
counter = 1
while counter <= n:sum = sum + countercounter += 1print("1 到 %d 之和为: %d" % (n,sum))

以上代码有两个地方需要注意:

(1)循环条件的变化。我们可以看到在循环体内有对循环条件中变量的更新语句,正因为有了这样的语句,才能使循环条件能够有判断为假的情况,才能够正常的退出循环,否则就会一直执行下去,陷入死循环。

(2)最后的print语句中使用的“%d”与我们之前所示例到的“{0}”一样,同样是占位符,只不过对于带有“%”百分号的这种占位符表示需要对所要输出的内容进行格式化,与之相同的还有“%s”等,这我们在后续讲到输入输出小节时会再具体说明,此处不影响我们阅读代码。

python中对于while循环结构还有一个扩展,即while-else代码块,表示当while的循环条件为假时,执行else代码块中的内容,一般形式如下所示。

while <condition>:<statement(s)>
else:<additonal statement(s)>

count = 0
while count < 5:print (count, " 小于 5")count = count + 1
else:print (count, " 大于或等于 5")

同样是循环语句,相比while,for循环更多用于遍历有序对象,如遍历一个列表、或者字符串。

for循环的一般格式如下:

for <variable> in <sequence>:<statements>

list1 = ['china', 'hello', 'pull', 'machine', 'cat']for e in list1:print(e)

以上代码需要注意几点:

(1)遍历对象必须是要有序的,基本数据类型中就是字符串、列表、元组;或者是可迭代的对象。

(2)迭代变量<variable>的命名也需要遵守变量的基本命名规则,我们在操作时就是用这个迭代变量,表明我们当前操作的序列对象中的变量。

(3)我们可以使用break关键字和continue关键字对循环进行终止和中断。如字面意思,break是指跳出循环体,continue是指跳过本次循环执行下一次循环(如果有下一次的话)。我们对上面的例子进行少许的改造,看一看两个关键字所起到的作用。

list1 = ['china', 'hello', 'pull', 'machine', 'cat']count_num = 0
for e in list1:if e ==  'hello':continueprint(e)count_num += 1if count_num >= 3:break

从结果中我们可以看到,当所操作的变量等于“hello”时,执行了continue关键字,跳过了本次循环,也就意味着循环体内后续的代码没有执行,变量count_num也没有加1;当变量count_num大于等于3时,执行了break关键字,退出了整个循环体,不再对变量继续遍历了。

break和continue关键字可以让我们在满足一定条件的情况下对遍历操作进行控制,以达到某些特定的效果。当然,这两个关键字在while循环中同样的适用。

python内置的方法中还提供了一种遍历数字的方法,range(),他可以对指定的数据区间进行遍历,具体有以下几种用法。

(1)从0开始,对指定的数列进行遍历:

for i in range(5):print(i)

(2)对指定的数列区间进行遍历:

for i in range(15, 24):print(i)

(3)以特定步长对指定的数列区间进行遍历,当然步长也可以为负数,与索引访问一样,负数情况下是反向遍历:

for i in range(15, 34, 3):print(i)

(4)与len()方法结合使用,对序列对象以索引方式进行访问:

list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for i in range(len(list1)):print("列表list1中第{0}个位置的元素是{1}".format((i+1), list1[i]))

前面三种用法应该都很明确,第四种用法,提供了对序列对象的另一种访问方式,如果是有编程基础的小伙伴,比如C或者Java,看到这种方式应该会很亲切,这种方法更多的好处在于我们可以同时获得序列对象的元素和元素所在的位置,对于涉及到位置操作时会更加方便。

以上就是本节的所有内容,在学习完流程控制后,可以说你已经越过到程序的大门了,回顾我们之前说到的程序的三个组成部分:数据、数据结构、算法,都已经具备,此刻开始我们已经可以用代码的方式去实现一些特定的功能,比如一些简单的数学问题,后续我也准备列举一些有代表性的练习题,各位小伙伴可以尝试用编程的方式来解决。所有的数据类型、数据结构、流程算法都无需死记硬背,在反复使用后就会对它们的用法很熟悉了。俗话说,好记性不如烂笔头,在学习编程的过程中,敲代码不如烂笔头,小伙伴们一定要动手敲一敲代码,将理论应用于实践,事半功倍,受益良多。


【python入门系列】

杨地瓜:【Python基础(六)】运算符的介绍和使用​zhuanlan.zhihu.com

杨地瓜:【Python基础(五)】基本数据类型和操作(II)​zhuanlan.zhihu.com

杨地瓜:【Python基础(四)】基本数据类型和操作(I)​zhuanlan.zhihu.com

杨地瓜:【Python基础(三)】基础语法​zhuanlan.zhihu.com

杨地瓜:【Python基础(二)】计算机基本知识科普​zhuanlan.zhihu.com

杨地瓜:【Python基础(一)】环境搭建与工具的安装​zhuanlan.zhihu.com


【信息系统项目管理师考试分享】

杨地瓜:【项目管理(十一)】软考-信息系统项目管理师-论文总结(II)​zhuanlan.zhihu.com

杨地瓜:【项目管理(十)】软考-信息系统项目管理师-论文总结(I)​zhuanlan.zhihu.com

杨地瓜:【项目管理(九)】软考-信息系统项目管理师-案例分析总结(IV)​zhuanlan.zhihu.com

杨地瓜:【项目管理(八)】软考-信息系统项目管理师-案例分析总结(III)​zhuanlan.zhihu.com

杨地瓜:【项目管理(六)】软考-信息系统项目管理师-案例分析总结(I)​zhuanlan.zhihu.com

杨地瓜:【项目管理(五)】软考-信息系统项目管理师-重点考察内容解析​zhuanlan.zhihu.com

杨地瓜:【项目管理(四)】软考-信息系统项目管理师-知识梳理篇​zhuanlan.zhihu.com

C++中如何控制语句只执行一次_【Python基础(七)】逻辑控制相关推荐

  1. scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了

    scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了 原因 If any execution of the task encounters an ...

  2. shell 脚本中while 循环只执行一次的问题

    自己写的一个获取所有远程服务器数据库启动配置信息的bash 脚本,发现循环里的ssh远程命令只能执行一次,感觉很奇怪,以前没这么使用过, 我的脚本为 #!/bin/bash ## generate a ...

  3. excel中录制宏只执行一半的命令,没有执行全部如何解决?

    数据情况: 1-8月 每日的数据清单,每日数据为一个sheet. 目的: 对所有sheet 执行同样的几个操作,具体操作保护如下: 1.取消表头单元格合并,并删除1行 2.取消sheet隐藏行 3.选 ...

  4. python输出由1234组成的三位素数_编写程序,输出所有由 1 、 2 、 3 、 4 这 4 个数字组成的素数,并且在每个素数中每个数字只使用依次。_学小易找答案...

    [判断题]在串行接口上,可以通过指定下一跳地址或出接口来配置静态路由. [单选题]某台路由器运行OSPF协议,并且没有指定Router ID,所有接口的P地址如下,则此路由器OSPF协议的 Route ...

  5. 如何让原本的密码只执行一次_如何在虚拟机中正确的第一次启动Linux系统

    在小编的上一篇文中,有介绍过如何在Virtualbox虚拟机中安装Linux CentOS系统,今天我们尝试第一次启动Linux系统,为保证虚拟机的流畅运行,建议将分辨率设置为 800x600. 1. ...

  6. scheduled只执行一次_升级@Scheduled-分布式定时任务

    最近我在对项目的定时任务服务升级,希望改造成分布式,原本是利用@Scheduled注解实现,然而它并不支持分布式,如果改成quartz或者Spring Cloud Task,感觉对于自己这个简单的项目 ...

  7. java定时器只执行一次_面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)...

    爱因斯坦说过"耐心和恒心总会得到报酬的",我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在我身上实现了. 每一个程序员都拥有一座大厂梦,我也不例外,去年面试阿里P6,竟然被 ...

  8. java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...

    在 上一篇(戳下看前情) 中,徐大带我们详细论证了,所有实现线程的方式归根结底就是基于 Runnable 接口或继承 Thread 类.接下来,请徐大继续解释,为什么说这两种方式本质上是一种. 一. ...

  9. winform 让他间隔一段时间 执行事件 且只执行一次_记一次golang定时器引发的诡异错误...

    作为一只在9127工作制下摸鱼的程序猿,周六自然是愉快的加班了.一早上除了一位新同学在我们的"敏捷迭代"下错删了接口之外没什么大事. 临近中午,突然隔壁组大佬找到我,表示有个go语 ...

最新文章

  1. php jwt使用案例,PHP使用JWT创建Token的实例详解
  2. 关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
  3. linux下各个目录里面都装了什么
  4. 通过FxCop来验证.NET编码规范
  5. c++ fork 进程时 共享内存_linux共享内存mmap
  6. ubuntu64位 oracle 11g,64位Ubuntu安装Oracle11G
  7. 2018暑假集训---递推递归----一只小蜜蜂hdu2044
  8. android动画编辑软件,ALM视频动画编辑
  9. GDAL读取jpg文件中GPS坐标信息
  10. 20191117每日一句 EVERYBODY DIES, BUT NOT EVERYBODY LIVES
  11. 树中两个节点的最低公共祖先
  12. python numpy安装
  13. 1978-2019年中国省市恩格尔系数表分享
  14. 条形码类型及常见条形码介绍
  15. compute的c语言用法,词汇精选:compute的用法和辨析
  16. 开普勒方程迭代求解C语言,一种实用的开普勒方程求解方法及其 C 语言实现
  17. TopoDOT | 高精地图三维矢量元素提取——道路车道标线
  18. CDN是什么?以及CDN的原理
  19. 使用gcov和lcov测试代码覆盖率
  20. Xavier(2):Xavier NX刷机步骤及报错解决

热门文章

  1. Eunomia: 让 ebpf 程序的分发和使用像网页和 web 服务一样自然
  2. 「Unity2D」使用Unity创建一个2D游戏系列-1
  3. 20165326 学习基础和c语言基础调查
  4. 物联网跑太快 通用标准却跟不上
  5. Android 全景照片查看,Android图片处理教程之全景查看效果实现
  6. 在cadence集成calibre
  7. 映泰G31计算机主板进入BIOS,映泰主板bios设置方法【图解】
  8. Multiple errors occurred while copying the files
  9. xxl-job简单使用踩坑
  10. 拱拱Lite开发(3):三翼页及湘大文库下载实现(解析网页获取信息及模拟登陆)