Python学习笔记(02)
目录
第四章 流程控制
1.顺序结构
2.选择结构
3.循环结构
4.程序实例
第四章 流程控制
1.顺序结构
(1)程序设计的面向过程思想
变量初始化(名称、个数、初始值)
输入(input() )(内容,间隔符)
处理(算法)
输出(print())(内容,格式)(2)原则:自顶向下,逐步细化,由上到下逐条执行,清晰第一,效率第二
(3)例1:输入一个十进制数,输出二进制、八进制、十六进制
num = int(input('输入一个十进制数:'))
print('二进制为:',bin(num))
print('八进制为:',oct(num))
print('十六进制为:',hex(num))
结果:

例2:输入华氏温度,输出摄氏温度,公式为:C=5/9*(F-32)
F = int(input('输入华氏温度:'))
C=5/9*(F-32)
print('摄氏温度:%.2f'%C)
例3:键盘输入两个整数a和b,合并成一个新四位数,例如:a=54,b=12,c=5142
a = int(input('输入两位数的a:'))
b = int(input('输入两位数的b:'))
c = a//10*1000+b//10*100+a%10*10+b%10
print('c为:',c)
例4:发工资遇到一个问题,根据每个人工资总额计算钞票面值的张数,且总张数最少
15896
100:158
50:1
20:2
10:0
5:1
1:1
money = int(input('工资金额为:'))
print('100元的张数为:',money//100,'张')
print('50元的张数为:',money%100//50,'张')
print('20元的张数为;',money%100%50//20,'张')
print('10元的张数为:',money%100%50%20//10,'张')
print('5元的张数为:',money%100%50%20%10//5,'张')
print('1元的张数为:',money%100%50%20%10%5//1,'张')
例5:输入三角形边长,输出面积:
公式:![]()
其中s=(a+b+c)/2
import math
a = int(input())
b = int(input())
c = int(input())
s = (a+b+c)/2
area = math.sqrt(s*(s-a)*(s-b)*(s-c))
print('面积为:',area)
2.选择结构
(1)单分支结构
语法:
if 表达式:语句块
流程图

例:输入两个数,输出最大值
a = int(input())
b = int(input())
max = a
if a
注意:
1> 表达式:一般表达式、常量、变量、关系表达式、逻辑表达式
2> 优先级:!(非)>算数运算符>关系运算符>and和or>赋值运算符
3> 规则:逻辑表达式只检测是否为非0或非空字符串或非none就会执行对应分支
4> 分支语句的缩进
(2)双分支结构
语法:
if 表达式:语句块1
else:语句块2
流程图:

例:输入一个整数,判断奇偶数
c = int(input('请输入一个整数:'))
if c%2==1:print('奇数')
else:print('偶数')
c = int(input('请输入一个整数:'))
if c&1==1:print('奇数')
else:print('偶数')
判断一个数能被7或11整除,但不能同时被7或11整除
d = int(input('请输入一个整数')) # 优先级:and>or
if (d%7==0 or d%11==0) and d%77!=0:print('yes')
else:print('no')
例:判断闰年:可被4整除,不能被100整除,可被400整除
year = int(input('请输入四位数年份:'))
if year%4==0 and year%100!=0 or year%400==0:print('此年为闰年')
else:print('此年是平年')
(3)多分支结构
语法1:
if 表达式1:语句块1:
else:if 表达式2:语句块2:else:......
# 逻辑嵌套推荐不超过七层
语法2:
if 表达式1:语句块1:
elif 表达式2:语句块2:
elif 表达式3:语句块3:
...
else:语句块n
流程图:

a = int(input())
b = int(input())
c = int(input())
if a>b:if a>c:if b>c:print(a,b,c)else:print(a,c,b)else:print(c,a,b)
else:if a>c:print(b,a,c)elif b>c:print(b,c,a)else:print(c,b,a)
例:输入一个百分制成绩,输出等级
m = int(input('请输入一个百分制成绩(0-100):'))
if m>100 or m<0:print('输入有误,请输入0-100范围内的数字')
elif m>=90:print('优秀')
elif 90>m>=80:print('良好')
elif m>=60:print('及格')
else:print('补考')
注意:
1> if else elif之后的冒号不能省略:
2> elif和else不能单独使用
3> 通过缩进判断是否是同一语句块
3.循环结构
(1)while循环:
格式:
while 条件表达式:循环体语句
流程图

(2)for循环
格式:
for 迭代变量 in 对象:循环体
# 数值循环:
for 迭代变量 in range (start,end,step):循环体
range()函数
1> Python3中内置函数,用于生成一系列连续的整数
2> start:计数起始值,省略则为0
3> end:计数终止值,不包含(开区间)。如:range(9) 表示产生0-8的整数,end参数不可省略
4> step:步长,默认为1
PS:range()函数只有一个参数时,该参数表示end,两个参数时为start和end,三个参数时最后一个为step
例:
# while循环
sum = 0 # 累加和变量
i = 1
while i<=100:sum = sum+ii+=1
print('sum=',sum)# for循环
sum = 0
for i in range(101):sum+=i
print('sum=',sum)
注意
1> 循环表达值为非0时执行循环体
2> 循环区间尽量使用开区间
3> 循环嵌套时钟长循环应在内部,短循环在外部,以减少内外循环跨越次数

4> 循环嵌套应限制在3层以内,以提高理解性
4.程序实例
(1)累加和迭代
框架:
sum = 0
for i in range(终止值):sum = sum+新项
例:计算下列多项式的值:
![]()
sum = 0
for i in range(1,101):sum = sum + 1/i
print('sum = %.6f'%sum)
# sum = 5.187378
例:计算下列多项式的值:
![]()
sum = 1
num = 1
for i in range(2,101):num = num + isum = sum + 1/num
print('sum = %.6f'%sum)
# sum = 1.980198
例:计算下列多项式的和

# 备份旧分子
# 新分子 = 旧分子 + 旧分母
# 新分母 = 备份分子
a = 3
b = 2
sum = 0
for i in range(20):sum = sum + a/bt = aa = a + bb = t
print('sum=%.6f'%sum)
# sum=32.278295
例:计算π的近似值公式

pi = 1
f = -1
i = 3
while 1/i>1e-6:pi = pi +1/i*ff = -fi = i+2
print('pi=%.6f'%(pi*4))
# pi=3.141591
# 多项式迭代某一项运算结果大于1e-6时说明其值需要累加,误差较大时需要继续运算,小于等于1e-6时则结束循环迭代,表明当前项数值,误差可控可以结束循环
例:用泰勒级数计算e的近似值![]()
sum = 1
t = 1
i = 1
while 1/t>1e-6:t = t*isum = sum + 1/ti += 1
print('sum=%.6f'%sum)
# sum=2.718282
例:计算a+aa+aa+aaa…aaa的值,计算前六项和,a=2
a = 2
sum = 0
for i in range(6):sum = sum + aa = a*10 + 2
print('sum = ',sum)
# sum = 246912
(2)素数判断
break语句(结束循环):终止当前循环,执行循环外的下一条语句,一般与if搭配使用
例:计算r=1到r=10时的圆的面积,直到面积大于100为止
import math as a
for r in range(1,11):area = a.pi*r*rif area>100:break
print('r:',r,'area: is:%.6f'%area)
# r: 6 area: is:113.097336
continue语句(加速循环):跳出当前次循环,继续执行下一次循环,一般与if语句搭配使用,若执行到continue语句,该语句之下的所有循环体语句将不在执行,直接跳到下一次步长迭代处
例:将100-150之间的不能被3整除的数输出,一行输出10个数
i = 0
for n in range(100,151):if n%3 == 0:continueprint(n,end=' ')i+= 1if i%10 == 0:print()
# 100 101 103 104 106 107 109 110 112 113
# 115 116 118 119 121 122 124 125 127 128
# 130 131 133 134 136 137 139 140 142 143
# 145 146 148 149
for-else结构:for循环执行完或者未进入循环(即for循环不是通过break语句跳出而中断的)情况下执行else。
例:找出2,3,5的最小公倍数
for i in range(1, 100):if i % 2 == 0 and i % 3 == 0 and i % 5 == 0:print('%d是2,3,5的最小公倍数' % i)break
else:print('未找到!')
# 30是2,3,5的最小公倍数
执行过程:当for循环正常执行完毕则会执行else之后的语句,若执行break异常跳出,则不会执行else语句。
(若删除break,所有公倍数都会被打印,又满足循环正常结束,则else之后的‘未找到!’也正常打印出来)
素数:只能被1和自己整除的数为素数
例:输入整数,判断是否为素数:
法一:
p = int(input('请输入一个正整数:'))
if p<2: # 保证输入数据大于2print('请输入大于2的正整数!')
else: for i in range(2,p):if p%i == 0:print('平数')breakelse: # 循环顺利结束后执行print('素数')
判断的范围【2,n-1】
判断的方法【整除%】
法2:
p = int(input('请输入一个正整数:'))
i = 2
if p<2: # 保证输入数据大于2print('请输入大于2的正整数!')
else:while p%i !=0: # 检测结果是否为非0i = i+1if i == p:print('素数')else:print('平数')
法3:筛选法

(3)穷举法
在指定范围内寻找符合条件的数
框架:
for i in range(起始,终止,步长)if 条件表达式:处理
例:输出100以内的素数
for i in range(2,100): #遍历2-99for j in range(2,i):if i%j == 0:breakelse:print(i,end=' ') # 输出素数
例:输出200-400的非素数
for m in range(200, 400):for n in range(200, m):if m % n == 0:print(i, end=' ')break
例:输出大于s且紧随s的k个素数
s = int(input('请输入起始值:'))
k = int(input('请输入需要的素数个数:'))
i = s + 1
t = 0 # 计数器,记录找到的素数个数
while t < k: # 当自己找到的素数个数t小于指定个数k的时候,继续寻找for j in range(2, i): # 判断i是否为素数if i % j == 0:breakelse:t = t + 1 # 记录找到的素数个数print(i, end=' ') # 输出素数i = i + 1 # 继续下一个数的寻找
输入100以内被9整除,余数为2的数,计算其平均值的平方根并输出
a = 0
t = 0 # 计数器
for i in range(100):if i % 9 == 2: # 计算对9取余,余数为2print(i,end=' ')a = a + i # 计算和值t = t + 1 # 记录个数
print('\n a=%.2f'%((a/t)**0.5))
输出水仙花数,一个三位数,每位立方和等于原值
for i in range(100,1000):if (i%10)**3 + (i//10%10)**3 + (i//100)**3 ==i:print('水仙花数:',i)
例:输出1000以内的完数,完数:因子之和等于原值,如:6==1+2+3
for i in range(6,1000): #遍历0-999sum = 0 # 每判断一个i,必须先清零其因子之和for j in range(1,i): # 寻找因子if i%j == 0:sum = sum + j # 计算因子之和if sum==i:print(i,end=' ')
例:输出100以内的同构数,同构数:一个正整数出现在它的平方书的右侧则为同构数。
如:5==25 6==36 25==625
for i in range(100):# 100以内同构数平方后可能为2位数或者3位数if i==i*i%10 or i==i*i%100:print(i,end=' ')
例:输出200以内的回文数字
for i in range(200):t = 0 # 倒置后数m = iwhile m > 0: #对i进行整数倒置t = t*10 + i%10m=m//10if t == i:print(i,end=' ')
(4)数学问题
例:求整数a与b的最小公倍数
# 法1:
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
i = 1
while 1: # 循环恒真时执行下列语句if i % a == 0 and i % b == 0:print('最小公倍数:', i)break # 第一次找到公倍数就跳出,保证是最小公倍数i = i + 1
# 法2
a = int(input('请输入第一个整数:'))
b = int(input('请输入第二个整数:'))
i = 0
while 1: # 循环恒真时执行下列语句i += a # i默认是a的倍数,if i % b == 0:print('最小公倍数:', i)break # 第一次找到公倍数就跳出,保证是最小公倍数
例:求整数x和y的大公约数以及最小公倍数
x = int(input('请输入第一个整数:'))
y = int(input('请输入第二个整数:'))
l = x * y # l是最小公倍数
while x % y != 0: # 辗转相除法t = x % yx = yy = t
g = y # g是最大公约数
l = l // g
print('最大公约数:', g, '最小公倍数', l)
例:在键盘输入四位数整数,转换为英文单词输出。如:1024 one zero two four
a = int(input('请输入一个四位数整数:'))
t = 1000
if a >= 1000 and a < 10000:while t > 0:if a // t % 10 == 0:print('zero', end=' ')elif a // t % 10 == 1:print('one', end=' ')elif a // t % 10 == 2:print('two', end=' ')elif a // t % 10 == 3:print('three', end=' ')elif a // t % 10 == 4:print('four', end=' ')elif a // t % 10 == 5:print('five', end=' ')elif a // t % 10 == 6:print('six', end=' ')elif a // t % 10 == 7:print('seven', end=' ')elif a // t % 10 == 8:print('eight', end=' ')elif a // t % 10 == 9:print('nine', end=' ')t = t // 10
else:print('您输入的数据有误')
# 整数由左向右拆分
例:fibonacci数列,古典数学问题:一对兔子,出生后第三个月都生出一对兔子,小兔子到第三个月又生出一对兔子,兔子不死,问兔子的出生规律:1 1 2 3 5 8 13……
a1 = 1
a2 = 1
for i in range(6):print(a1,a2,end=' ')a1 = a1 + a2a2 = a1 + a2
# fibonacci:当前项等于前两项之和
例:计算fibonacci数列中大于t的最小值,如:t = 6,输出8
a1 = 0
a2 = 1
a3 = 1
t = int(input('请输入需要的t的大小:'))
while a3 <= t:a1 = a2a2 = a3a3 = a1 + a2
print('大于t的fibonacci最小值为:', a3)
有一张足够大的纸,厚度为0.09mm,对折多少次后超过8848m(珠穆朗玛峰高度)
t = 0
h = 0.09e-3 # 纸的厚度,单位统一为米
while 1:h = h * 2 # 对折,厚度乘2t = t + 1 # 记录对折次数if h>8848:break
print('对折了',t,'次')
例:爱因斯坦阶梯问题,多级阶梯,每步跨2阶余1阶、跨3阶余2阶、跨5阶余4阶、跨6阶余5阶、跨7阶正好到顶。一共多少阶?
i = 7
while 1:if i%2==1 and i%3==2 and i%5==4 and i%6==5 :breaki +=7
print('阶梯总数为:',i) #119
例:百钱买百鸡问题。鸡翁值钱5,鸡母值钱3,鸡雏3值1钱,百钱买白鸡,鸡翁,鸡母,鸡雏各几何?
for c in range(101):for h in range(101):for ch in range(101):if c + h + ch ==100 and c*5 + h*3 + ch//3 == 100 and ch%3 ==0:print('公鸡=',c,'只','母鸡=',h,'只','小鸡=',ch,'只')
例:搬砖问题:36个人36块砖,男4女3,小孩2人1块,一次性搬完,需要各多少人?
for m in range(10):for w in range(14):for c in range(37):if m+w+c==36 and m*4 + w*3 + c//2 == 36 and c%2 == 0:print('男=',m,'人','女=',w,'人','小孩=',c,'人')
例:猴子偷桃:一天吃一半还多吃一个,第七天吃完,偷桃总数?
n = 0
for i in range(7):n = (n + 1) * 2
print('桃子总数:', n)
(5)打印图形
如下:
h = int(input('请输入图形高度:'))
for i in range(h):for j in range(0, h - i - 1):print(' ', end='')for k in range(0, 2 * i + 1):print('*', end='')print()
打印以下图形:
h = int(input('请输入图形高度:'))
for i in range(h):for j in range(i):print(' ', end='')for k in range( 2 *(h-i)-1 ,0, -1):print('*', end='')print()
例:打印以下图形
h = int(input('请输入图形高度:'))
for i in range(h):for j in range(h-i):print(' ',end='')for k in range(i+1):print('*',end='')print()
5.项目:打印指定月份的日历
(1)软件瀑布模型:自顶向下,重复分析
问题的定义:需要解决的问题是什么?
可行性分析:该软件是否可以实现,成本分析、技术分析
需求分析:需求功能的分解(重要)---软件架构师
概要设计:模块功能设计、模块规模设计、参数传递、数据库设计等
详细设计:数据结构,算法
实现:编写代码,实现功能
测试:单元测试、集成测试、功能测试、回溯测试
运行维护:上线运行、版本迭代
(2)日历软件的制作:
问题定义:用户输入年、月、日,屏幕打印日历,参照windows日历
可行性分析:yes
需求分析:
输入:年、月、日
处理:
input()接收输入结果
判断闰年、判断大月、小月
大月:31天 小月:30天 二月:28 29(闰年)
判断输入月份在1-12之间判断每月第一天是星期几:蔡勒公式
1> 蔡勒公式:判断1582年10月4日以后的任意日期是星期几 #计算每月第一天是星期几
2> w=(y%100)+(y%100//4)+(y//100//4)-(2*(y//100))+26*(m+1)+1-1
3> w是星期几的数字代号,星期一:1 星期二:2 。。。。。。。星期日:0
4> w可能为负数,需要处理为整数
5> 蔡勒公式中若为1月或2月表示为上一年的13月和14月,需要进行处理
输出一\t二\t三\t四\t五\t六\t日根据计算的w将本月的第一天与对应的星期几对齐
输出每月的数字,间隔符是\t,逢7换行输出
概要设计:略
详细设计:略
实现:
测试:黑盒---4组
(3)代码实现:
# y:年 m:月 d:日 w:周几 其他未控制
# 2022-10-19 1.0版本
y = int(input('请输入年份:'))
m = int(input('请输入月份:'))
t = 0 # t用于表示平年和闰年的标志位
if y % 4 == 0 and y % 100 != 0 or y % 400:t = 1
if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12:d = 31 # 计算大月天数
elif m == 2 and t == 0:d = 28 # 计算平年2月天数
elif m == 2 and t == 1:d = 29 # 计算闰年2月的天数
elif m == 4 or m == 6 or m == 9 or m == 11:d = 30 # 计算小月天数
else: # 保证输入月份在1-12月print('输入有误,请重新输入')
if m >= 1 and m <= 12:print('\n======', y, '年', m, '月', '======\n')if m == 1:m = 13y = y - 1 # 若为1月则蔡勒公式中为上一年13月elif m == 2:m = 14y = y - 1 # 若为1月则蔡勒公式中为上一年13月# 蔡勒公式w = (y % 100) + (y % 100 // 4) + (y // 100 // 4) - (2 * (y // 100)) + 26 * (m + 1) + 1 - 1w = (w % 7 + 7) % 7 # 保证w为正数if w == 0: # 蔡勒公式中星期日数值为0,改为7w = 7print('一\t二\t三\t四\t五\t六\t日')i = 1while i < w: # 将本月第一天与星期几对齐print('\t', end='')i += 1i = 1while i <= d: # 循环输出本月的天数print('%2d' % i, '\t', end='')w = w % 7 # 逢7换行if w % 7 == 0:print()w = w + 1i = i + 1print('\n=========================\n')import calendar as c
y=int(input('请输入四位数年份数字:'))
m=int(input('请输入月份数字:'))
cal = c.month(y,m)
print(cal)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
