Python基础之程序控制结构(二)
循环结构:程序根据条件判断结果向后反向执行的一种运行方式。根据循环体除法条件不同,循环结构包括条件循环和遍历循环结构。
for <变量> in <序列>:
<循环体>
for循环语句是通过遍历某一序列来完成循环,循环结束的条件就是序列被遍历完成。<变量>每经过一次循环就会得到序列中的一个元素,并通过循环体处理它。<序列>通常是字符串、文件、列表、range()等。<循环体>是for循环语句缩进的内容。当序列中的元素全部遍历完成后,程序就会自动退出循环,继续执行后面的语句。
遍历是指根据数据之间的逻辑结构,遵循一定的顺序,依次对<序列>中的的所有元素做一次且只有一次访问。
遍历循环可以理解为从<序列>中逐一提取元素,放在循环体变量中,对于所提取的每个元素执行一个语句块。
温馨提示:
(1) for循环语句<序列>后面必须要用英文输入法输入冒号。
(2) 循环体要向右缩进4个空格,或按1次Tab(制表)键。
(3) 循环次数采用<序列>中的元素个数来体现。
'''对字符串的遍历'''
for x in "apple":
print(x)
-------------------------------
输出结果:
a
p
p
l
e
range(起始点,终点,步长)
range(x)是控制x的取值范围,x表示终点,从0开始取值,但是取不到终点x值。
range(i,x),i表示起始点,x表示终点,从起始点i开始取值,但是取不到终点x值。
range(i,x,y),i表示起始点,x表示终点,y表示步长,即间隔y。
温馨提示:
(1) 起始点默认为0,步长默认为1,终点取不到!
(2) for循环语句中循环的次数取决于range(x)函数中x的取值,x能取到几个值,就能循环几次。
for <变量> in range(x):
<循环体>
for i in range(5):
print(i)
---------------------------------
输出结果:
0
1
2
3
4
for i in range(1,5):
print(i)
---------------------------------
输出结果:
1
2
3
4
for i in range(1,10,3):
print(i)
---------------------------------
输出结果:
1
4
7
for <变量> in <序列>:
<循环体>
else:
<语句块>
当for循环正常执行后,程序会继续执行else语句中的内容,else语句只在循环正常执行并结束后才执行。
for s in "BIT":
print("循环进行中:" + s)
else:
s="循环正常结束"
print(s)
--------------------------------------
输出结果:
循环进行中:B
循环进行中:I
循环进行中:T
循环正常结束
1、淮安民间广为流传的故事——“韩信点兵”。
秦朝末年,楚汉相争,大将军韩信带1500名兵士与楚国交战,楚军不敌,战死四五百人,为快速统计剩余兵将人数,韩信命令士兵3人一排,结果多出2人;接着命令士兵站5人一排,结果多出3人;又命令士兵站7人一排,多出2人。根据这些数据,如何编写程序快速计算出剩余的士兵人数?
1. 问题分析
利用for循环筛选出剩余士兵要同时满足被3除余2、被5除余3、被7除余2这三个条件的数。
2.编程步骤
(1)确定剩余的士兵人数范围。
(2)判断剩余的士兵是否同时满足被3除余2、被5除余3、被7除余2这三个条件
(3)如果同时满足三个条件,那么输出“剩余的士兵人数”
3.编写代码
for i in range(1000,1101):
if (i%3==2 and i%5==3 and i%7==2):
print("剩余的士兵人数:",i)
------------------------------------------------
输出结果:
剩余的士兵人数: 1073
2、统计2000到2022年是闰年的个数。
1. 问题分析
判断闰年的条件:能被4整除且不能被100整除或者能够被400整除的年。
2.编程步骤
(1)确定年份的范围,利用for循环遍历年份。
(2)判断年份是否满足被4整除且不能被100整除或者能够被400整除这三个条件
(3)如果是闰年,统计个数
(4)遍历结束,输出闰年的年份和个数。
3.编写代码
sum=0
for year in range(2000,2023):
if year%4==0 and year%100!=0 or year%400==0:
print(year,"是闰年")
sum +=1
print("2000年到2022年有",sum,"个闰年")
--------------------------------------------------------
输出结果:
2000 是闰年
2004 是闰年
2008 是闰年
2012 是闰年
2016 是闰年
2020 是闰年
2000年到2022年有 6 个闰年
很多应用无法在执行之初确定循环次数,这就需要提供根据条件进行循环
while <条件>:
<循环体>
其中 <条件>与if语句中的判断条件一样,结果为True和False。
当条件判断为True时,重复执行循环体的内容;当当条件判断为False时,终止循环
条件循环也有扩展模式
while <条件>:
<循环体>
else:
<语句块>
当while循环正常执行后,程序会继续执行else语句中的内容,else语句只在循环正常执行并结束后才执行。
s = "BIT"
idx = 0 # 计时器idx进行初始化
while idx < len(s): # 循环条件
print("循环进行中:" + s[idx]) #s[idx]表示字符串索引
idx +=1 # 对计数器累加
else:
s="循环正常结束"
print(s)
-------------------------------------------
输出结果:
循环进行中:B
循环进行中:I
循环进行中:T
循环正常结束
如果通过while实现一个计数循环,需要在循环之前对计数器idx进行初始化,并在每次循环中对计数器idx进行累加。
总结:
while计数循环语法格式
初始条件设置------如计数器初始化
while <条件>:
<当条件满足时,执行循环体>
处理条件(计数器+1)
i=1 #定义重复次数--计数器
while i < 5: #使用while判断条件
print("hello python")
i +=1 #计数器+1 不要遗忘,否则会进入死循环。
print("循环结束后i={}".format(i)) #循环结束后,之前定义的计数器条件的数值是依旧存在的
------------------------------------------------------------------------------
输出结果:
hello python
hello python
hello python
hello python
循环结束后i=5
死循环
由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止!
Python 中的计数方法
常见的计数方法有两种,可以分别称为:
自然计数法(从 1 开始)—— 更符合人类的习惯
程序计数法(从 0 开始)—— 几乎所有的程序语言都选择从 0 开始计数
因此,大家在编写程序时,应该尽量养成习惯:除非需求的特殊要求,否则循环的计数都从0开始。
'''计算 0 ~ 100 之间所有数字的累计求和结果'''
R=eval(input("请输入正整数:"))
i,sum = 0,0
while (i<=R):
sum = sum+i
i=i+1
print("1+2+3...+{}={}:".format(R,sum))
--------------------------------------------------
输出结果:
请输入正整数:100
1+2+3...+100=5050:
'''计算 0 ~ 100 之间所有偶数的累计求和结果'''
R=eval(input("请输入正整数:"))
i,sum = 0,0
while (i<=R):
if i%2==0:
sum = sum+i
i=i+1
print("0-100所有偶数之和:",sum)
--------------------------------------------------
输出结果:
请输入正整数:100
0-100所有偶数之和: 2550
for <变量> in <序列>:
for <变量> in <序列>:
<循环体>
for i in range(1,10): #行
for j in range(1,i+1): #列
print(j,end="") #显示列号
print("×",end="") #显示乘号
print(i,end="") #显示行号
print("=",end="") #显示等于号
print(j*i,end="") #显示列与行相乘的值
print(end="\t") # 后面加4个空格
print() #内循环结束之后,在后面加个换行
这个程序有2个for循环。第一个for循环是for i in range(1,10),共循环9次,i值从1到9,让计算机从第1行显示到第9行,共显示9行第一个for循环称为外循环。第二个循环是for j in range(1,i+1),让计算机从第1列显示到第i列;当i等于1时,只显示第1列,当i等于2时,显示2列,以此类推。end=""表示用空字符串来结束,即不要空格。在python中,“\t”是指制表符,作用是对齐表格数据的各列,代表着四个空格,也就是一个tab键,end=“\t”是以4个空格结束。
优化上面的程序,内循环用一个print语句就可以打印出“九九乘法表”。
for i in range(1,10):
for j in range(1,i+1):
print("{}×{}={}".format(j,i,j*i),end="\t") #用format()格式化
# print("%d×%d=%d"%(j,i,j*i),end="\t") #用%格式化
print()
-------------------------------------------------------------
输出结果:
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
row=1 #定义起始行
while row<=9: #最多打印9行
col=1 #定义起始列
while col<=row: # 最多打印row列
print("{}×{}={}".format(col,row,col*row),end="\t") # end=""表示输出结束后,不换行。"\t"在控制台输出一个制表符,协助输出文本时对齐。
col +=1 # 列数+1
print("") #一行打印完换行
row +=1 #行数+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
《孙子算经》的著名趣题-“鸡兔同笼问题”。
鸡兔同笼是中国古代重要的数学著作《孙子算经》中的著名趣题,书中是这样叙述的:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”《孙子算经》里的鸡兔同笼问题的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
1.问题分析
假设鸡的数量保存到变量chicken中,总头数为35,说明鸡和兔共有35只,鸡的数量是0到35之间的某⼀个数,可以⽤for循环遍历。兔⼦的数量保存到变量rabbit中,根据鸡和兔共有35只,得到兔的数量rabbit=35-chicken。鸡有两只脚,兔⼦有四只脚,因此脚的总数为:chicken2+rabbit4=94。最后输出鸡的数量和兔的数量。
2.编写步骤
(1)鸡的数量范围是0到35之间的一个数。
(2)兔的数量范围是0到35之间的一个数。
(3)判断鸡和兔的总数是否是35且鸡的脚数与兔的脚数总数是否为94。
(4)输出鸡的数量和兔的数量。
3.编写代码
for chicken in range(36):
for rabbit in range(36):
if rabbit +chicken=35 and 2 * chicken + 4 * rabbit == 94:
print("鸡有",chicken,"只")
print("兔有",rabbit,"只")
----------------------------------------------------------------------
输出结果:
鸡有 23 只
兔有 12 只
4.优化程序
减少一个内循环
for chicken in range(36):
rabbit = 35 - chicken
if 2*chicken + 4*rabbit == 94:
print("鸡有",chicken,"只")
print("兔有",rabbit,"只")
for i in range(5):
for j in range(i+1):
print("*",end="")
print()
---------------------------------------------
输出结果:
*
**
***
****
*****
总结:
1).外层循环执行一次,内层循环全部执行一遍
2).如果外层循环需要执行m次,内层循环需要执行n次,嵌套循环一共会执行m*n次
row=1 #定义行数
while row<=5:
#循环内部增加一个循环,实现每一行的星星打印
col=1
while col<=row:
print("*",end="")
col +=1
print() #每一行星星打印完,换行
row +=1
---------------------------------------
输出结果:
*
**
***
****
*****