赞
踩
python循环结构的学习,主要包括列表、for语句、range()函数、while语句、循环嵌套、break、continue、算法优化等。
列表可以包含多个/多种
数据元素,是一个有序的容器。
一个列表中的元素可以是不同类型的,其下标索引从0开始,亦可使用负数(从后向前)进行索引。
列表的常见操作:赋值、删除(remove、pop、del)、插入(insert)、添加(append)等。
用list函数可以将集合或字符串类型的数据转换成列表类型的数据。
请运行下列程序,查看结果并理解列表的作用(如有疑问欢迎留言)
a=[1,3,5,7,1,"盐中","苹果","123456",True,3<2] print(a) a[1]=7 print(a) a.remove(1) print(a) a.remove(1) print(a) del a[5] print(a) a.pop(5) print(a) a.insert(3,20211020) print(a) a.append("China") print(a) for i in a: print(i) for i in range(-1,-(len(a)+1),-1): print(a[i])
循环次数一定时,常使用计数循环(for语句)来实现。
for 语句的基本格式为:
for 循环变量 in 序列 :
\space\space\space\space\space 语句或语句组
缩进的语句或语句组称为循环体。Python规定循环体必须相对关键词 for 有缩进。in 后面也可以是range()函数。
range(a,b,c)函数:
▶
\blacktriangleright
▶ 可以生成一个 [a,b) 的数字序列,c表示步长值(序列的公差);
▶
\blacktriangleright
▶ 若只有两个参数a、b,则表示生成范围 [a,b) 的数字序列;
▶
\blacktriangleright
▶ 若只有一个参数 a,则表示生成范围 [0,a) 的数字序列。
请运行下列程序,查看结果并理解 range 的作用
for i in range(10):
print(i)
for i in range(10,20):
print(i)
for i in range(10,20,3):
print(i)
for i in range(20,10,-2):
print(i)
range(函数应用):
例 : 求a、b的最大公约数参考程序如下:
【参考程序1】
a=int(input())
b=int(input())
gcd=1
for i in range(1,a+1):
if a%i==0 and b%i==0:
gcd=i
print(gcd)
【参考程序2】
a=int(input())
b=int(input())
gcd=1
for i in range(a,0,-1):
if a%i==0 and b%i==0:
gcd=i
break
print(gcd)
条件循环(while语句)一般用于循环次数未知的情况。
while语句的基本格式为:
while 条件 :
\space\space\space\space\space 语句或语句组
当表达式成立时,执行循环体。Python允许表达式为数字,如果该数字为 “0” 则表示表达式为假(即不成立),为非 0 数字则表示为真(即成立)。
例:用辗转相除法求最大公约数,参考程序如下:
a=int(input())
b=int(input())
r=a%b
while r:
a=b
b=r
r=a%b
print(b)
一个循环结构的内部也可以包含另一个循环结构,这样的结构称为循环嵌套(也称为多重循环)。常用的循环嵌套是二重循环,分外层循环(外循环)与内层循环(内循环)。内循环是外循环的循环体,外层循环每执行一次,内层循环则执行一次完整的循环。
以计数循环for语句为例的二重循环格式如下:
for 循环变量1 in 序列1: \space\space\space\space\space\space\space\space\space\space #外循环
\space\space\space\space\space for 循环变量2 in 序列2: \space\space\space\space\space\space\space #内循环,注意缩进
\space\space\space\space\space\space\space\space\space\space 语句或语句组 \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space #循环体,注意缩进
例:“百钱买百鸡”
我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
参考程序如下:
for i in range(1,101): #i表示公鸡的数量
for j in range(1,101): #j表示母鸡的数量
for k in range(1,101): #k表示小鸡的数量
if i+j+k==100 and i*5+j*3+k/3==100: #满足“百鸡、百钱”的条件
print(i,j,k)
break语句用于终止某个循环,使程序跳到循环体以外的第一个可执行语句;continue语句用于终止本次循环,直接进入下一次循环,即跳过循环体内还未执行的语句,进入下一次循环的判定。
break语句使用示例:
#求最大公约数
a=int(input())
b=int(input())
gcd=1
for i in range(a,0,-1):
if a%i==0 and b%i==0:
gcd=i
break
print(gcd)
continue语句经常用于对程序进行优化,例如刚刚的“百钱买百鸡”的程序中不难发现,当 i+j>100 时就不再需要去进行k的取值与判定,即当公鸡母鸡的数量和超过100时直接跳过本次循环,进入下一次循环。
for i in range(1,101): #i表示公鸡的数量
for j in range(1,101): #j表示母鸡的数量
for k in range(1,101): #k表示小鸡的数量
if i+j+k==100 and i*5+j*3+k/3==100: #满足“百鸡、百钱”的条件
print(i,j,k)
可以改写如下
for i in range(1,101): #i表示公鸡的数量
for j in range(1,101): #j表示母鸡的数量
if i+j>100: #当公鸡母鸡的数量和超过100时直接跳过进入下一次循环
continue
for k in range(1,101): #k表示小鸡的数量
if i+j+k==100 and i*5+j*3+k/3==100: #满足“百鸡、百钱”的条件
print(i,j,k)
原本的循环体需要执行 10 0 3 100^3 1003 即一百万次,现在用continue立刻优化了一半变成了50万次,这种操作我们一般称为“可行性剪枝”,即发现某些情况不需要再往下做时用continue进行优化。当然就本题“百钱买百鸡”而言可以继续优化,例如公鸡的范围其实只可能在 [0,20],母鸡在 [0,33],小鸡可以根据公鸡母鸡的数量直接算出来,参考程序如下:
for i in range(21): #i表示公鸡的数量
for j in range(34): #j表示母鸡的数量
k=100-i-j #k表示小鸡的数量
if i*5+j*3+k/3==100: #满足“百钱”的条件
print(i,j,k)
优化循环的要点:
▶
\blacktriangleright
▶ 1、减少循环层数
▶
\blacktriangleright
▶ 2、缩小循环范围
▶
\blacktriangleright
▶ 3、将次数少的作为外层循环,次数多的作为内层循环
▶
\blacktriangleright
▶ 4、精简循环体
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。