Python基础-逻辑
一、代码块
代码块:
以冒号作为开始,用缩进来划分相同的作用域,这个整体是一个代码块
作用域:作用的区域
if 10 == 10:
print(1) # 1 注意缩进 tab 4个空格
if 10 != 10:
print(1) # 不打印
if 10 == 11:
print(1)
print(2)
print(3)
print(4)
缩进:要么全都使用\t tab 要么全都是使用4个空格 来表达相同的作用域,不能混再一起;
"""
if 10 == 10:
print(1)
print(2)
"""
# 其他语言的写法 (了解)
"""
if(10 == 10){
print(1)
print(2)
print(3)
}
"""
二、流程控制 if判断
流程控制
流程: 代码执行的过程
控制: 对代码执行过程中的把控
三大结构:
(1)顺序结构: 默认代码从上到下,依次执行
(2)分支结构: 单项分支 双向分支 多项分支 巢状分支
(3)循环结构: while / for
1、单项分支 if单分支
# 单项分支
"""
if 条件表达式:
code1
code2
当条件表达式成立,返回True,执行对应的代码块
"""
city = "北京"
if city == "北京": # 如果if条件成立,执行下方代码块
print("故宫","天安门")
print("颐和园")
print("长城")
故宫 天安门
颐和园
长城
2、双项分支 if双分支
双向分支 (二选一)
"""
if 条件表达式:
code1 ..
else:
code2 ...
如果条件表达式成立,返回True ,执行if这个区间的代码块
如果条件表达式不成立,返回False,执行else这个区间的代码块
if 分支的代码块也叫做真区间
else 分支的代码块也叫做假区间
"""
city = "北京"
if city == "山东":
print("故宫","天安门")
print("颐和园")
print("长城")
else:
print("青岛啤酒")
青岛啤酒
input 等待用户输入字符串 (注意:结果一定是字符串)
"""
name = input("请输入您的名字")
print(name , type(name))
"""
# 模拟网站登录
# 如果admin = root 密码:password = 123.com 显示登录成功,否则显示登录失败
# admin = "root"
# password = "123.com"
admin = input("请输入您的用户名")
password = input("请输入您的密码")
if admin == "root" and password == "123.com":
print("登陆成功")
else:
print("用户或密码输入错误,请重试")
3、多项分支 if多分支
多项分支 (多选一)
"""
if 条件表达式1:
code1
elif 条件表达式2:
code2
elif 条件表达式3:
code3
else:
code4
如果条件表达式1成立,执行对应的分支code1,反之判断条件表达式2是否成立
如果条件表达式2成立,执行对应的分支code2,反之判断条件表达式3是否成立
如果条件表达式3成立,执行对应的分支code3,如果不成立,直接走else分支,到此程序执行完毕
elif 可以是0个 或者 多个
else 可以是0个 或者 一个
"""
ad = False
bc = True
bm = False
if ad == "True":
print("尊贵的奥迪车主")
elif bc == "True":
print("尊贵的梅赛德斯奔驰车主")
elif bm == "True":
print("尊贵的宝马车主")
else:
print("加油吧,少年")
4、巢状分支 嵌套组合
巢状分支
"""单项分支,双向分支,多项分支的互相嵌套组合"""
ad = True
bc = True
bm = True
if ad == True:
if bc == True:
if bm == True:
print("尊贵的奥迪、宝马和梅赛德斯奔驰车主")
else:
print("还差一台宝马")
else:
print("尊贵的奥迪和梅赛德斯奔驰车主")
else:
print("加油吧少年")
出题 height
#女生找对象
# 男生在1米~1.5米之间 小强 你在哪里?
# 男生在1.5~1.7米之间 没有安全感~
# 男生 1.7~ 1.8米之间 帅哥 留个电话
# 男生 1.8~2米之间 帅哥 你建议多一个女朋友吗
python特有
height = float(input("请输入你的身高:")) # 需要转换为number类型,要不然是字符串,无法比较
if 100 <= height <= 150:
print("小强 你在哪里?")
elif 150 < height <= 170:
print("没有安全感~")
elif 170 < height <= 180:
print("帅哥 留个电话")
elif 180 < height <= 200:
print("帅哥 建议多个女朋友吗")
else:
print("不太合适哈")
通用写法
height = float(input("请输入您的身高:"))
if 100 <= height and height < 150:
print("小强 你在哪里?")
elif 150 <= height and height < 170:
print("没有安全感~")
elif 170 <= height and height < 180:
print("帅哥 留个电话")
elif 180 <= height and height < 200:
print("你建议多一个女朋友吗")
else:
print("抱歉,没有合适的选项")
"""
tab 向右缩进
shift + tab 向左缩进
"""
三、循环
一、while循环语法
循环结构
"""特点:减少冗余代码,提升执行效率"""
语法:
while 条件表达式:
code1
(1) 初始化一个变量
(2) 写上循环的条件
(3) 自增自减的值
打印1 ~ 100
# (1) 初始化一个变量
i = 1
# (2) 写上循环的条件
while i <= 100:
# (4) 写上循环的逻辑
print(i)
# (3) 自增自减的值
i += 1 # i = i + 1
# 打印1-100
i = 1 # 定义初始值
while i <= 100: # 设置循环条件
print(i)
i = i+1 # 每次循环+1
"""
代码解析:
第一次循环
i = 1 i<=100 判断为真,执行循环体 print(1)
i += 1 i => 2
第二次循环
代码回到17行,重新进行条件判定
i = 2 i<=100 判断为真,执行循环体 print(2)
i += 1 i => 3
第三次循环
代码回到17行,重新进行条件判定
i = 3 i<=100 判断为真,执行循环体 print(3)
i += 1 i => 4
....
以此类推
直到i = 101 i <= 100 判断为假,不执行循环体,到此循环结束...
1 ~ 100
"""
1 ~ 100的累加和
# (1) 初始化一个变量
i = 1
total = 0
# (2) 写上循环的条件
while i <= 100 :
# (4) 写上自定义的逻辑
total += i
# (3) 自增自减的值
i += 1
print(total)
# 计算1-100的和
i = 1
j = 0
while i<=100:
j += i # 每次循环都是0+i
i += 1 # i每次循环都+1
print(j)
"""
代码解析:
第一次循环
i = 1 i <= 100 判定为真True 执行循环体 total += i => total = total + i => 0 + 1
i += 1 => i = 2
第二次循环
i = 2 i <= 100 判定为真True 执行循环体 total += i => total = total + i => 0 + 1 + 2
i += 1 => i = 3
第三次循环
i = 3 i <= 100 判定为真True 执行循环体 total += i => total = total + i => 0 + 1 + 2 + 3
i += 1 => i = 4
...
依次类推
当i = 101 101 <= 100 判定为假False 不执行循环体,到此,循环结束..
total += i => total + i => 0 + 1 + 2 + 3 + 4 + .... + 100 => 5050
"""
死循环
"""
while True:
print(1)
"""
用死循环的方法实现 1 ~ 100累加和
i = 1
total = 0
sign = True
while sign:
total += i
i+=1
# 判断i是否加到了101 , 不参与循环
if i == 101:
# 终止循环
sign = False
print(total)
#1 ~ 100 = 5050
二、while循环练习
1、单向循环的练习
(1)打印 一行十个小星星* help(print)
# help 查看某个方法的文档
help(print)
print("*",end='') # 不换行
print("*",end='')
print("*",end='')
***
i = 0
while i<10:
# end='' 打印时,尾部默认不加换行
print("*",end='')
i += 1
**********
# 默认换行
打印 一行十个小星星*
i = 0
while i < 10: # 循环条件
print("*",end='')
i += 1
(2)通过打印一个变量的形式,展现一行十个小星星
print("<======>")
i = 0
strvar = ""
while i < 10:
# 写上循环的逻辑
strvar += "*" # strvar = strvar + "*"
i +=1
print(strvar)
"""
strvar += "*" => strvar = "*"
strvar += "*" => strvar = "*" + "*" = "**"
strvar += "*" => strvar = "**" + "*" = "***"
...
strvar += "*" => strvar = "********" + "*" = "*********"
"""
(3)一行十个换色的星星 ★☆★☆★☆★☆★☆
方法一
i = 0
while i < 5:
print("★☆",end="")
i+=1
方法二
i = 0
while i < 10:
if i % 2 == 0 :
print("★",end="")
else:
print("☆",end="")
i+=1
print("<=============>")
方法三
i = 0
strvar = ""
while i < 10:
if i % 2 == 0 :
strvar += "★"
else:
strvar += "☆"
i+=1
print(strvar)
"""
***公式: 任意数 和 n 进行取余,余数的范围: 0 ~ (n-1)***
0 % 2 = 0
1 % 2 = 1
2 % 2 = 0
3 % 2 = 1
被除数 % 2 => 0 或者 1
0 % 5 = 0
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0
6 % 5 = 1
7 % 5 = 2
被除数 % 5 => 0 或者 1,2,3,4
"""
(4)用一个循环,打印十行十列小星星
"""
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
★★★★★★★★★★
"""
方法一
i = 0
while i < 100:
# 逻辑写在这里
print("*" , end="")
# 打印换行 (在9 19 29 .. 99 )
if i % 10 == 9:
print()
i += 1
"""
0123456789
**********
10111213141516171819
**********
20212223242526272829
**********
...
90919293949596979899
**********
9 19 29 39 49 59 69 79 89 99
9 % 10 = 9
19 % 10 = 9
29 % 10 = 9
...
99 % 10 = 9
"""
print("<======>")
方法二
i = 1
while i <= 100:
# 逻辑写在这里
print("*" , end="")
# 打印换行 (在9 19 29 .. 99 )
if i % 10 == 0:
print()
i += 1
"""
12345678910
**********
11121314151617181920
**********
21222324252627282930
**********
...
919293949596979899100
**********
10 20 30 ... 100
"""
(5) 一个循环实现十行十列,格列换色的小星星
"""
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
★☆★☆★☆★☆★☆
"""
i = 0
while i < 100:
# (1)打印星星
if i % 2 == 0 :
print("★",end="")
else:
print("☆",end="")
# (2)打印换行 (在9 19 29 .. 99 )
if i % 10 == 9:
print()
i += 1
(6)一个循环实现十行十列,隔行换色的小星星
"""
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
*** 公式:任意数和n进行地板除,会出现n个相同的数
0 // 10 = 0
1 // 10 = 0
2 // 10 = 0
..
9 // 10 = 0
0 ~ 9 // 10 => 0 (10个相同的0)
10 // 10 = 1
11 // 10 = 1
12 // 10 = 1
...
19 // 10 = 1
10 ~ 19 // 10 => 1 (10个相同的1)
.... 以此类推
20 ~ 29 // 10 => 2 (10个相同的2)
30 ~ 39 // 10 => 3 (10个相同的3)
40 ~ 49 // 10 => 4 (10个相同的4)
...
90 ~ 99 // 10 => 9 (10个相同的9)
0~ 100 会出现10个相同的0,1,2 , 3 ... 9
0 // 3 0
1 // 3 0
2 // 3 0
3 // 3 1
4 // 3 1
5 // 3 1
"""
""""""
方法一
i = 0
while i < 100:
# (1)打印星星
if i // 10 % 2 == 0:
print("★",end="")
else:
print("☆",end="")
# (2)打印换行 (在9 19 29 .. 99 )
if i % 10 == 9:
print()
i += 1
方法二
print("<=================>")
i = 10
while i < 110:
# 打印星星
num = int(str(i)[-2])
if num % 2 == 0 :
print("★",end="")
else:
print("☆",end="")
# 打印换行
if i % 10 == 9:
print()
i+=1
"""
10 ~ 100 101 102 103 110...
10 ~ 19 => 1
20 ~ 29 => 2
30 ~ 39 => 3
90 ~ 99 => 9
100 ~ 109 => 0
"""
2、双向循环的练习
双向循环的专题练习
1.用两个循环完成十行十列的小星星
j = 0
while j < 10:
# 打印星星
i = 0
while i < 10:
print("*",end="")
i+=1
# 打印换行
print()
j += 1
2.用两个循环完成十行十列隔列换色的小星星
"""
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★
"""
i = 0
while i < 10:
# 打印一行黑白相间的星星
j = 0
while j < 10:
if j % 2 == 0:
print("☆",end="")
else:
print("★",end="")
j +=1
# 打印换行
print()
i+=1
3.用两个循环完成十行十列隔行换色的小星星
"""
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
★★★★★★★★★★
☆☆☆☆☆☆☆☆☆☆
"""
"""
外层的循环i动的慢
内层的循环j动的快
外层的i动一次, 内层的循环动10次
"""
i = 0
while i < 10 :
j = 0
while j < 10:
if i % 2 == 0:
print("☆",end="")
else:
print("★",end="")
j +=1
print()
i +=1
4.99乘法表
方向一
i = 1
while i <= 9:
# 打印对应的表达式
j = 1
while j <= i:
print("%d*%d=%2d " % (i,j,i*j) ,end="" )
j+=1
# 打印换行
print()
i +=1
方向二
i = 9
while i >= 1:
# 打印对应的表达式
j = 1
while j <= i:
print("%d*%d=%2d " % (i,j,i*j) ,end="" )
j+=1
# 打印换行
print()
i -= 1
print("<====================>")
方向三
i = 1
while i <= 9 :
kongge = 9 - i
# 打印空格
while kongge > 0:
print(" ",end="")
kongge -= 1
# 打印表达式
j = 1
while j <= i:
print("%d*%d=%2d " % (i,j,i*j) ,end="" )
j+=1
# 换行
print()
i +=1
print("<===============>")
方向四
i = 9
while i >= 1 :
kongge = 9 - i
# 打印空格
while kongge > 0:
print(" ",end="")
kongge -= 1
# 打印表达式
j = 1
while j <= i:
print("%d*%d=%2d " % (i,j,i*j) ,end="" )
j+=1
# 打印换行
print()
i -=1
# 求吉利数字 100 ~ 999 之间 找 111 222 333 123 456 654 321 ...
"""
// 可以获取一个数高位
% 可以获取一个数低位
baiwei = 345 // 100
shiwei = 345 // 10 % 10
gewei = 345 % 10
print(gewei)
"""
# 方法一
i = 100
while i <= 999:
baiwei = i // 100
shiwei = i // 10 % 10
gewei = i % 10
if shiwei == gewei and shiwei == baiwei :
print(i)
# 123
elif shiwei == gewei - 1 and shiwei == baiwei + 1:
print(i)
# 987
elif shiwei == gewei + 1 and shiwei == baiwei - 1:
print(i)
i +=1
# 方法二
print("<====>")
i = 100
while i <= 999:
strvar = str(i)
# print(strvar, type(strvar))
gewei = int(strvar[-1])
shiwei = int(strvar[1])
baiwei = int(strvar[0])
if shiwei == gewei and shiwei == baiwei :
print(i)
# 123
elif shiwei == gewei - 1 and shiwei == baiwei + 1:
print(i)
# 987
elif shiwei == gewei + 1 and shiwei == baiwei - 1:
print(i)
i +=1
# 方法三
print("<====>")
i = 100
while i <= 999:
strvar = str(i)
# print(strvar, type(strvar))
gewei = int(strvar[-1])
shiwei = int(strvar[1])
baiwei = int(strvar[0])
if 2 * shiwei == gewei + baiwei and (shiwei == gewei + 1 or shiwei == gewei -1 ):
print(i)
elif gewei == shiwei and shiwei == baiwei:
print(i)
i +=1
# 百钱买百鸡
# 公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
"""
穷举法:把数据拿出来一个一个试
x = [1,2]
y = [3,4]
z = [5,6]
x+y+z = 10
1 + 3 + 5 = 9
1 + 3 + 6 = 10 bingo
1 + 4 + 5 = 10 bingo
1 + 4 + 6 = 11
2 + 3 + 5 = 10 bingo
2 + 3 + 6 = 11
2 + 4 + 5 = 11
2 + 4 + 6 = 12
"""
"""
公鸡 : x 母鸡 : y 小鸡: z
鸡的数量:x + y + z = 100
鸡的价格:5 * x + 3 * y + 1/3*z = 100
"""
x = 0
while x <= 20:
y = 0
while y <= 33:
z = 0
while z <= 100:
if x+y+z == 100 and 5*x + 3 * y + 1/3*z == 100 :
print(x,y,z)
z += 1
y +=1
x += 1
三、循环的关键字
1、pass
pass 过 (代码块中的占位符)
if 20 == 20:
pass
while True:
pass
2、break
break 终止当前循环 (只能用在循环之中)
# 1 ~ 10 遇到5终止循环
i = 1
while i <= 10:
print(i)
if i == 7: # 如果i等于7,结束当前循环
break
i += 1
i = 1
while i <= 3:
j = 1
while j <=3:
if j == 2:
break # 终止当前循环,并不是外部循环
print(i,j)
j+=1
i +=1
# 1 1
# 2 1
# 3 1
"""
if 5 == 5: error
break
"""
3、continue
continue 跳过当前循环,从下一次循环开始
# 打印 1 ~ 10 跳过5
i = 1
while i <= 10:
if i == 5:
# 在跳过之前,因为会终止执行后面的代码,从下一次循环开始
# 为了避免死循环,手动加1
i += 1
continue
print(i)
i +=1
1
2
3
4
6
7
8
9
10
# 1 ~ 100 打印所有不含有4的数字
# 方法一
print("<============>")
i = 1
while i <= 100:
strvar = str(i)
# print(strvar)
if "4" in strvar:
i += 1
continue
print(i)
i +=1
# 方法二
print("<============>")
i = 1
while i <= 100:
if i // 10 == 4 or i % 10 == 4:
i+=1
continue
print(i)
i+=1
四、for循环
while 一般用于处理复杂的逻辑关系
for 一般用于迭代数据
部分情况下两个循环可以互相转换;
for循环
遍历 循环 迭代 , 把容器中的元素一个一个获取出来
while循环在遍历数据时的局限性
"""
lst = [1,2,3,4,5] # ok
i = 0
while i < len(lst):
print(lst[i])
i+=1
setvar = {"a","b","c"} # not ok
i = 0
while i < len(setvar):
print(setvar[i])
i+=1
"""
for循环的基本语法
Iterable 可迭代性数据:1.容器类型数据 2.range对象 3.迭代器
for 变量 in Iterable:
code1.
# 字符串
container = "北京和深圳温差大概20多度"
# 列表
container = [1,2,3,4,4,5]
# 元组
container = ("宇智波鼬","大蛇丸","迪达拉")
# 集合
container = {"关羽","张飞","赵云","马超","黄忠"}
# 字典
container = {"name":"漩涡鸣人","class":"一班","teacher":"自来也","id":"壹","jn":"螺旋丸"}
# 遍历数据
for i in container:
print(i)
name
class
teacher
id
jn
1.遍历不等长多级容器
container = [1,2,3,4,("你好","234",{"漩涡鸣人","自来也","螺旋丸"})]
for i in container:
# 判断当前元素是否是容器,如果是,进行二次遍历,如果不是,直接打印
if isinstance(i,tuple):
# ("你好","234",{"漩涡鸣人","自来也","螺旋丸"})
for j in i:
# 判断当前元素是否是集合,如果是,进行三次遍历,如果不是,直接打印
if isinstance(j,set):
# j = {"漩涡鸣人","自来也","螺旋丸"}
for k in j :
print(k)
else:
print(j)
# 打印数据
else:
print(i)
2.遍历不等长多级容器
container = [("关羽","张飞","赵云"), ("李白","杜甫"),("秦始皇",)]
for i in container:
for j in i:
print(j)
关羽
张飞
赵云
李白
杜甫
秦始皇
3.遍历等长的容器
container = [("关羽","张飞","赵云") , ["苏洵","苏轼","苏辙"],{"韩愈","柳宗元","王安石"}]
for a,b,c in container:
print(a,b,c)
关羽 张飞 赵云
苏洵 苏轼 苏辙
柳宗元 王安石 韩愈
变量的解包
a,b,c = "poi"
a,b = (1,2)
a,b = 1,2
a,b,c = [10,11,12]
a,b = {"林明辉","家率先"}
a,b = {"lmh":"林明辉","jsx":"家率先"}
a,b,c = ("马云","小马哥","马春配")
print(a,b,c)
range对象
"""
range([开始值,]结束值[,步长])
取头舍尾,结束值本身获取不到,获取到它之前的那一个数据
"""
range(一个值) 5是结束值
for i in range(5): # 0 ~ 4
print(i)
0
1
2
3
4
range(二个值) 3是开始值,8是结束值
for i in range(3,8): # 3 4 5 6 7
print(i)
3
4
5
6
7
range(三个值) 正向的从左到右 1是开始值,11是结束值,步长为3,每次+3
for i in range(1,11,3): # 1 4 7 10
print(i)
1
4
7
10
range(三个值) 逆向的从右到左 10是开始值,0是结束值,步长是-1,每次-1
for i in range(10,0,-1): # 10 9 8 7 ... 1
print(i)
10
9
8
7
6
5
4
3
2
1
注意:
从左到右,步长为正;
从右到左,步长为负
总结:
"""
while 一般用于处理复杂的逻辑关系
for 一般用于迭代数据
部分情况下两个循环可以互相转换;
"""
i = 1
while i <= 9:
j = 1
while j <= i:
print("%d*%d=%2d " % (i,j,i*j) ,end="" )
j+=1
print()
i +=1
for i in range(1,10):
for j in range(1,i+1):
print("%d*%d=%2d " % (i,j,i*j) ,end="" )
print()
打印 1 ~ 10 跳过5
i = 1
while i <= 10:
if i == 5:
i += 1
continue
print(i)
i +=1
for i in range(1,11):
if i == 5:
continue
print(i)