在流程控制中,难免会有一些重复的工作,比如给100个变量复制,打印列表中的每一个元素等,如果都每一条语句都要我们自己进行操作,那工作量是非常大的
在python中,有两个循环语句,while和for ,两个的原理类似,先判断条件,条件成立就执行循环体内的语句,然后再次判断条件是否成立,再次执行循环内的语句,直到条件不成立
while循环
语法
Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:
Python
while 条件满足:
语句1...
else:
循环完成后 要执行的语句
执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true
当判断条件为假(False)时,循环结束
死循环
当条件一直为真时会一直循环下去,一直在循环内,不能走出循环的语句,被称为“死循环”又叫“无限循环”
Python
# 最简单的死循环语句
while True:
print('这是一条死循环')
循环使用 else 语句
在 python 中,while … else 在循环条件为 false 时执行 else 语句块:
Python
count = 0
while count < 5:
print (count, " is less than 5")
count = count + 1
else:
print (count, " is not less than 5")
条件成立时,执行第一个print语句,然后count+1,直到count加到5,条件不满足,执行else下的print语句
可用于判断循环结构是否结束
简单语句组
类似 if 语句的语法,如果你的 while 循环体中只有一条语句,你可以将该语句与while写在同一行中, 如下所示:
Python
flag = 1
while (flag): print 'Given flag is really true!'
print "Good bye!"
使用while循环计算1+2+......+99+100的值:
Python
i=1
sum=0
while i<=100:
sum+=i
i+=1
print(sum)
# 5050
for循环
它常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素
for 循环的语法格式如下:
Python
for 迭代变量 in 字符串|列表|元组|字典|集合:
代码块
格式中,迭代变量用于存放从序列类型变量中读取出来的元素,所以一般不会在循环中对迭代变量手动赋值
代码块指的是具有相同缩进格式的多行代码(和 while 一样),由于和循环结构联用,因此代码块又称为循环体
Python
add = "https://www.baidu.com"
#for循环,遍历 add 字符串
for ch in add:
print(ch,end="")
# 输出:https://www.baidu.com
可以看到,使用 for 循环遍历 add 字符串的过程中,迭代变量 ch 会先后被赋值为 add 字符串中的每个字符,并代入循环体中使用。只不过例子中的循环体比较简单,只有一行输出语句
实现计算1+2+......+99+100的值
Python
print("计算 1+2+...+100 的结果为:")
#保存累加结果的变量
result = 0
#逐个获取从 1 到 100 这些值,并做累加操作
for i in range(101):
result += i
print(result)
# 计算 1+2+...+100 的结果为:
# 5050
这个时候,在我们的代码里面出现了一个陌生的函数——range( )函数
range( ) 的使用
上面代码中,使用了 range() 函数,此函数是 Python 内置函数,用于生成一系列连续整数,多用于 for 循环中
我们这里只需要明白range() 函数可以进行数字迭代生成就好了
for循环遍历列表和元组
当用 for 循环遍历 list 列表或者 tuple 元组时,其迭代变量会先后被赋值为列表或元组中的每个元素并执行一次循环体
Python
# 对列表进行遍历
my_list = [1,2,3,4,5]
for ele in my_list:
print('ele =', ele)
> ele = 1
ele = 2
ele = 3
ele = 4
ele = 5
Python
# 对元组进行遍历
my_list = (1,2,3,4,5)
for ele in my_list:
print('ele =', ele)
可以看到两者结果是完全相同的
> ele = 1
ele = 2
ele = 3
ele = 4
ele = 5
for 循环遍历字典
在使用 for 循环遍历字典时,经常会用到和字典相关的 3 个方法,即 items()、keys() 以及 values(),它们各自的用法已经在前面章节中讲过,这里不再赘述。当然,如果使用 for 循环直接遍历字典,则迭代变量会被先后赋值为每个键值对中的键。
Python
dic={'name':'小明','age':22,'score':100}
for di in dic:
print(di)
# 得到字典的每一个键(key)默认
for di in dic.items():
print(di)
# 得到字典的每一组数据,其结果为一个元组
for di in dic.values():
print(di)
# 得到字典的每一组键所对应的值
for di in dic.keys():
print(di)
#得到字典的每一键(key) 默认情况
字典中的items( )、keys( ) 以及 values ( ) 的用法
items():以列表返回可遍历的(键, 值) 元组数组
items() 方法的遍历:items() 方法把字典中每对 key 和 value 组成一个元组,并把这些元组放在列表中返回
Python
d = {'one': 1, 'two': 2, 'three': 3}
>>> d.items()
dict_items([('one', 1), ('two', 2), ('three', 3)])
>>> type(d.items())
>>> for key,value in d.items():#当两个参数时
print(key + ':' + str(value))
one:1
two:2
three:3
>>> for i in d.items():#当参数只有一个时
print(i)
('one', 1)
('two', 2)
('three', 3)
keys():以列表返回一个字典所有的键
values():以列表返回一个字典所有的值
for练习
- 求1~100内偶数之和
Python
sum = 0
for i in range(2,101,2):
sum += i
print(sum)
- 求阶乘
Python
# 求阶乘
num = int(input('请输入一个数字:'))
res = 1
for i in range(1, num + 1):
res*=i
print('%d的阶乘为:%d' %(num,res))
- 9*9乘法表
Python
for i in range(1,10):
for j in range(1,i+1):
print('%d * %d = %d\t' %(i,j,i*j),end='')
print()
- 求最大公约数和最小公倍数
Python
# 输入两个数字
num1=int(input('Num1:'))
num2=int(input('Num2:'))
# 找出两个数中的较小者
min_num = min(num1,num2)
# 确定最大公约数
for i in range(1,min_num+1):
if num1 % i ==0 and num2 % i ==0:
max_commer = i
# 求最小公倍数
min_commer =int(num1 * num2)/max_commer
print('%s 和 %s 的最大公约数为%s' %(num1,num2,max_commer))
print('%s 和 %s 的最小公倍数为%s' %(num1,num2,min_commer))
break的使用
Python break语句,就像在C语言中,打破了最小封闭for或while循环。
break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。
break语句用在while和for循环中。
如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。
我们知道,在执行 while 循环或者 for 循环时,只要循环条件满足,程序将会一直执行循环体,不停地转圈。但在某些场景,我们可能希望在循环结束前就手动离开循环,Pyhton 提供了 2 种强制离开当前循环体的办法:
- 使用 continue 语句,可以跳过执行本次循环体中剩余的代码,转而执行下一次的循环。
- 只用 break 语句,可以完全终止当前循环。
我们先来了解break语句
在某些场景中,如果需要在某种条件出现时强行中止循环,而不是等到循环条件为 False 时才退出循环,就可以使用 break 来完成这个功能。
break 用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到 break,系统就将完全结束该循环,开始执行循环之后的代码。
这就好比在操场上跑步,原计划跑 10 圈,可是当跑到第 2 圈的时候,突然想起有急事要办,于是果断停止跑步并离开操场,这就相当于使用了 break 语句提前终止了循环。
break 语句一般会结合 if 语句进行搭配使用,表示在某种条件下,跳出循环体,如果使用嵌套循环,break 语句将跳出当前的循环体。
break 语句的语法非常简单,只需要在相应 while 或 for 语句中直接加入即可。例如如下程序:
Python
# 一个简单的for循环
for i in range(0, 10) :
print("i的值是: ", i)
if i == 2 :
# 执行该语句时将结束循环
break
当i等于2时系统结束循环
break 语句导致了 i==2 时执行结束,因为当 i==2 时,在循环体内遇到了 break 语句,程序跳出该循环。
需要注意的是,对于带 else 块的 for 循环,如果使用 break 强行中止循环,程序将不会执行 else 块。例如如下程序:
Python
# 一个简单的for循环
for i in range(0, 10) :
print("i的值是: ", i)
if i == 2 :
# 执行该语句时将结束循环
break
else:
print('else块: ', i) # 这个else语句并不会执行
上面程序同样会在 i==2 时跳出循环,而且此时 for 循环不会执行 else 块。
在使用 break 语句的情况下,循环的 else 代码块与直接放在循环体后是有区别的,即如果将代码块放在 else 块中,当程序使用 break 中止循环时,循环不会执行 else 块;如果将代码块直接放在循环体后面,当程序使用 break 中止循环时,程序自然会执行循环体之后的代码块。
另外,针对嵌套的循环结构来说,Python 的 break 语句只能结束其所在的循环体,而无法结束嵌套所在循环的外层循环。例如:
Python
for i in range(0,4) :
print("此时 i 的值为:",i)
for j in range(5):
print(" 此时 j 的值为:",j)
break
print("跳出内层循环")
分析运行结果不难看出,每次执行内层循环体时,第一次循环就会遇到 break 语句,即做跳出所在循环体的操作,转而执行外层循环体的代码。
如果想达到 break 语句不仅跳出单前所在循环,同时跳出外层循环的目的,可先定义 bool 类型的变量来标志是否需要跳出外层循环,然后在内层循环、外层循环中分别使用两条 break 语句来实现。例如如下程序:
Python
exit_flag = False
# 外层循环
for i in range(0, 5) :
# 内层循环
for j in range(0, 3 ) :
print("i的值为: %d, j的值为: %d" % (i, j))
if j == 1 :
exit_flag = True
# 跳出里层循环
break
# 如果exit_flag为True,跳出外层循环
if exit_flag :
break
上面程序在内层循环中判断 j 是否等于 i,当 j 等于 i 时,程序将 exit_flag 设为 True,并跳出内层循环;接下来程序开始执行外层循环的剩下语句,由于 exit_flag 为 True,因此也会执行外层循环的 break 语句来跳出外层循环。
程序从外层循环进入内层循环后,当 j 等于 i 时,程序将 exit_flag 设为 True,并跳出内层循环;接下来程序又执行外层循环的 break 语句,从而跳出外层循环。
continue的使用
和 break 语句相比,continue 语句的作用则没有那么强大,它只会终止执行本次循环中剩下的代码,直接从下一次循环继续执行。
仍然以在操作跑步为例,原计划跑 10 圈,但当跑到 2 圈半的时候突然接到一个电话,此时停止了跑步,当挂断电话后,并没有继续跑剩下的半圈,而是直接从第 3 圈开始跑。
continue 语句的用法和 break 语句一样,只要 while 或 for 语句中的相应位置加入即可。例如:
Python
add = "https://baidu.com,https://zhihu.com"
# 一个简单的for循环
for i in add:
if i == ',' :
# 忽略本次循环的剩下语句
print('\n')
continue
print(i,end="")
# https://baidu.com
https://zhihu.com
程序在遇到 ' ,' 时,跳过本次循环,进行下一次循环
continue的作用
结合异常处理(try),查找异常报告并跳过这次异常
range使用
range语法
Python
range(start,stop,step)
> start:开始
stop:结束(stop值是不包含的)
step:步长
python2.x range() 函数可创建一个整数列表,一般用在 for 循环中
注意:Python3 range() 返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表,具体可查阅 Python3 range() 用法说明。
print(range(1,100),type(range(1,100)))
# range(1, 100)
我们可用使用list函数返回列表
Python
print(list(range(1,10)))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
一些range对象的例子
> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list(range(0, 30, 5))
[0, 5, 10, 15, 20, 25]
list(range(0, 10, 3))
[0, 3, 6, 9]
list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
list(range(0))
[]
list(range(1, 0))
[]
range 对象实现了 一般 序列的所有操作,但拼接和重复除外(这是由于 range 对象只能表示符合严格模式的序列,而重复和拼接通常都会违反这样的模式)
range 类型相比常规 list 或 tuple 的优势在于一个 range 对象总是占用固定数量的(较小)内存,不论其所表示的范围有多大(因为它只保存了 start, stop 和 step 值,并会根据需要计算具体单项或子范围的值)
range 对象实现了 collections.abc.Sequence ABC,提供如包含检测、元素索引查找、切片等特性,并支持负索引
Python
r = range(0, 20, 2)
# 0 2 4 6 8 10 12 14 16 18
>> r
range(0, 20, 2)
>> 11 in r #包含检测
False
>> 10 in r
True
>> r.index(10) # 根据内容查索引值
5
>> r[5] # 根据索引查内容值
10
>> r[:5] # 切片返回类一个新的range对象
range(0, 10, 2)
>> r[-1] # 取最后一个元素,是在range(0,20,2)上面进行的
18