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

1e0b9b9ac302d8633570df87ee768782.png

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

d1d2038c457bdeca3ea5e8db3bc920d5.png


【顺序控制】

在没有特殊语法时,我们的代码在被解释器执行时基本上是顺序执行的,所以顺序执行是很好理解的。在顺序执行中我们介绍两个语法,一个是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中的代码块,否则跳过继续执行后续代码。

e1f9e3d596e25152c53b6c4cc3727144.png

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 = 190

print(a, b)
if a < b:
    print(a+b)
print(a**2)

if a >= b:
    print(b / 2)
else:
    print(b ** 3)
    
print(b / a)

51300ea37d079fa43db642384bf8af53.png

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

a,b,c,d = 10, 98, 197, 445

if 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)

d527d42a036ef97079ea70620138994c.png

除了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")

afc5d4b52a6cedd01db74e3a053ed690.png

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

【循环控制】

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

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

cb9fd05e7c0e8a303a8f7ef315c0c88b.png

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

while的一般形式如下:

while <condition>:
  <statement(s)>

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

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

475dbe30418669b6051b2fa53da42659.png

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

(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")

702e39e8f35705c1925fb8be1d34b73a.png

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

for循环的一般格式如下:

for <variable> in <sequence>:
    <statements>
list1 = ['china', 'hello', 'pull', 'machine', 'cat']

for e in list1:
    print(e)

18372e5e568ad090c6e9e576c9f93282.png

以上代码需要注意几点:

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

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

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

list1 = ['china', 'hello', 'pull', 'machine', 'cat']

count_num = 0
for e in list1:
    if e ==  'hello':
        continue
    
    print(e)
    count_num += 1
    
    if count_num >= 3:
        break

71c258d618b818aeda6c1579ae13bb7c.png

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

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

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

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

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

e1edb1ac3caf05f19676e288ee770ba7.png

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

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

ffb7a3d1c17a055f832c9ac58f3cd0e9.png

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

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

81ffdf2ed2794c8e5d937f2d97785640.png

(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]))

4ff83a18c07227c782c894bfecc8b76d.png

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

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


【python入门系列】

杨地瓜:【Python基础(六)】运算符的介绍和使用​zhuanlan.zhihu.com
817a40d905cfd3488d43abd216fccba7.png
杨地瓜:【Python基础(五)】基本数据类型和操作(II)​zhuanlan.zhihu.com
d0600e733ca3c4df9285ea46fddebc9f.png
杨地瓜:【Python基础(四)】基本数据类型和操作(I)​zhuanlan.zhihu.com
d9efdb4c95d838a25bc47ffa876fdb1a.png
杨地瓜:【Python基础(三)】基础语法​zhuanlan.zhihu.com
4c692ab82cd2e78e7c40f0bfee722e16.png
杨地瓜:【Python基础(二)】计算机基本知识科普​zhuanlan.zhihu.com
120a1286742ba07b3dccd42ea06c6a8b.png
杨地瓜:【Python基础(一)】环境搭建与工具的安装​zhuanlan.zhihu.com
fa55ed2c61f1bdd09bebe5e81e89d461.png

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

杨地瓜:【项目管理(十一)】软考-信息系统项目管理师-论文总结(II)​zhuanlan.zhihu.com
76f69ed133cced141f593c233ae13649.png
杨地瓜:【项目管理(十)】软考-信息系统项目管理师-论文总结(I)​zhuanlan.zhihu.com
bec5c1609c7f726af0b16e5ee0b2757e.png
杨地瓜:【项目管理(九)】软考-信息系统项目管理师-案例分析总结(IV)​zhuanlan.zhihu.com
1c56fd1bd7f32100bfd19fab19b3e487.png
杨地瓜:【项目管理(八)】软考-信息系统项目管理师-案例分析总结(III)​zhuanlan.zhihu.com
d54f1d23b0b9306200b18c29d0cf794c.png
杨地瓜:【项目管理(六)】软考-信息系统项目管理师-案例分析总结(I)​zhuanlan.zhihu.com
43927b983fc2d8e288278752e25a5f13.png
杨地瓜:【项目管理(五)】软考-信息系统项目管理师-重点考察内容解析​zhuanlan.zhihu.com
1c56fd1bd7f32100bfd19fab19b3e487.png
杨地瓜:【项目管理(四)】软考-信息系统项目管理师-知识梳理篇​zhuanlan.zhihu.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值