第五章:运算符与流程控制
运算符
基本运算符
数学运算符
# + - * / % // **
# 简化写法
n = 10
n += 1 # n = n + 1
n -= 1 # n = n - 1
n *= 1 # n = n * 1
n /= 1 # n = n / 1
n %= 1 # n = n % 1 取余
n //= 1 # n = n // 1 取整除,返回商的整数部分
n **= 1 # n = n ** 1 次幂
比较运算符
<
>
<=
>=
== (等于号)
!= (不等于)
常用赋值符
# 1.链式赋值
# 写法一
# name = 'jason'
# name1 = name
# name2 = name
# 写法二
name = name1 = name2 = 'jason' # 链式赋值
print(name, name1, name2) # jason jason jason
# 2.交叉赋值
m = 100
n = 999
'''让m和n互相转换绑定的值, 奇葩式写法'''
m = n
n = m
print(m, n) # 999 999
'''方式1:采用中间变量, 冒泡排序中'''
temp = m
m = n
n = temp
print(m, n) # 999 100
'''方式2:交叉赋值语法'''
m, n = n, m
print(m, n) # 999 100
# 3.解压赋值
name_list = ['jason', 'kevin', 'tony', 'oscar']
'''low的写法'''
# name1 = name_list[0]
# name2 = name_list[1]
# name3 = name_list[2]
# name4 = name_list[3]
name1, name2, name3, name4 = name_list # 解压赋值语法
print(name1, name2, name3, name4) # jason kevin tony oscar
'''解压赋值在使用的时候 正常情况下需要保证左边的变量名与右边的数据值个数一致'''
# a, b = name_list # 变量名少了不行
# a, b, c, d, e = name_list # 变量名多了也不行
'''当需要解压的数据个数特别多 并且我们只需要使用其中的几个 那么可以打破上述的规则'''
a, *b = name_list # *会自动接收多余的数据 组织成列表赋值给后面的变量名
print(a) # jason
print(b) # ['kevin', 'tony', 'oscar']
a, c, *b = name_list
print(a)
print(c)
print(b) # ['tony', 'oscar']
a, *b, c = name_list
print(a) # jason
print(b) # ['kevin', 'tony']
print(c) # oscar
'''当数据值不准备使用的时候 可以使用下划线作为变量名绑定'''
a, *_, c = name_list
print(a) # jason
print(*_) # kevin tony
print(c) # oscar
逻辑运算符
主要配合条件一起使用:and、or、not
优先级:()> not > and > or
# and 与
# and连接的多个条件必须全部成立,结果才成立
# eg: 你去相亲提要求: 身高必须是160以上、长相必须好看、家里必须有钱、性格必须温柔
# 身高 and 长相 and 有钱 and 温柔
# 1 > 2 and 4 < 8 and 10 < 1 and 1 == 2
# 如果条件中全部由 and 组成那么判断起来非常的简单
# 只要发现一个不成立,结果就不成立
print(1 < 10 and 666) # 666 成立
print(1 < 10 and 2 < 8) # True 成立
print(111 and 222) # 222 成立
# 如果需要你准确的说出具体的结果值,那么需要按照下列方式
# 如果 and 左边的条件是成立的,那么就完全取决于右边的条件,
# 右边如果直接是数据值,那么结果就是该数据值
# 如果是含有表达式,则为布尔值
# or 或
# or连接的多个条件只要有一个成立,结果就成立
# eg: 你去相亲提要求: 要么家里有钱,或者家里有势, 或者长得完美,或者对你死心塌地
# 有钱 or 有势 or 好看 or 专一
# 1 > 2 or 4 < 8 or 10 < 1 or 1 == 2
# 如果条件中全部由or组成那么判断起来非常的简单
# 只要发现一个成立,结果就成立
print(1 < 10 or 666) # True
print(666 or 1 > 10) # 666
print(0 or False) # False
print(0 or 111) # 111
# not 非
# 取反,类似于说反话
注意:可以使用 () 进行组合使用,改变优先级
如:(3>4 and 4>3) or ((1==3 and 'x' == 'x') or 3 >3)
成员运算符
判断个体在不在群体内:in、not in
name_list = ['jason', 'kevin', 'oscar', 'jerry']
print('tony' in name_list) # False
print('tony' not in name_list) # True
print('j' in name_list) # False 列表最小单位是数据值 不能再细分
s1 = 'hello world'
print('d' in s1) # 字符串最小单位是单个单个的字符
d1 = {
'username': 'jason',
'pwd': 123
}
print('jason' in d1) # False 字典成员运算只有键参与
print('username' in d1) # True 'username' 'pwd'
身份运算符
值相同 内存地址可能不同,内存地址相同 值肯定相同,不同的环境下可能优化的程度不一样
id() 返回一串数字 该数字可以看成是内存地址
is 判断内存地址是否相同
== 判断数据值是否相同
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
l2 = [11, 22, 33, 44, 55, 66, 77, 88]
print(l1 == l2) # True
print(id(l1)) # 22287464
print(id(l2)) # 22380992
print(l1 is l2) # False
# 小整数池
i1 = 11
i2 = 11
print(i1 is i2) # True
流程控制
流程控制理论
控制事物的执行流程
事物执行流程总共可以分为三种
-
顺序结构
从上往下依次执行 我们之前所编写的代码都属于该结构
-
分支结构
事物的执行会根据条件的不同做出不同的执行策略
-
循环结构
事物的执行会根据某个条件出现重复
在代码的世界里,很多时候可能会出现三者混合
流程控制前置知识
- python 中使用代码的缩进来表示代码的从属关系
从属关系:缩进的代码 (子代码) 是否执行取决于上面没有缩进的 - 并不是所有的代码都可以拥有缩进的代码(子代码)
if关键字 - 如果有多行子代码属于同一个父代码,那么这些子代码需要保证相同的缩进量
- python 中针对缩进量没有具体的要求,但是推荐使用四个空格 (windows中tab键)
- 当某一行代码需要编写子代码的时候,那么这一行代码的结尾肯定需要冒号
- 相同缩进量的代码彼此之间平起平坐,按照顺序结构依次执行
分支结构
1.单if分支结构
if 条件:
条件成立之后才会执行的代码快
ps:单if可以借助于流程图理解
username = input('username>>>:')
if username == 'jason':
print('老师好')
2.if...else...分支结构
if 条件:
条件成立之后执行的子代码
else:
条件不成立执行的子代码
username = input('username>>>:')
if username == 'jason':
print('老师好')
else:
print('去你妹的')
3.if...elif...else分支结构
if 条件1:
条件1成立之后执行的子代码
elif 条件2:
条件1不成立 条件2成立执行的子代码
elif 条件3:
条件1和2都不成立 条件3成立执行的子代码
else:
上述条件都不成立 执行的子代码
ps:中间的elif可以写多个、上述子代码永远只会走一个
score = input('请输入学生成绩>>>:')
score = int(score) # 将字符串的整数转换成整型的整数
if score >= 90:
print('优秀')
elif score >= 80:
print('良好')
elif score >= 70:
print('一般')
elif score >= 60:
print('及格')
else:
print('挂科 交钱重修')
4.if的嵌套使用(有点难)
age = 28
height = 170
weight = 110
is_beautiful = True
is_success = False
username = 'tony'
if username == 'tony':
print('tony发现目标')
if age < 30 and height > 160 and weight < 150 and is_beautiful:
print('大妹纸 手机掏出来 让我加微信')
if is_success:
print('吃饭 看电影 天黑了...')
else:
print('去你妹的 流氓!!!')
else:
print('不好意思 认错人了')
else:
print('不是tony做不出来这件事')
循环结构
while 循环
让一些代码反复的执行
while 条件:
条件成立之后执行的子代码(循环体代码)
1.先判断条件是否成立
2.如果成立则执行循环体代码
3.循环体代码执行完毕后再次回到条件判断处 判断条件是否成立
4.如果成立,则继续执行循环体代码
5.按照上述规律依次执行,直到条件不成立才会结束循环体代码的执行
# count = 1
# while count < 5:
# print('hello world')
# count += 1 # count = count + 1
# print('想不想干饭?')
break # 强行结束循环体
while 循环体代码一旦执行到break会直接结束循环
continue # 直接跳到条件判断处
while 循环体代码一旦执行到continue会结束本次循环 开始下一次循环
while 条件:
循环体代码
else:
循环体代码没有被强制结束的情况下 执行完毕就会执行else子代码
1.死循环
真正的死循环是一旦执行 CPU 功耗会急速上升,直到系统采取紧急措施。
尽量不要让 CPU 长时间不间断运算。
2.嵌套及全局标志位
强调: 一个 break 只能结束它所在的那一层循环
强调: 有几个 while 的嵌套,想一次性结束就应该写几个 break
强调: 如果不想反复写 break 可以使用全局标志位
is_flag = True
while is_flag:
username = input('username>>>:')
password = input('password>>>:')
if username == 'jason' and password == '123':
while is_flag:
cmd = input('请输入您的指令>>>:')
if cmd == 'q':
is_flag = False
print('正在执行您的指令:%s' % cmd)
else:
print('用户名或密码错误')
for 循环
for 循环能够做到的事情 while 都可以做到,只不过 for 循环在一些场景下使用更简单。
主要场景为:循环获取存储多个数据的数据内部数据值
实际案例:
name_list = ['jason', 'kevin', 'tony', 'oscar'] # 遍历
# 循环打印出列表中每一个数据值(while 索引取值>>>:超出范围会报错)
# count = 0
# while count < 4:
# print(name_list[count])
# count += 1
# for循环
for i in name_list:
print(i)
for循环语法结构
for 变量名 in 待遍历的数据:
for循环体代码
for循环特点
1.擅长遍历取值
2.不需要结束条件 自动结束(遍历完)
for循环主要遍历的数据类型有(常见有 字符串、列表、元组、字典、集合)
info = 'hello world'
for i in info:
print(i) # 单个单个字符
d = {'username': 'jason', 'password': 123}
for i in d:
print(i) # 只有键参与遍历
for 变量名 in 待遍历的数据:
for循环体代码
else:
for循环体代码没有被 break 强制结束的情况下运行完毕之后 运行
for循环语法结构中的变量名如何命名
1. 见名知意
2. 如果遍历出来的数据值没有具体的含义 可以使用常用的,如:i j k item v
for 循环体代码中如果执行到 break 也会直接结束整个 for 循环
for 循环体代码中如果执行到 continue 也会结束当前循环直接开始下一次循环
作业
题目
1.根据用户输入内容打印其权限
'''
jason --> 超级管理员
tom --> 普通管理员
jack,rain --> 业务主管
其他 --> 普通用户
'''
2.编写用户登录程序
要求:有用户黑名单 如果用户名在黑名单内 则拒绝登录
eg:black_user_list = ['jason','kevin','tony']
如果用户名是黑名单以外的用户则允许登录(判断用户名和密码>>>:自定义)
eg: oscar 123
3.编写用户登录程序
用户如果登录失败 则只能尝试三次
用户如果登录成功 则直接结束程序
4.猜年龄的游戏
假设用户的真实年龄是18 编写一个猜年龄的游戏 获取用户猜测的年龄
基本要求:可以无限制猜测 每次猜错给出提示(猜大了 猜小了) 猜对则结束程序
拔高练习:每次猜测只有三次机会 一旦用完则提示用户是否继续尝试 用户通过输入n或者y来表示是否继续尝试 如果是y则继续给用户三次猜测机会 否则结束程序
解答
1.根据用户输入内容打印其权限
print('请输入用户名')
while 1:
name = input('用户名:')
if name == 'jason':
print('超级管理员')
elif name == 'tom':
print('普通管理员')
elif name == 'jack' or name == 'rain':
print('业务主管')
else:
print('普通用户')
exit = input('如果推出清楚 quit >>>')
if exit == 'quit':
print('欢迎下次再来')
break
第 2 3 题:编写用户登录程序
black_user_list = ['jason', 'kevin', 'tony']
user_dit = {'tom':'132', 'ysg':'12345'}
print('请输入用户名')
while 1:
name = input('用户名:')
if name in black_user_list:
print('请联系管理员,拒绝登录')
elif name in user_dit.keys():
count = 0
exit = False
while count < 3:
pwad = input('输入用户密码:')
if pwad == user_dit[name]:
print('用户登录成功')
exit = True
break
else:
count += 1
print('用户密码错误')
if exit:
break
else:
print('密码输入错误三次,请重新登录')
elif name not in black_user_list and name not in user_dit.keys():
print('用户未注册')
exit = input('如果推出清楚 quit >>>')
if exit == 'quit':
print('欢迎下次再来')
break
4.猜年龄的游戏
print('欢迎来到猜数字游戏')
print('目标数字已生成')
num = 18
count = 0
exit = False
while 1:
while count < 3:
count += 1
n = int(input('请输入数字>>>'))
if n < 18:
print('猜小了')
elif n > 18:
print('猜大了')
elif n == 18:
print('恭喜,才对了')
exit = True
break
if exit:
break
out = input('是否再次尝试,获取三次机会(n/y)')
if out == 'y':
count = 0
print('再次开始')
else:
print('次数用尽,游戏结束')
break