Python学习笔记(2-2):基础知识之流程控制语句

在这里插入图片描述

文章导读

 - 课程难度:★★★☆☆
 - 预计学习时间:1小时
 - 简介:本节主要讲解了三个重要流程控制语句的语法结构及编写时需注意的要点,包括:(1)if - else 条件判断语句的三种常用代码模块和多重条件语句的嵌套使用;
(2)while 循环语句的语法格式以及其与条件语句、循环语句的嵌套使用;(3)for 循环语句与in关键字结合使用以遍历元素下标来获取元素值、for循环中continue和break的使用及区别;(4)循环语句的特点及编写时需注意的要点;
 - 重点涉及的函数和内容:(1)条件判断语句嵌套使用时,判断条件的顺序问题;(2)for循环语句中continue只终止本次循环,而break是跳出整个循环;(3)在使用条件语句或循环语句时,pass关键字可作为空循环、空函数的占位符。

前言

在这里,我们将要第一次接触python的一个典型特性,即缩进(Tab)。python以缩进而不是c或java所用的花括号来表示选择的分支和循环的内容,在这里将用一些例子来详细描述这个问题。我们将主要从条件判断语句、while循环语句和for循环语句来详细地阐释流程控制语句的使用和注意事项。首先我们讲解条件判断语句。

一、 if-else条件语句

条件判断语句首先需要有一个判断条件,它可以是一个值,也可以是一个式子(包括多次逻辑运算的式子),但总之需要传递作为TrueFalse的逻辑值。在写完判断条件后,需要跟上冒号:指示选择内执行代码的开始,自这个冒号的下一行开始,代码将缩进,直到缩进结束为止,都是满足判断条件时将要执行的语句,就好像缩进的代码是附属于这个判断条件一样。

1、if 语句

if语句,如果满足条件,执行缩进的语句;如果不满足条件,则不执行缩进的语句,即完成一个判断需要一个正确的判断条件以及一个正确的判断为True时的执行代码,其语法格式如下:

if 判断条件:
    执行语句

具体示例如下:

a = 5
if a > 2:
    print('a > 2')
    print(a)

输出结果如下:

a > 2
5

若程序在判断为True之后不执行任何操作,我们需要引入pass关键字,pass语句是一个空语句,只是做占位用。pass关键字同样可以用在之后的循环和函数中作为空循环、空函数的占位符。简单的示例如下:

a = 5
if a == 5:
    pass
print(a)

2、if - else 语句

if - else 语句是if语句的扩展。语句不需要新的判断条件,对于if语句里面所有不符合判断条件的情况,就会在else下属的代码块里面执行。其语法格式如下:

if 判断条件:
    执行语句1
else:
    执行语句2

具体示例如下:

a = 1
if a > 2:
     print('a > 2')
else:
     print('a <= 2')
print(a)

输出结果如下:

a <= 2
1

注意:当一个if-else语句中写两个else时,系统会报错:

a = 5
if a > 2:
     print('a > 2')
else:
     print('a <= 2')
else:
     print('a <= 2.0')
print(a)

除此之外,if-else有一种三元表达式的形式,是if-else写在一行的,例如:

a = 1
print('a > 2') if a > 2 else print('a <= 2')

输出结果如下:

a <= 2

它的写法很易懂,if前是True时的操作,else后是False时的操作。但是如果True或是False的情况执行的操作很复杂,就不建议采用了。

3、if - elif - else语句

if - elif - else语句面向有更多执行条件的使用情形,可以描述成“如果满足判断条件1,则执行语句1,如果满足条件2,则执行语句2……如果均不满足,则执行语句n”。其语法格式为:

if 判断条件1:
    执行语句1
elif 判断条件2:
    执行语句2
elif 判断条件3:
    执行语句3    
      ......
else:
    执行语句n    

我们在此前的代码块上继续进行修改:

a = 5
if a > 6:
     print('a > 6')
elif a > 2 and a <= 6:
     print('2 < a <= 6')
else:
     print('a <= 2')
print(a)   

输出结果如下:

2 < a <= 6
5

与此同时,判断语句可以不要else,只编写if-elif的代码块:

a = 5
if a > 6:
     print('a > 6')
elif a > 2 and a <= 6:
     print('2 < a <= 6')
print(a)

输出结果如下:

2 < a <= 6
5

4、条件判断语句的嵌套

判断语句下,还可以继续进行判断语句的编写,作为一种逻辑表述方式利用在一些层级式的选择中。例如我们想要满足a>2、b>6、c>8的时候输出成功,但是不成功的时候输出失败,可以这么做:

a, b, c = 6, 7, 8
if a > 2 and b > 6 and c > 8:
     print('success')
else:
     print('fail')

但如果想要输出,到底是哪里失败了,这里可以将代码编写成:

a, b, c = 6, 7, 8
if a > 2:
     if b > 6:
         if c > 8: 
             print('success')
         else:
             print('c <= 8')
             print('fail')
     else:
         print('b <= 6')
         print('fail')
else:
     print('a <= 2')
     print('fail')

