分支语句
- 语法:
if 布尔表达式1: # if语句基本结构,描述了程序在布尔表达式结构为True的情况下程序需要执行的动作
语句1
......
elif 布尔表达式2: #可选的,指定程序在若干不同的条件下需要执行的动作
语句1 # 如果布尔表达式1结构为False,则判断表达式2的结果是否为True,以此类推
......
......
else: # 可选的,前面的所有布尔表达式都为False,则执行else中的动作
语句1
......
例1:输入1个字符,判断这个字符的类型(数字、大写字母、小写字母、符号)。提示:使用ord(obj)函数获取字符的ASCII值,根据ASCII值符判断其类型
str = input('请输入1个字符:')
# 检查输入,如果输入的不是1个字符则结束程序,是则计算出这个字符的ASCII值
if len(str) == 1:
asc = ord(str) # 获取字符的ASCII值
if 48 <= asc <= 57 :
result = '数字'
elif 65 <= asc <= 90:
result = '大写字母'
elif 97 <= asc <= 122:
result = '小写字母'
else:
result = '符号'
print(f'{str}为:{result}')
else:
print('输入错误')
例2:使用一个字典保存学生信息(学号作为键,值是一个列表,列表中包含学生的姓名、性别、手机号)。接收外部输入的学生的信息(学号),如果学生存在,则打印出学生的信息;如果不存在,继续输入学生的姓名、性别、手机号,将该学生添加到字典中,打印出学生信息
students = {'1001':['杨雨','女','17712345678'],
'1002':['杨宇','男','17312345678'],
'1003':['张宇','女','13512345678'],
'1004':['赵宇','男','18612345678'],}
stno = input('学号:')
# 通过成员运算符判断键是否存在
if stno in students:
student_info = students[stno]
print(f'学号:{stno}\t姓名:{student_info[0]}\t性别:{student_info[1]}\t手机号:{student_info[-1]}')
else:
print(f'{stno}不存在,请继续录入学生信息')
name = input('姓名:')
gender = input('性别:')
phno = input('手机号:')
students[stno] = [name,gender,phno] # 将新录入的学生信息保存在字典中
print(f'学号:{stno}\t姓名:{name}\t性别:{gender}\t手机号:{phno}')
# 方法2:通过get方法的返回值判断键是否存在
# student_info = students.get(stno) # 获取指定键的值,赋值给变量,None/['张宇','女','13512345678']
# if bool(student_info) == True:
# print(f'学号:{stno}\t姓名:{student_info[0]}\t性别:{student_info[1]}\t手机号:{student_info[-1]}')
# else:
# print(f'{stno}不存在,请继续录入学生信息')
# name = input('姓名:')
# gender = input('性别:')
# phno = input('手机号:')
# students[stno] = [name,gender,phno] # 将新录入的学生信息保存在字典中
# print(f'学号:{stno}\t姓名:{name}\t性别:{gender}\t手机号:{phno}')
例3:声明一个字典保存用户信息(账号作为键,值是一个列表,列表中包含用户姓名,密码,账户余额)。接收外部输入的账号和密码,完成登录操作。如果账号错误,提示账号错误,请重新输入
。账号正确则输入密码,如果密码错误,提示密码错误,请重新输入
;密码正确则登录成功,打印出账户余额信息尊敬的 张*
*林 先生/女士,您的账户余额为 xxx.xx 元
,程序结束(姓名的第二个字替换为,账户余额保留2位小数)
accounts = {'1001':['杨雨','123456',1000],
'1002':['杨宇','111111',2000],
'1003':['张宇','123123',3000.98],
'1004':['赵宇','123123',5001.24],}
# 输入账号
account = input('账号:')
# 检查账号是否存在
if account in accounts:
passwd = input('密码:')
# 检查密码是否正确
if passwd == accounts[account][1]:
name = accounts[account][0] # 姓名
balance = accounts[account][-1] # 余额
print(f'尊敬的 {name.replace(name[1],"*",1)} 先生/女士,您的账户余额为 {balance:.2f} 元')
else:
print('密码错误,请重新输入')
else:
print('账号不存在,请重新输入')
循环语句
-
while循环
-
语法:
while 布尔表达式: # 在布尔表达式结果为True的情况下循环一直执行,直到其结果为False
语句1
语句2
......
例1:输出1-10这10个数字
n = 0 # 循环控制变量
while n < 10: # 循环继续的条件
n += 1 # 步长
print(n) # 循环体
例2:输出1+2+…+99+100的和
n = 0 # 循环控制变量
s = ''
ss = 0 # 保存和
while n < 100: # 循环继续的条件
n += 1 # 步长
ss += n # 每循环一次将n的值累加到ss上
s = f'{s}+{str(n)}'
print(f'第{n:2}次循环:和为-{ss},表达式-s = {s[1:]}') # 循环体
例3:输入1个10-20之间的整数n,计算出1+2+…+n的和。如果n不在[10,20]范围内提示错误
n = 0 # 循环控制变量
s = 0 # 保存和
m = input('请输入10-20之间的整数:')
if m.isdecimal(): # 检查输入的内容是否为纯数字
m = int(m)
if 10 <= m <= 20: # 检查输入数字的范围是否在10-20之间
while n < m: # 求和
n += 1
s += n
print(f'1-{m}的和为:{s}')
else:
print('请输入10-20之间的数字')
else:
print('请输入数字')
方法2:
n = 0 # 循环控制变量
s = 0 # 保存和
m = input('请输入10-20之间的整数:')
if m.isdecimal() and 10 <= (m:=int(m)) <= 20: # 检查输入的内容是否为纯数字
while n < m: # 求和
n += 1
s += n
print(f'1-{m}的和为:{s}')
else:
print('请输入10-20之间的数字')
- 针对循环次数未知的情况,可以通过循环控制变量值的变化来控制循环继续还是结束,比如声明一个变量
a=1
,循环的条件可以写成a==1
,在循环需要结束的地方给变量重新赋值(1以外的任何值)即可
例4:声明一个字典保存用户信息(账号作为键,值是一个列表,列表中包含用户姓名,密码,账户余额)。接收外部输入的账号和密码,完成登录操作。如果账号错误,提示账号错误,请重新输入
。账号正确则提示账号正确
。
accounts = {'1001':['杨雨','123456',1000],
'1002':['杨宇','111111',2000],
'1003':['张宇','123123',3000.98],
'1004':['赵宇','123123',5001.24],}
flag = True # 循环控制变量
while flag:
acc = input('账号:')
if acc in accounts:
print('账号正确')
flag = False # 为变量重新赋值为False,循环结束
else:
print('账号错误,请重新输入')
for循环
- 语法:
for i in iterable:
语句1
语句2
......
for i in range(a,b):
语句1
语句2
......
i
,变量,在循环内部可以直接使用该变量iterable
,可迭代对象,将其内部每一个元素分别赋值给变量i,直到元素取完为止range(a,b)
,生成一个[a,b)范围内的数字序列
例1:输出1-10这10个数字
for i in range(1,11):
print(i)
例2:将字符串qwe$%123&*
中特殊符号去除
s = 'qwe$%123&*'
for i in s:
if i.isalnum() == False:
s = s.replace(i,'')
print(s)
例3:输出九九乘法表
for i in range(1,10): # 控制行
for j in range(1,i+1): # 控制列
print(f'{j}*{i} = {i*j:2}',end='\t')
print('')
控制结构语句
统计字符:从键盘输入一个字符串,统计这个字符串当中包含几个大写字母,几个小写字母,几个数字
s = input('请输入一个字符串:')
u,l,n = 0,0,0 # 分别保存大写字母、小写字母、数字的数量
for i in s: # 遍历字符串s中的每一个字符,判断其类型
if i.isdecimal(): # 检查是否为数字
n += 1
elif i.isupper(): # 检查是否为大写字母
u += 1
elif i.islower(): # 检查是否为小写字母
l += 1
print(f'大写字母:{u}\t小写字母:{l}\t数字:{n}')
其他
- continue,结束当前这一次循环,开始下一次新的循环
- break,终止循环
- else,如果循环没有遇到break语句而终止,则会执行else中的语句
while 布尔表达式:
......
else:
......
for i in iterable:
...
else:
...
s = 'abcdemfg'
for i in s:
if i == 'm':
print('m包含在字符串s中')
break
else:
print('m不包含在字符串s中')
练习题
鸡兔同笼不知数,有头32,脚86,问鸡兔各几何?
# 方法1:双层for循环
for j in range(1,32): # 控制鸡的数量
for t in range(1,32): # 控制兔的数量
if t+j == 32 and j*2+t*4 == 86:
print(f'鸡:{j}\t兔:{t}')
break
# 方法2:单层for循环
for j in range(1,32): # 控制鸡的数量
t = 32-j # 兔的数量
if j*2+t*4 == 86:
print(f'鸡:{j}\t兔:{t}')
break
# 方法3:二元一次方程
head,foot = 32,86
t = foot/2-head # 兔的数量
j = 32-t # 鸡的数量
print(f'鸡:{j}\t兔:{t}')
有红、白、黑三种颜色的球,其中红球与白球共有28个,黑球与红球共有30个,白球与黑球共有36个,计算三种颜色的球分别有多少个?
输入的一个整数,按相反顺序输出该数。例如,输入为3578,则输出8753
while True:
no = input('请输入一个整数:')
if no.isdecimal():
print(no[::-1]) # 方法1,切片
# 方法2:将字符串转换为列表,将类别元素反向,将列表元素拼接成一个字符串
tmp = list(no)
tmp.reverse()
print(''.join(tmp))
break
else:
print('输入错误,请重新输入')
一个10000以内整数,它加上100和加上268后都是一个完全平方数(比如9,16等),请问该数是多少?
# 方法1:整数n开方后取整,判断整数部分的平方是否等于n
for i in range(10000):
n = int((i+100)**0.5)
m = int((i+268)**0.5)
if n**2 == i+100 and m**2 == i+268:
print(i)
# 方法2:整数n开方后对1求余,判断余数是否为0
for i in range(10000):
if (i+100)**0.5%1 == 0 and (i+268)**0.5%1 == 0:
print(i)
计算200以内的所有质数(即只有1和其自身能够被这个数整除的数,比如3,5,7,13等)
for i in range(2,200):
for j in range(2,i):
if i%j == 0:
break
else:
print(i)
for i in range(2,200):
flag = 1
for j in range(2,i):
if i%j == 0:
flag = 0
break
if flag == 1:
print(i)
输入一个1-10之间的整数,计算这个数的阶乘(5! = 5X4X3X2X1)
n = input('请输入1个1-10的整数:')
if n.isdecimal() and 1 <= (n:=int(n)) <= 10: # 检查输入的内容是否合法
j = 1 # 保存阶乘
for i in range(1,n+1):
j *= i
print(f'{n}的阶乘为:{j}')
else:
print('输入错误,请输入1个1-10的整数')
输入3个1-10之间的整数,分别表示三角形的三条边。判断这3条边能否构成三角形,如果能输出三角形的类型(普通三角形、等腰三角形、等边三角形、直角三角形,并且计算出三角形的面积(海伦公式)
n = input('请输入1个1-10的整数:')
p = input('请输入1个1-10的整数:')
q = input('请输入1个1-10的整数:')
# 检查输入的内容是否合法
if (n+p+q).isdecimal() and 1 <= (n:=int(n)) <= 10 and 1 <= (p:=int(p)) <= 10 and 1 <= (q:=int(q)) <= 10:
# 检查输入的3个整数是否能组成三角形
if n+p > q and n+q > p and p+q > n:
# 判断三角形类型
if n == p and p == q:
result = '等边三角形'
elif n == p or p == q or n==q:
result = '等腰三角形'
else:
result = '普通三角形'
l = (n+p+q)/2 # 半周长
s = (l*(l-n)*(l-q)*(l-p))**0.5 # 面积
print(f'{n}、{p}、{q}构成{result},面积为:{s:.2f}')
else:
print(f'{n}、{p}、{q}不能构成三角形')
else:
print('输入错误,请输入1个1-10的整数')
使用字典保存用户信息userinfo = {‘1001’:[‘杨洋’,‘123456’,1000.00], ‘1002’:[‘张琳琳’,‘123123’,9865.98], ‘1003’:[‘杨一二’,‘000000’,100.00]},完成注册功能。输入账号、姓名、密码(必须为6位,只能包含数字)、余额
如果账号存在,提示'账号已存在,请重新输入'
如果密码不符合要求,提示'密码不符合要求,请重新输入'
注册成功后,提示'注册成功',将用户信息添加到字典中
userinfo = {'1001':['杨洋','123456',1000.00],
'1002':['张琳琳','123123',9865.98],
'1003':['杨一二','000000',100.00]}
while True:
acc = input('账号:')
name = input('姓名:')
pwd = input('密码:')
bal = input('余额:')
if acc in userinfo: # 检查账号是否存在
print('账号已存在,请重新输入')
continue
if len(pwd) != 6 or pwd.isdecimal() == False: # 检查密码是否为6位纯数字
print('密码不符号要求,请重新输入')
continue
if bal.replace('.','',1).isdecimal() == False: # 检查余额是否合法
print('余额输入错误,请重新输入')
continue
# 将信息保存到字典中
userinfo[acc] = [name,pwd,float(bal)]
print(userinfo)
break
输入三个整数分别表示年、月、日,统计出这个日期为当年的第多少天
while True:
y = input('年:')
m = input('月:')
d = input('日:')
month_day = [31,28,31,30,31,30,31,31,30,31,30,31] # 保存每个月的天数
if (y + m + d).isdecimal() and (y := int(y)) and 1 <= (m := int(m)) <= 12 and 1 <= (d := int(d)) <= 31:
if m in (4, 6, 9, 11) and d == 31: # 检查小月天数是否合法
print('小月天数不能超过30')
continue
if y%4 == 0 and y%100 != 0 or y%400 == 0: # 判断年份是否为闰年
if m == 2 and d > 29: # 检查闰年2月天数
print('闰年2月天数不能超过29')
continue
month_day[1] = 29 # 将列表中第二个月的天数变为29
else:
if m == 2 and d > 28: # 检查平年2月天数
print('平年2月天数不能超过28')
continue
total = sum(month_day[:m-1])+d # 计算总天数
print(f'{y}年{m}月{d}日为{y}年的第{total}天')
break
else:
print('输入错误,请输入正确的年、月、日')