python | 控制流语句-循环结构

 

3.3 循环结构

3.3.1 分类

循环结构共有两种:

  • while循环:「无限循环」,用于循环次数难以提前确定,也可以用于循环次数确定的情况
  • for循环:「有限循环」,用于循环次数可以提前确定,尤其常用于枚举序列,或迭代对象中的元素

一般而言,优先考虑使用for循环,而相同或不同的循环结构之间可以互相嵌套,实现更为复杂的逻辑。

 

3.3.1.1 for循环

for循环常用于访问序列中的元素,序列中有多少个元素,for循环就执行多少次,因此for循环的循环次数是已知的,这种遍历方式在Python里称为迭代。可用for循环遍历的序列包括:字符串、列表、元组、集合、字典等等。

for循环语法如下:

for 变量 in 序列:
    语句块

说明:
1.for:for循环关键字,固定写法
2.变量:循环变量
3.in: for循环关键字,固定写法
4.序列:包括字符串、列表、字典、元组、集合、迭代器、生成器、range、文件、组合数据类型
5.冒号: 固定写法
6.语句块: 格式上按Tab键缩进对齐;内容上是需要重复执行的一条或多条语句

执行过程:
让变量去序列中一个一个取值,每取一个值执行一次语句块,直到取完为止。
# 测量列表中每个字符的长度
words=["思想","*理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words[:]:
    print(w,len(w))

# 测量列表中每个字符的长度
words = ["思想", "*理论", "三个代表重要思想", "科学发展观", "新时代中国特色社会主义思想"]
for w in words[:]:
    if len(w) > 5:
        words.remove(w)
print(words)

# 求输入n个数的平均数
n=eval(input('要输入多少个数'))
sum=0.0
for i in range(n):
    x=eval(input('请输入数字'))
    sum=sum+x
print(sum/n)

 

3.3.1.2 while循环

while循环与for循环最大的区别在于:前者循环次数不确定,后者循环次数确认,体现在循环语法中就是,for循环可以通过控制序列中元素的个数来控制循环的次数;while循环是通过循环变量的修正,使得循环变量在某个临界点不满足条件语句时才结束循环,这是while循环区别于for循环的重要特征之一。

while循环适用场景:一是死循环;二是循环次数不确定。其使用语法如下:

while 条件语句:
    语句块
    循环变量的修正

说明:
1.while:关键字,固定写法
2.条件语句:包含循环变量的条件表达式,不能是赋值语句
3.冒号:固定写法
4.语句块:格式上按Tab键缩进对齐;内容上是需要重复执行的一条或多条语句
5.循环变量的修正:while循环每进行一次,对循环变量做一次修正

执行过程:
先判断条件语句是否为True,若为True就执行语句块,并修正循环变量,然后再次判断条件语句是否满足,
如果依然为True则执行循环并修正,直到条件语句为False时,循环结束。
# while循环:实现0到100的求和
i = 1
sum = 0
while i <= 100:
    sum = sum+i
    i = i+1          # 等价于i += 1(累加)
print(sum)

 

3.3.2 else拓展

for循环和while循环都存在else拓展用法:

  • for循环:else语句只在for循环遍历完成后才执行,可用于判断循环执行情况
  • while循环:else语句只在while循环条件不被满足时(为False)才执行
  • break:若循环是因为break结束的,则else语句不会执行

其使用语法如下:

# for循环else拓展
for 变量 in 序列:
    语句块
else:
    语句块

# while循环else拓展
while 条件语句:
    语句块
    循环变量的修正
else:
    语句块

执行过程:
1.当for循环变量遍历结束或while循环条件语句为False时,循环自然终止,此时才执行else后面的语句块		
2.如果循环是因为遇到break而结束,那么else后面的语句块就不会执行
所以,可以通过判断else中的代码有没有执行,来判断循环有没有遇到break
words=["思想","*理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words:
	print(w, len(w))
	break
else:
	print('循环正常结束')

 

3.3.3 循环结构优化

for循环与while循环也可以嵌套,但是建议大家不要嵌套3层以上,那样的话执行效率会很低,所以有必要对循环结构进行优化,优化时遵循下面两个原则:

  • 原则1:首先尽量减少循环嵌套层数,以<=3为佳

  • 原则2:无论单层还是多层循环,尽量减少循环内部不必要计算,将与循环语句无关代码往外提

# 循环结构-优化前
import time
start = time.time()  # 获取当前时间
digits = (1, 2, 3, 4)
for i in range(10000):
    result = []
    for i in digits:
        for j in digits:
            for k in digits:
                result.append(i*100+j*10+k)
print('Time Used:', time.time()-start)  # 输出所用时间
len(result)

# 循环结构-优化后,把计算的东西提出来
start = time.time()  # 获取当前时间
digits = (1, 2, 3, 4)
for i in range(10000):
    result = []
    for i in digits:
        i = i*100
        for j in digits:
            j = j*10
            for k in digits:
                result.append(i+j+k)
print('Time Used:', time.time()-start)  # 输出所用时间
len(result)

 

3.3.4 循环控制语句

python中用breakcontinue来控制循环语句,以实现循环的终止跳出

3.3.4.1 break

「终止当次循环,并跳出当前循环」 —— 循环层结束

可以从两方面理解:

  • 终止当次循环:则当次循环后面的if、elif、else…都不再执行
  • 跳出当前循环:若break跳出的是循环嵌套内层循环,则外层的循环会继续执行
# 遍历循环拓展模式:通过else判断循环是否正常结束
words=["mzd思想","*理论","三个代表重要思想","科学发展观","新时代中国特色社会主义思想"]
for w in words[:]:
    print(w,len(w))
    break
else:
    print('循环正常结束')
	
# 从1开始累加,当和超过100时停止
i = 1
sum = 0
while i in range(100):
    sum = sum+i
    i = i+1
    if sum > 100:
        break
print(sum)
print(i)

# 计算小于100的最大素数
# 素数:只能表示为它自己和1的乘积,如13=13*1
for i in range(99, 1, -1):
    for j in range(2, i):
        if i % j == 0:     # 不是素数
            break          # 跳出当前循环,继续遍历列表
    else:
        print(i)
        break              # break,跳出所有循环;删除break,输出所有素数

 

3.3.4.2 continue

「终止当次循环,不跳出当前循环」 —— 循环层未结束

可以从两方面理解:

  • 终止当次循环:则当次循环后面的if、elif、else…都不再执行
  • 不跳出当前循环:循环会继续执行,直接进入下一次循环的条件判断
# 找出0-9之间的奇数、偶数,并打印出来
L1=[]
L2=[]
for i in range(10):
    if i%2==0:
        L1.append(i)
        continue
    L2.append(i)
L1
L2   

# 找出符合条件的字符:打印非T的字符
for i in 'PYTHON':
    if i == 'T':
        continue
    print(i)
else:
    print('正常退出')

# 找出符合条件的字符:打印非T的字符
for i in 'PYTHON':
    if i == 'T':
        break        # 体会break和continue的区别
    print(i)
else:
    print('正常退出')

 

3.3.5 死循环

死循环就是循环不会终止的循环类型,很多都是由于continue使用不当造成的,即continue使得条件表达式判断的结果永远为True,则产生死循环。

但死循环并非一无是处,可用于完成指定功能,如设置中断程序,常用while true while 1

# continue使用不当带来的死循环
# 输出小于10的奇数
i = 0
while i < 10:
    if i % 2 == 0:
        continue
        i += 1
    print(i)

# 正确的用法
i = 0
while i < 10:
    i += 1
    if i % 2 == 0:
        continue
    print(i)

# 死循环巧妙应用
# 输入正数时一直循环,输入负数时停止
while True:     # 等价于while 1
    num = eval(input('请输入一个正数'))
    if num < 0:
        break
print('程序终止')
posted @ 2019-12-26 09:59  1k-yang  阅读(442)  评论(0编辑  收藏  举报