python渐进---条件和循环控制语句

原载于https://mp.weixin.qq.com/s/J512SmQdBKiq5F8yABtAjQ


使用条件控制和循环控制语句,可以使得代码的流程控制更丰富。

使用条件控制语句,可以决定哪些代码需要执行,哪些不需要执行;而使用循环控制语句,可以控制哪一些代码需要多次执行。可以说条件语句和循环控制语句是使得代码能够更聪明的决定性因素了。

下面就分别介绍条件控制语句if、循环控制语句for、条件循环相结合的控制语句while。


5.1 if 语句

if是条件控制语句。用于代码的分支的判断。它的作用是进行布尔运算,如果是真就执行if或者elif代码块,如果是假则执行else代码块。

如果代码设计中只有两个分支,那么直接使用if…else…语句组合就足够。

下面的演示代码演示的是随机生成一个整数,如果这个整数是个偶数(对2取余数为0)就打印“偶数”;如果这个整数是一个奇数,就打印“奇数”。

这里需要借助random模块的randint函数来生成随机数,randint的两个参数a,b表示生成数的区域为 a<=x<=b。

下面的演示代码中随机生成的是一个1到2的整数。

import random
x=random.randint(1,2)
if x%2==0:
    print("偶数")
else:
    print("奇数")


如果分支多于两个,就需要使用if…elif…else…语句组合来管理代码块。

下面的演示代码演示的是随机生成一个1到6的数,如果是1的话就打印一个点;如果是2的话就打印两个点;等等。这段演示代码实际上是模拟一个随机掷骰子的过程。

import random
x=random.randint(1,6)
print(x)
if x==1:
    print(".")
elif x==2:
    print(":")
elif x==3:
    print(":.")
elif x==4:
    print("::")
elif x==5:
    print("::.")
else:
    print(":::")

这段演示代码的运行结果可能为:

>>> ===============
5
::.


else代码块,如果在实际中不需要的话,也是可以没有的。比如说上面的判断奇偶的代码,如果只是关注为偶数的情况,奇数的不关心。那么就只有if没有else。而随机掷骰子的代码中,如果我只关心一个点的情况,那么所有的elif和else都可以没有。


5.2 for语句

for是循环语句。python的for循环次数的控制,是由一个可迭代对象来决定的。可迭代对象可以是一个迭代器或者生成器,这些内容在后面讲的时候再讨论。现在先简单化处理。

简单来说,要使用for循环,我需要一个序列。这个序列的长度影响了for的循环次数。


range()是最常用的产生一个序列的方法了。这里先介绍一些range()函数。

在python2.7里面,直接使用range()就可以产生序列。下列的演示代码演示了使用range()生成一个[0,10)区间内的整数。

>>> range(10)
[0,1,2, 3, 4, 5, 6, 7, 8, 9]

range()函数在只有一个参数是正整数n的时候,产生[0,n)区间的整数。

range()函数在有两个参数是整数a,b的时候,可以产生[a,b-1)区间的整数。

>>> range(-10,0)
[-10,-9, -8, -7, -6, -5, -4, -3, -2, -1]

range()函数在有三个参数为整数a,b,s的时候,可以产生[a,b),并且步长为s的整数

>>> range(1,10,2)
[1, 3,5, 7, 9]

Python3.x的range()返回的是一个可迭代对象,如果要查看range()会产生什么结果,需要转换成list类型进行查看

>>> list(range(0,10,2))
[0, 2, 4, 6, 8]


对于for循环来说,python2.7和python3.x的range()在使用上语义相同 ,完全不需要担心。

下面的代码演示了借助range()函数产生的序列来控制循环次数,来产生十个*。range(10)产生一个10个整数的序列,使用for语句,每次顺序访问一个,直到序列元素都被访问完,i就是每次访问的序列元素。在下面的代码中i的值没有意义,只是用来辅助计数的。

>>> s=''
>>> for i in range(10):
...  s+='*'
... 
>>> print(s)
**********


在某些时候,range()产生的元素值我也需要用到,那么就可以在for循环语句中使用它。下面的演示代码就演示了循环打印一个序列元素。

>>> for i in range(3):
        print(i)
0
1
2


一般情况下,for循环需要遍历完序列里面的所有元素才会结束。如果要在没有遍历完的情况下退出,需要在for语句中使用break来跳出循环。

下面的代码演示了如果当前访问的序列元素大于2,那么就跳出这个循环。在判断语句前后都加上打印语句跟踪循环的执行情况。

>>> for i in range(1,5):
    ...print('begin '+str(i))
    ...if i>2:
    ...    break
    ...print('end '+str(i))
... 

这段代码的结果为

begin 1
end 1
begin 2
end 2
begin 3

可以看到在i为3的时候,就退出了循环,整个循环只进行了2次,还有一次中途夭折,没有机会打印 end 3 这句话。


如果只是想要停止执行本次的代码,但是又想继续循环,需要用continue。下面的演示代码把break换成了continue。

>>> for i in range(1,5):
    ...print('begin '+str(i))
    ...if i>2:
    ...    continue
    ...print('end '+str(i))
... 

这段代码的执行结果是

begin 1
end 1
begin 2
end 2
begin 3
begin 4

可以看到,当i大于2的时候,代码虽然跳过了print('end '+str(i))这段代码,但是依然挣扎循环了4次,只是有些循环半路夭折而已。


for语句也是可以有else的。else语句在for语句遍历完整个序列的时候执行

>>> for i in range(1,3):
    ... print(i)
    else:
    ... print(i)
... 
1
2
2

可以看到在执行遍历完[1,2]这个序列的时候,else被调用了。


刚才介绍了for循环里面使用了break,会跳出循环,这样else语句就不会被执行。

>>> for i in range(1,5):
        print(i)
        if i>2:
            break
    else:
        print('else '+str(i))
... 
1
2
3

上面的代码并没有执行else语句。


而continue语句是可以把序列遍历完的,else也会在序列被遍历完之后执行。

>>> for i in range(1,5):
        print(i)
        if i>2:
            continue
        else:
            print('else '+str(i))
... 
1
2
3
4
else 4

上面的语句else语句照常执行,打印出了else字样。


5.3 while语句

while语句是条件控制和循环控制的结合。当while为True的时候,循环就会继续。

下面的演示就展示了当i小于5的时候,就给i加1。

>>> i=0 
>>> while i<5:
    ... print(i)
    ... i+=1
... 
0
1
2
3
4

使用while语句,比较自由,风格也比较野。如果控制循环次数的参数没有算好,那么循环很可能永远都出不来。很多时候就忘了给i加1,导致i无法大于5,于是一直进行循环。所以使用while的时候要很注意。

当然有些时候就是需要一直循环不要出来。比如服务器系统,即使没事,也需要一直循环等待,此时使用

while True:
    {各种代码块}

就非常适合。


While同样也可以有break。下面的演示代码演示的就是循环5次,每次循环里面都随机产生一个数,如果大于1就退出循环

>>> while i<5:
    ... print(i)
    ... i+=1
    ... j=random.randint(1,2)
    ... if j>1:
        ... break
... 
0


While也有continue和else,它们的使用和for循环语句里面的continue和else是一致的。这里也不累叙了。


本文完


猜你喜欢

转载自blog.csdn.net/weixin_42407546/article/details/80912835