第二篇 流程控制
一. if 条件语句
基础语法1:
if C1: pass1 else: pass2 当条件C1满足时,执行pass1部分; 当条件不满足C1时,执行pass2部分
基础语法2:
if C1: pass1 # elif是分支语句,是不限制数量的,可以有多个 elif C2: pass3 else: pass2
练习:随机生成一个数字,你猜这个数字是多少
生成随机数字,要用到random模块,需要先import random 进行导入
random.randint(0,100):在0,100区间内生成随机整数
import random score = random.randint(0,10) data = int(input("请输入一个0~10的数字,我跟你比大小\n")) if score == data: print("恭喜,你猜中了") elif score > data: print("哈哈,你猜的数小了,我的数字是{},你猜的数字是{}".format(score,data)) else: print("你猜的数大了些哦,我的数字是{},你猜的数字是{}".format(score,data))
bool()函数:判断值是True 还是 False
可以认为所有空的,其值都是false # 空的值都是faise:0,None,"",(),{},[],False, print(bool(0)) print(bool("")) print(bool({})) print(bool(())) print(bool([])) print(bool(None)) print(bool(False)) #非空的其值是TRUE print(bool(" ")) # 空格 print(bool("0.0")) #输出 False False False False False False False True True
boo()函数的作用:
1. 判断值是true 还是 false
2. 当条件语句没有按照你预期执行时,可以在前面加个bool()函数,打印出来看表达式的值是否满足
import random score = random.randint(0,10) data = int(input("请输入一个0~10的数字,我跟你比大小\n")) print(bool(score == data)) print(bool(score > data)) if score == data: print("恭喜,你猜中了") elif score > data: print("哈哈,你猜的数小了,我的数字是{},你猜的数字是{}".format(score,data)) else: print("你猜的数大了些哦,我的数字是{},你猜的数字是{}".format(score,data))
# 练习 ''' 学习成绩>=90分的同学用A表示,60~89分用B表示,60分以下用C表示 ''' score = float(input("请输入你的分数:")) if score >89: print("A") elif 60<=score<=89: print("B") else: print("C") ''' 个人所得税 ''' salary = float(input("请输入你的工资:")) taxPay = salary - 3500 if taxPay <= 1500: print("应纳税额为{}".format(taxPay*0.03 - 0)) elif 1500<taxPay<=4500: print("应纳税额为{}".format(taxPay*0.1 - 105)) elif 4500<taxPay<=9000: print("应纳税额为{}".format(taxPay*0.2 - 555)) elif 9000<taxPay<=35000: print("应纳税额为{}".format(taxPay*0.25 - 1005)) elif 35000<taxPay<=55000: print("应纳税额为{}".format(taxPay*0.3 - 2755)) elif 55000<taxPay<=80000: print("应纳税额为{}".format(taxPay*0.35 - 5505)) elif 80000<taxPay: print("应纳税额为{}".format(taxPay*0.45 - 13505))
二. 循环语句
关键词:while...else... ; for...esle...; break; continue;
1. while循环
基础语法1
while contition: statement1
基础语法2:while循环里加了一个else,这个是与其他语言不同的
while contition: statement1 else: statement2
while循环退出的条件:
1. while后面的条件表达式为false,就退出
2. 循环语句块里面有break,当break条件满足时退出
while contition: statement1 break
# 输入一个随机数,猜数字,猜中了就停止,没猜中就一直猜
# 方式1
while True: score = random.randint(0, 10) data = int(input("请输入一个0~10的数字,我跟你比大小\n")) if score == data: print("恭喜,你猜中了") break elif score > data: print("哈哈,你猜的数小了,我的数字是{},你猜的数字是{}".format(score,data)) else: print("你猜的数大了些哦,我的数字是{},你猜的数字是{}".format(score,data))
# 方式2 import random while True: score = random.randint(0, 10) data = int(input("请输入一个0~10的数字,我跟你比大小\n")) if score == data: print("恭喜,你猜中了") break else: print("我的数字是{},你猜的数字是{}".format(score,data))
while ... else...语句练习
1. 始终执行else语句,循环没有break
count = 0 while count < 10: count +=1 # count = count +
print(count)
else:
print("这里是else语句:{}".format(count)) # 输出 1 2 3 4 5 6 7 8 9 10 这里是else语句:10
# print语句的位置不同,所得到的结果也不同,注意体会 count = 0 while count < 10: print(count) count +=1 # count = count + 1 else: print("这里是else语句:{}".format(count)) # 输出 0 1 2 3 4 5 6 7 8 9 这里是else语句:10
2. 不执行else语句,循环被break中断后,不再执行else
上面两个例子都执行了else语句,那什么时候不会走到else语句里呢?
# 什么时候不会走到else语句里面呢? count = 0 while count < 10: print(count) count +=1 # count = count + 1 if count > 6: break else: print("这里是else语句:{}".format(count)) #输出 0 1 2 3 4 5 6
2. for 循环
for循环与while循环的区别:
1. while循环只要条件满足一直可以循环下去
2. for循环,采用的是遍历机制,有多个少条件满足就循环多少次
基础语法1:
for data in iterator: statement1
基础语法2:
for data in iterator: statement1 else: statement2
基础语法3:
for data in iterator: statement1 break # for循环里有break,条件满足是就不执行else部分了 else: statement2
range()函数:
print(list(range(3))) # 第一个参数没有指定,默认是0开始 print(list(range(1,10))) # 最后一个10不计算在内 print(list(range(1,10,2))) # 2 表示步长,即每隔2位取一个数 # 输出 [0, 1, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9]
练习:把上面的while循环改成for循环
1. 执行else语句
count = 0 for count in range(5): print(count) count +=1 # count = count + 1 else: print("这里是else语句:{}".format(count)) # 输出 0 1 2 3 4 这里是else语句:5
2. for循环中条件满足break语句后,不执行else语句
count = 0 for count in range(5): print(count) count +=1 # count = count + 1 if count > 4: break else: print("这里是else语句:{}".format(count)) #输出 0 1 2 3 4
3. Continue
当continue被执行后,直接就会进入下一次循环,之后的逻辑就不会被再次执行了
for i in range(10): if i % 2 == 0: continue print(i) # 解释 ''' 当i=0时,0 除以2的余数是0,满足if语句,if语句中的逻辑是continue,所以直接进行下一次循环,而不执行print语句 当i=1时,1 除以2的余数是1,不满足if语句,if语句中的逻辑不被执行,执行print语句,打印1 当i=2时,2 除以2的余数是0,满足if语句,if语句中的逻辑是continue,所以直接进行下一次循环,而不执行print语句
... ''' # 输出 1 3 5 7 9
循环练习
1. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?分别是多少?
count = 0 for baiwei in range(1,5): for shiwei in range(1,5): for gewei in range(1,5): if baiwei == shiwei or baiwei == gewei or shiwei == gewei: continue count +=1 print("{0}{1}{2}".format(baiwei,shiwei,gewei)) print("不重复的数字一共有{}个".format(count))
2. 有一分数序列:2/1 、3/2 、5/3、8/5、13/8、21/13....求出这个数列的前20项之和
方面1:通过中间变量的方式
fenzi,fenmu = 2,1 result = 0 for i in range(1,21): result += fenzi/fenmu # 这里需要用到一个临时变量,把前一个分式的分子临时存下来 temp = fenzi fenzi = fenzi+fenmu # 如果上面不用临时变量存,这里就会改变分子的值了,那么下一个数据的分母就不是上一个数的分子了 fenmu = temp print(result)
方法2:不用中间变量的方式
result,fenzi,fenmu = 0, 2, 1 for i in range(20): result += fenzi/fenmu # 把他们写在一行,这里就是同时赋值了 fenzi,fenmu = fenzi+fenmu,fenzi print(result)
3. 输入字符串,判断是否为回文
方法一:for...else...
''' 解法思路: 1. 先求出字符串的长度:len() 2. 取字符串的第一个字母和最后一个字母一次比对 3. 如果所有字符串都相同,就一直比对,循环比对完了,没有执行到if语句块里去,就是回文,否则就不是回文 4. 字符串从前往后取,是从索引0开始的;而从后往前取,是从索引-1开始的 ''' data = input("请在下方输入一个英文字符串:\n") for i in range(len(data)): if data[i] != data[-(i+1)]: # 难点在这里,怎么样从后往前取字符串的字母 print("这个不是回文") break else: print("这个是回文")
方法二:切片的反转方法
切片基础知识
data = "abcdefghigk" print(data[0:5]) # abcde 顺序取到第5个 print(data[0:5:2]) # ace 隔两个取一次 print(data[:5:2]) # ace 开头不写,默认是从索引0开始,隔两个取一次 print(data[::2]) # acegik 开头和结尾都不写,默认是从索引0开始,取到最后一个,隔两个取一次 print(data[::-1]) # kgihgfedcba 开头和结尾都不写,默认是从索引-1开始往前取,相当于就是把字符串翻转了 print(data[5:0:-1]) # fedcb 从第五个开始,取到0截止,-1 代表的是往反方向取
data = input("请在下方输入一个英文字符串:\n") if data == data[::-1]: print("是回文") else: print("不是回文")
练习:写程序破解下面的密码
明文 | 密文 |
abc | bcd |
wxy | xyz |
请问这里明文是什么? | cfmjfwf!zpvstfmg" |
需要知识点:
ord()函数:查看字符的十进制值
chr()函数:查看数字对应的字符
# ord是查看字符的十进制值 print(ord('A')) # chr是查看数字对应的字符 print(chr(97)) # 65 # a
''' 解题:根据给出的两个明文和密文,密文是在明文的基础上+1个字符得到的 推断: 1. 先遍历取到密文的所有单个字符,用ord()函数查找到对应的十进制数字 2. 对该十进制数字-1,用chr()函数查找到该十进制数字对应的字符 3. 让后把这些字符拼接起来 ''' 方法1:join()方法 miwen = 'cfmjfwf!zpvstfmg"' li=[] for x in miwen: y = chr(ord(x)-1) li.append(y) print("".join(li)) 方法2:字符串拼接 miwen = 'cfmjfwf!zpvstfmg"' y='' for x in miwen: y += chr(ord(x)-1) print(y)
miwen = 'cfmjfwf!zpvstfmg"' for x in miwen: print(chr(ord(x)-1), end="") # 利用print()函数,end参数实现拼接
三. 异常(Exception)
不符合程序预期或者程序处理不了,需要进行异常处理。
基础语法1
try: 可能存在异常的程序 except Exception: statement2 else: statement3 finally: statement4 raise Exception
基础语法2
try: 可能存在异常的程序 except Exception as error: statement2 finally: 有没有异常都会执行的语句 比如关闭文件数据库等,担心有异常而不能执行时,都可以在这里操作 raise Exception
基础语法3: 异常的嵌套
当在except处理时,可能也存在异常,所以需要用到异常嵌套
try: print(1) 1/0 print(2) except ZeroDivisionError as error: try: print(a) except NameError: print("嵌套处理异常") except Exception as error: print(type(error)) finally: print("这里肯定会执行!")
自定义异常,raise
# raise异常,是需要提前自定义好的 class MyException(Exception): pass raise MyException
try: 1/0 except Exception as error: # 想知道这个异常对象是什么,可以用 as error print(error) print(type(error)) # 输出 division by zero <class 'ZeroDivisionError'>
练习:九九乘法表
for i in range(1,10): for j in range(1,i+1): print("{}*{}={}\t".format(j, i, i * j),end='') print("") # 这个打印的目的是换行,从下一行开始新的循环 # 输出 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