Python 程序控制之循环结构

2018/10/15 Python

Python 程序控制之循环结构

1. while 循环

语法格式:

while condition:
    block

当条件满足 condition 为 True,进入循环体,执行 block。

示例:

count = 1

while count <= 10:
    print(count)
    count += 1

1.1 死循环

语法格式:

while True:
    block

2. for 循环

语法格式:

for element in iterable:
    block

每次循环从可迭代对象(iterable)中取出一个元素,赋值给 element ,然后执行 block 。

2.1 range 函数

range 函数的主要作用就是,返回一个可迭代对象。range 函数的参数必须是一个整数。

使用方法:

range(stop)
或者
range(start,stop[,step])
  • start 起始数
  • stop 结束
  • step 步长

示例:

In [1]: for i in range(10):
   ...:     print(i)
0
1
2
3
4
5
6
7
8
9

上面代码中,range 函数只给了一个10 也就是 stop 是10,但是从输出结果看,可迭代对象是从 0 开始,到 9 结束,也就是不包含 10。如果想打印 1..10 可以这样来写:

In [3]: for i in range(1,11):
   ...:     print(i)
1
2
3
4
5
6
7
8
9
10

如果我们想打印 10 以内的奇数,这里就可以用 step 步长来实现:

In [4]: for i in range(1,11,2):
   ...:     print(i)
1
3
5
7
9

3. continue 与 break

3.1 continue

continue 的作用是中断当前循环的当次执行,继续下一次循环。

示例:打印 10 以内整数,但 3 和 6 不打印

-w555

3.2 break

break 的作用是终止当前循环。

示例:写一个死循环,当 count = 5 就退出循环

-w547

4. 循环 else 子句

语法格式:

while condition:
    block
else:
    block
    
# for 循环
for element in iterable:
    block
else:
    block

如果循环正常执行结束,就执行 else 子句;如果使用 break 终止,else 子句不会执行。

示例:

-w500

5. 练习

练习1、给定一个不超过5位数的正整数,判断该数的位数,依次打印出个位、十位、百位、千位、万位的数字。

num = int(input("输入一个不超过5位数的整数: "))

if num >= 100:
    if num >= 10000:
        print("--> 5")
    elif num >= 1000:
        print("--> 4")
    elif num >= 100:
        print("--> 3")
else:
    if num >= 10:
        print("--> 2")
    else:
        print("--> 1")

while num > 0:
    i = num % 10
    print(i)
    num //= 10

分析一下上面代码是如何分别打印出个位、十位、百位、千位、万位:

-w882

运行代码:

判断整数位数

练习2、打印一个边长为n的正方形

num = int(input("输入一个数字: "))

for i in range(1,num+1):
    if i == 1 or i == num:
        print("*" * num)
    else:
        print("*"+" " * (num-2)+"*")

运行代码:

打印正方形

练习3、判断学生成绩,成绩等级A~E。其中,90分以上为A,80~89为B,70~79为C,60~69为D,60一下为E 。

# 判断学生成绩,成绩等级A~E。其中,90分以上为A,80~89为B,70~79为C,60~69为D,60一下为E

for i in range(3):
    result = int(input("输入学生成绩: "))

    if result >= 90 and result <= 100:
        print("A")
    elif result >= 80 and result <= 89:
        print("B")
    elif result >= 70 and result <= 79:
        print("C")
    elif result >= 60 and result <= 69:
        print("D")
    elif result < 60:
        print("E")
    else:
        print("输入错误")

运行代码

学生成绩

练习4、求1到5阶乘之和

# 求1到5阶乘之和
sum = 0
count = 1
for i in range(1,6):
    count *= i
    sum += count
print(sum)

以上代码分析流程如下图: -w975

运行代码

阶乘

练习5、给一个数,判断它是否是素数(质数)

  • 质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。
# 给一个数,判断它是否是素数(质数)
num = int(input("输入一个数字: "))

if num > 1:
    for i in range(2,num):
        if (num % i) == 0:
            print(num,"不是素数")
            print(i,"*",num // i,"=",num)
            break
    else:
        print(num,"是素数")
else:
    print("不是素数")

运行流程分析如下: -w934

运行代码

判断素数

练习5、打印 100 以内斐波那契数列。

  • 斐波那契数列:费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出。
# 打印100以内斐波那契数列
a = 0
b = 1

while True:
    c = a + b
    a = b
    b = c
    if c > 100:
        break
    print(c)

运行代码:

100以内斐波那契数列

练习6、打印菱形

如下图: -w272

思路:

行数 星号个数 前置空格数 总空格数
1 1 3 6
2 3 2 4
3 5 1 2
4 7 0 0
5 5 1 2
6 3 2 4
7 1 3 6

通过观察上面的分析可以找出一些规律,前置空格的个数通过 -3,4 就可以实现了,而 * 的个数就更加容易用 7 减去前置空格乘2就是 * 的个数,而为什么要乘2呢?因为两边都是存在空格的。

代码实现:

# 打印菱形
line = 7

for i in range(-3,4):
    if i < 0:
        pre_space = -i
    else:
        pre_space = i
    print(' ' * pre_space + '*' * (line - pre_space * 2))

运行代码:

打印菱形

练习7、打印对顶三角形

如下图:

-w209

思路:

行数 星号个数 前置空格数 总空格数
1 7 0 0
2 5 1 2
3 3 2 4
4 1 3 6
5 3 2 4
6 5 1 2
7 7 0 0

通过观察上面分析后得到思路:起始行和最后一样的星号个数一样,那么就仍然可以使用由负数到正数这样的方法,而前置空格的个数,就可以通过 “(行数 - 星号个数) // 2” 得到。需要注意的地方是当循环到负一(-1)的时候为了实现不重复打印 * 号为 1 的行,需要将 -1 跳过。

代码实现:

# 打印对顶三角形

line = 7

for i in range(7,-8,-2):
    if i == line:
        print('*' * i)
    elif i >= 1:
        # star_num 表示星号的个数
        star_num = i
        print(' ' * ((line - star_num) // 2) + '*' * star_num)
    elif i == -1:
        continue
    else:
        star_num = -i
        print(' ' * ((line - star_num) // 2) + '*' * star_num)

运行代码:

打印对顶三角形

练习8、打印闪电

如下图:

-w350

代码实现:

# 打印闪电

line = 7
for i in range(-3, 4):
    # 闪电上半部分, i 是负数
    if i < 0:
        pre_space = -i
        print(" " * pre_space + "*" * (4 + i))
    elif i == 0:
        print("*" * line)
    # 闪电下半部分, i 是正数
    else:
        print(" " * (line // 2) + "*" * (4 - i))

运行代码:

打印闪电

Search

    Table of Contents