上面嵌套的if-else语句所描述的判断过程,实际上是if语句从左至右依次计算判断条件的逻辑值,若结果为False,则不再计算后面的判断条件,例如and里面有False或是or里面有True,只要满足终止计算的条件,它就会忽略这个条件表达式后面的部分。比如在条件if A and B中,如果B实际上是语法错误的语句,但A为False,则没有问题,但是如果A和B颠倒,则语句会报错,这个特性是在循环判断时经常需要注意的事情。在程序编写时,时常出现将循环下标是否超出数组范围的判断写在了访问数组下标元素语句的后面,导致在循环到数组结束时报出数组越界的错误。

二、 while循环语句

while语句的运行逻辑是:当循环条件满足时,执行缩进内的代码(循环体),在这些代码执行完毕时,重新回到循环条件进行判断,如果仍然满足循环条件,则再次执行循环体,直至,循环条件不再满足为止。其语法格式如下:

while 循环条件:
    循环体

我们这里讲解循环内引入判断和循环的方式。首先,我们可以在本循环里引入判断条件或循环语句,例如,我们输出10以内的奇数:

a = 0
while a < 10:
    if (a % 2 == 1):
        print(a)
    a += 1

注意,a += 1这行代码需要注意缩进级别,放在if的外面,它从属在while语句下。如果不小心缩进至if语句下了,a在最初为0时就会一直在while中空转,形成死循环。上述代码的输出结果如下:

1
3
5
7
9

第二个例子,我们输出一个所有总和小于5的正整数组,这就是一个二重循环,当然肯定可以随着需要继续增加到三重、四重乃至更高的循环。实现的代码如下:

a, b = 1, 1
while a < 5:
    b = 1
    while b < 5 - a:
        print(a, b)
        b += 1
    a += 1

输出结果如下:

1 1
1 2
1 3
2 1
2 2
3 1

三、 for循环语句

为了讲解for循环,我们需要先简单地提一个数据类型,即内置的数据类型列表(list),还需要提一个我们在未来会常用到的函数,即range函数。

1、列表与range函数简述

列表是python在做数据分析时比较常用的内置数据类型。一个列表中可以容纳可变数目的值,也能容纳不同数据类型的元素,列表内的元素用逗号,分隔。例如:

print([2, 3, 4, 5])
print([2, 'three', 4, 'five'])

输出结果如下:

[2, 3, 4, 5]
[2, 'three', 4, 'five']

我们用列表的下标对其中的元素进行访问,元素的下标从0开始。对于一个长度为 N 的数组,数组的下标值从0一直取到N-1::

a = [1, 2, 3, 4, 5]
print(a[0], a[2])

输出结果如下:

1 3

注意定义列表名称的时候不要用保留字
接下来,我们简单提一下range函数的基本用法,它对for循环而言非常重要。对于range函数,如果我们只是传入一个正整数 a ,它会返回一个迭代器对象,当我们循环输出时,会从 0一直取到a-1,间隔为1,共输出a次。如果想要观察这个对象所有将访问的值,我们可以利用list函数把它建成一个列表:

r = range(8)
list(r)

输出结果如下:

[0, 1, 2, 3, 4, 5, 6, 7]

2、for循环

for循环的功能与while循环稍有不同,它是循环一组元素(例如列表),分别对下属的每一个元素进行相应的操作。for语句的开头,定义一个临时的变量作为每次将要参与处理的元素的名称,接着给出一个需要做循环处理的这一组元素,二者的关系通过in指示。最后接一个冒号,具体对每个元素的执行的代码,与if-elsewhile一样,需要将其缩进。
我们结合range函数,利用for循环输出所有的值:

a = [2, 4, 'alpha', 'beta', 6, 8, 'gamma', 10]
for tmp in range(len(a)):	# 用len(a)计算列表a的长度,用range函数获得下表列表
     print(a[tmp])

通过获取元素下标做循环的主要用处有两点,一是用来修改原数组的值,二是随时能访问到已经循环到第几个值。输出结果如下:

2
4
alpha
beta
6
8
gamma
10

另外,for循环有如下特性:

  • 通过for循环进行处理时,如果把循环变量tmp修改了,这只会对tmp在本次循环内的值有影响,下次循环时,tmp还是按部就班地取下一个值
  • 修改变量tmp并不会修改原来的列表
  • 循环变量本身会被保存下来,而不是在循环结束后被释放掉

例如如下的例子中,每次得到一个循环变量tmp后,直接将它变更成2,但循环结束后,原有列表并不发生改变,而循环变量tmp在循环结束后值为2,tmp这个元素不会消失:

a = [2, 4, 'alpha', 'beta', 6, 8, 'gamma', 10]
for tmp in a:
     tmp = 2
print(a)
print(tmp)

输出结果如下:

[2, 4, 'alpha', 'beta', 6, 8, 'gamma', 10]
2

但是如果循环的是下标,修改从原数组中访问的值,就能对原数组产生影响:

a = [2, 4, 'alpha', 'beta', 6, 8, 'gamma', 10]
for tmp in range(len(a)):
     print(a[tmp])
     a[tmp] = 2
print(a)
print(tmp)

输出结果如下:

[2, 2, 2, 2, 2, 2, 2, 2]
7

