零基础搭建量化投资系统:以Python为工具
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 Python程序流程控制语句

在Python程序运行过程中有一个内部命令指针,它指向当前要运行的语句行。因此,Python程序流程控制语句可以改变程序命令指针的位置。

1.顺序执行

顺序执行指程序由上至下,逐行逐条执行每行命令。Python程序默认顺序执行。

2.条件分支语句

条件分支语句一般指if语句。

(1)单条件分支命令格式。

        if逻辑表达式:
            命令块
        else :
            命令块

(2)多条件语句格式。

        if逻辑表达式1:
            命令块
        elif逻辑表达式2:
            命令块
            …
        else :
            命令块

示例2-13:根据学生分数打印字母等级,程序代码如下。

        #示例2-13 根据学生分数打印字母等级.py
        score =float(input(’请输入成绩 :'))
        level = int(score / 10)

       if level >= 10:
          print('Level A+')
      elif level == 9:
          print('Level A')
      elif level == 8:
          print('Level B')
      elif level == 7:
          print('Level C')
      elif level == 6:
          print('Level D')
      else:
          print('Level E')

程序运行结果如下:

        请输入成绩 :68
        Level D

(3)三元条件语句格式。

        变量v=表达式结果x  if  逻辑表达式A  else表达式结果y

解释:如果“逻辑表达式A”为True,则“表达式结果x”赋值给变量v,否则把“表达式结果y”赋值给变量v。

下面是示例2-14。

        #a是判定条件
        a=True
        b=5
        c=20
        #方法一:为真时的结果if判定条件else为假时的结果
        d = b if a else c       #如果a为真,结果是b,否则结果是c
        print(’方法一输出结果:' , d)

       #方法二:判定条件and为真时的结果or为假时的结果
        d = a and b or c        #如果a为真,结果是b,否则结果是c
        print(’方法二输出结果:' , d)

       #以上两种方法等同于if ... else ...
        if a:
            d = b                #d=b=5
        else:
            d = c                #d=c=20
        print('if语句的输出结果:', d)

程序运行结果:

        方法一输出结果: 5
        方法二输出结果: 5
        if语句的输出结果: 5

3.循环语句

Python有三种循环类型:for循环、while循环和内嵌循环。循环体中的控制语句有break语句(循环中断)、continue语句(跳过循环体后面的语句开始执行下一轮循环语句块)。

1)for循环

首先学习range()函数的用法。Python 3的range()函数返回的是一个可迭代对象(类型是对象)而不是列表类型,可用在for循环中。函数语法:

        range(start, stop[, step])

start:计数从“start”开始,默认从0开始。例如,range(5)等价于range(0,5)。

stop:计数到“stop”结束,但不包括“stop”。例如,range(0,5)产生的是[0, 1, 2, 3, 4]的序列对象,没有5。

step:步长,默认为1。例如,range(0,5)等价于range(0, 5,1)。

例如,range(10)会产生一个[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]的序列对象。

for循环类型用于遍历一个序列对象中的所有元素,如序列数据(list, tuple, range, str)、集合和映射对象(如字典)等。这与其他计算机语言的for语句有本质区别。

Python 3的for语句格式如下:

        for变量a  in  序列对象list :
            循环体语句块

下面看一个例子,打印出福利彩票3D的全部号码。我们知道福利彩票3D的号码范围为000~999,即共有1000种不同的号码,这是一个0~9的排列问题,如示例2-15所示。

        #打印全排列m
        #排列m
        m=3  #=3 3D; =5 排列5
        print()
        print(’共有排列数为: ',10**m)
        # **代表平方
        for a  in range(10**m):
            print(str(a).zfill(3)) #转换为字符串,前面补0

程序运行结果:

      共有排列数为:1000
      000
      001
      002
      003
      004
      ...中间省略
      998
      999

示例2-16:通过for循环打印九九乘法表。

        for j in range(1, 10):
            for i in range(1, j+1):
              print('%d*%d=%d' %(i, j, i*j), end='\t')
              i += 1
            print()
            j += 1

程序运行结果:

        1*1=1
        1*2=2   2*2=4
        1*3=3   2*3=6   3*3=9
        1*4=4   2*4=8   3*4=12  4*4=16
        1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
        1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
        1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
        1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
        1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

2)while循环

Python的while命令格式如下:

        while  逻辑表达式(也称循环条件):
            循环体命令块

示例2-17:通过while循环打印九九乘法表。

        j = 1
        while j <= 9:
            i = 1
            while i <= j:
              print('%d*%d=%d' %(i, j, i*j), end='\t')
              i += 1
            print()
            j += 1

程序运行结果:

        1*1=1
        1*2=2   2*2=4
        1*3=3   2*3=6   3*3=9
        1*4=4   2*4=8   3*4=12  4*4=16
        1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
        1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
        1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
        1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
        1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

3)嵌套循环

各种循环可以嵌套,但是语句块空格需要统一,而完整功能的循环体就是一个语句块。

我们来看一个号码组合的例子,打印出体育彩票11选5的全部号码组合。从题意中就能看出,这需要5层循环,其中每组号码排列有号码重复,组合没有号码重复。

请看示例2-18。

        #打印出彩票11选5的全部号码组合
        #组合m选5
        #m=11, n=5
        print()
        m=11 #M
        hm=[]
        for a  in range(1, m+3):
            for b  in range(a+1, m+1):
              for c  in range(b+1, m+1):
                  for d  in range(c+1, m+1):
                      for e  in range(d+1, m+1):
                          hm.append([a, b, c, d, e])
                            #print(f, e, d, c, b, a)
        print(’共有组合数为: ', len(hm))
        for x in hm:
            print(x)

程序运行结果:

        共有组合数为:  462
        [1, 2, 3, 4, 5]
        [1, 2, 3, 4, 6]
        [1, 2, 3, 4, 7]
        [1, 2, 3, 4, 8]
        [1, 2, 3, 4, 9]
        [1, 2, 3, 4, 10]
        [1, 2, 3, 4, 11]
        [1, 2, 3, 5, 6]
        ...中间略去
        [5, 8, 9, 10, 11]
        [6, 7, 8, 9, 10]
        [6, 7, 8, 9, 11]
        [6, 7, 8, 10, 11]
        [6, 7, 9, 10, 11]
        [6, 8, 9, 10, 11]
        [6, 8, 9, 10, 11]
        [7, 8, 9, 10, 11]

4)循环体内的分支语句

循环体内也可以有分支语句,但是语句块空格需要统一,而完整功能的分支体就是一个语句块。分支语句和循环语句混合成为一个复杂的语句块。

一般来说,分支语句可以控制循环体内的循环次数。

(1)满足分支条件的break语句可以使程序中止当前循环体的运行,使命令运行指针跳出当前循环体,并指向循环体外部的第一条语句行开始执行命令。

请看示例2-19,打印大于0且小于20的所有偶数。

        #打印大于0且小于20的所有偶数
        print()
        for a  in range(1,20):
            if a%2==0:      #是偶数
              print(a, end=', ')

程序运行结果:

        2,4,6,8,10,12,14,16,18,

请看示例2-20。

        #打印1-20的所有偶数,含20
        print()
        for a  in range(1,100):
            if a%2==0:      #是偶数
              print(a, end=', ')
            if a==20:       #如果a=20, 则跳出循环体
              break

程序运行结果:

        2,4,6,8,10,12,14,16,18,20,

(2)continue语句可以使程序中止循环体内的continue语句后面的所有语句块,而接着执行下一轮循环语句块。

请看示例2-21。

        #打印1-20的所有偶数,含20
        print()
        for a  in range(1,100):
            if a%2! =0:      #不是偶数
               continue      #继续下一轮循环,后面循环体内的语句都不执行了

           print(a, end=', ')
          if a==20: #如果a=20, 则跳出循环体
              break

程序运行结果:

        2,4,6,8,10,12,14,16,18,20,

4.占位语句

占位语句指pass语句,什么也不执行,只是在语句体中占位。

由于Python语法结构的特殊性,在设计程序时,针对没有想好的分支语句、循环语句或函数体的命令块,如果用空格代替,就会出现语法错误。此时,我们就可以用pass语句作为程序结构的占位语句。当想好具体的算法时,再用算法命令块去代替pass占位语句。

请看示例2-22。

        #打印1-20的所有偶数,含20
        print()
        for a  in range(1,100):
            if a%2==1:  #是奇数
               pass     #占个位置
            else:
               print(a, end=', ')
            if a==20:   #如果a=20,则跳出循环体
               break

程序运行结果:

        2,4,6,8,10,12,14,16,18,20,