3、continue语句和break语句

(1)continue

continue是指中止这个循环的本次运行,直接开始下一次循环。例如还是对于上面的数组,我们对于所有的数字(整形或是浮点型),将其翻倍后更新到原数组里面去,如果是其他类型,则跳过:

a = [2, 3.3, 'alpha', 'beta', 6.5, 8, 'gamma', 10]
for tmp in range(len(a)):
     if type(a[tmp]) == float or type(a[tmp]) == int :
         a[tmp] *= 2
         print(a[tmp])
     else:
         continue
print(a)

输出结果如下:

4
6.6
13.0
16
20
[4, 6.6, 'alpha', 'beta', 13.0, 16, 'gamma', 20]

(2)break

break是指跳出整个循环,而不是像continue一样中止这次迭代。在这里,如果想输出第一个不为整数或小数的值并结束所有代码,那么我们就可以用到break,具体示例如下:

a = [2, 3.3, 'alpha', 'beta', 6.5, 8, 'gamma', 10]
for tmp in range(len(a)):
     if type(a[tmp]) == float or type(a[tmp]) == int:
         pass
     else:
         print(a[tmp])
         break
print(a)

输出结果如下:

alpha
[2, 3.3, 'alpha', 'beta', 6.5, 8, 'gamma', 10]

这里需要注意的是:break只是跳出自己的这一重循环。例如下面的例子。在i = 1下,循环值j = 3时,因为j + i >= 4,触发break,j的循环中止,没有了i = 1,j = 4的这一次循环。但是内层循环的跳出,并没有影响i = 2时的外重循环内容,i = 2时,j仍然从1取到了2,然后依照规则跳出了循环;之后i = 3时的循环同理。

for i in [1, 2, 3]:
     for j in [1, 2, 3, 4]:
         print('looping', i, j)
         if (i + j >= 4):
             break
         print(i, j)

输出结果如下:

looping 1 1
1 1
looping 1 2
1 2
looping 1 3
looping 2 1
2 1
looping 2 2
looping 3 1

continuebreak语句在循环控制中时常用到,对构建一个符合特定需要的逻辑语句有重要的作用,可在未来实现自己的数据分析需求中逐步熟练掌握。

4、补充:循环语句编写的注意要点

在编写while循环或for循环时,有如下一些需要补充的要点和技巧:

  1. 在循环里引入的判断和循环,它们的缩进级别等同于其他代码,也即第二重循环里,这个新的循环内的循环代码要再缩进一次

  2. 循环可以引入判断和循环,判断里面也可以引入循环,其机理是相似的。

  3. 循环像选择一样,内部执行的部分不能没有任何可执行的代码,如果一定要全空,则需要引用pass语句。

  4. 对于while循环,我们可以直接执行while(True),然后在内部结合break语句,在循环体内部去定义跳出循环的条件。

  5. while语句报错时可从下面这几个角度来找原因并进行调整:
    (1)注意循环变量的初始值,对其做初始化。因为判断条件和随后的代码每执行一次,循环变量就可能发生一次变化。例如,下面的程序先期执行过一个while语句,之后又希望利用while语句把一个句子输出五次。但是因为a在这个时候已经是5了,所以在执行下一个while语句时就不会有任何输出。想让这个程序实现效果,需要把a重新置0:

    a = 0
    while a < 5:
        a += 1
    
    while a < 5:
        print('wonderland')
        a += 1
    
    

    (2)注意while循环中是否正确地修改了循环变量
    例如如下的程序中,一个变量temp可能在很早被定义过,而且和循环变量tmp名字很像,但while修改的并不是循环变量:

    temp = 1
    # ...隔了很多行代码
    tmp = 0
    while tmp < 5:
        print(tmp)
        # 又隔了很多行代码
        temp += 1
    
    

    (3)注意计数器的修改方式和判断条件可能根本上就不可能正确跳出循环
    出现这种错误比较多的原因是只看了计数器的变化,没观察整体循环条件。例如下面的代码片段中,只要b为0,则a无论增加到多大,a和b的乘积都为0,导致循环无法跳出:

    a = 0
    b = 0
    while a * b < 5:
        print(a)
        a += 1
    

    (4)注意代码的缩进级别
    (5)在循环语句中嵌套了一个内层循环或是判断,无意识地用了同名变量做这个循环的计数器(或是判断条件的值),结果内层的操作改变了计数器的值:

    a = 0
    while a < 5:
        print('looping - 1')
        print(a)
        # ... 隔了很长一段代码
        a = 0
        while a < 3:
            a += 1
            print('looping - 2')
    

基本上这些情况能够规避下来,一个循环语句基本能成功的按照自己的设计去执行。


对于缺乏Python基础的同仁,可以通过免费专栏🔥《Python学习笔记(基础)》从零开始学习Python

结语

请始终相信“Done is better than perfect” ,不要过分追求完美,即刻行动就是最好的开始, 一个模块一个模块地积累和练习,必将有所收获。
还有其他的问题欢迎在评论区留言📝!


[版权申明] 非商业目的注明出处可自由转载,转载请标明出处!!!
博客:butterfly_701c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值