运算符及流程控制、while循环、for遍历

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


运算符

概念

计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算,今天我们暂只学习算数运算、比较运算、逻辑运算、赋值运算

算数运算符 + - * / // % **

var1 = 6 
var2 = 4 
# + 加法 
res = var1 + var2 
print(res) 

# ‐ 减法 
res = var1 ‐ var2 
print(res) 

# * 乘法 
res = var1 * var2 
print(res) 

# / 除法(结果为小数) 
res = var1 / var2 
print(res)

# // 地板除(返回整数) 
res = var1 // var2 
print(res) 

# % 取余 
res = 11 % 4 
res = ‐11 % 4 # ‐3 + 4 = 1 
res = 11 % ‐4 # 3 + (‐4) = ‐1 
res = ‐11 % ‐4 # ‐3 (如果被除数和除数都是负数,在正常的结果前面加上 负号即可) 
print(res) 

res = ‐17 % 7 # ‐3 + 7 = 4 
res = 17 % ‐7 # 3 + (‐7) = ‐4 
res = ‐17 % ‐7 # ‐3 
print(res) 

# ** 幂运算 
res = 3 ** 2 
res = 3 ** 4 
print(res)

注意点:
1./ 除法,结果为小数
2.// 地板除,返回整数
3.// 如果被除数或者除数是一个小数,结果加上.0

比较运算符:< > <= >= == !=

注意点:
1.只会产生两种结果:True和False
2.>=,<= 两个值相等,返回值也为True

var1 = 100
var2=100
res = var1 > var2
res = var1 < var2
res = var1 <= var2
res = var1 >= var2
print(res)

#注意点
res = var1 == var2
print(res )
res = var1 != var2
print(res)

赋值运算符:= += -= *= /= //= %= **=

注意点:
1.= 是赋值,从右向左,将右侧的值赋值给左侧变量
2.a+=b---->a=a+b

从右向左,将右侧的值赋值给左侧变量。 例如,var = 9 的意思是将9赋值给变量var,并非var等于9。

var1 = 9
var2 = 2
# +=
'''var1 = var1 + var2 '''
var1 += var2
print(var1)
# -=
'''var1 = var1 - var2'''
var1 -= var2
print(var1)
#*=
'''var1 = var1 * var2 '''
var1 *= var2
print(var1)
# /=
'''var1=var1/var2'''
var1 /= var2
print(var1)
# //=
'''var1 = var1 // var2'''
var1 / /= var2
print(var1)
# %=
'''var1 = var % var2'''
var1 %= var2
print(var1)
# **=
'''var1 = var1 ** var2'''
var1 **= var2
print(var1)

成员运算符:in 和 not in (针对于容器型数据)

注意点:
1.字符串必须是一个连续的片段
2.列表元组字典正常判断即可
3.在字典中,in和not in在字典中只判断键,不判断值

strvar=‘听说白雪公主在逃跑,小红帽在担心大灰狼'
res='雪' in strvar
res='文' in strvar
res='白雪公主' in strvar
s res='白小灰狼' in strvar#字符串必须是个连续的片段,否则即使每个字符都在字符串中也是False
res=',' in strvar
print(res)
#list tuple set
lst=['白雪公主','小红帽',‘大灰狼',‘匹诺曹']
res='白雪公主'in lst
print(res)

tup=('白雪公主','小红帽','大灰狼',‘匹诺曹')
res='福兹福'not intup
print(res)

setvar = {'金角大王','银角大王','老男孩'}
res = '老男孩' in setvar 
print(res)
# dict
'in和not in在字典中只判断键,不判断值'''
dic = {'bxgz': '白雪公主','xhm': '小红帽','dhl': '大灰狼'}
res = '白雪公主' in dic
res = 'bxgz' in dic
res = 'dhl' not in dic
print(res)

身份运算符: is 和 is not

注意点:
1.身份运算符的作用是检测两个数据在内存当中是否是同一个值
2.判断是否同一个值请看上篇文章:判断id是否相同的部分。

var1 = 4-90j
var2 = 4-90j
res = var1 is not var2
print(res)

var1 = (1, 2, 3)
var2 = (1, 2, 3)
res = var1 is var2
print(res)

逻辑运算符:and or not

注意点:
1.逻辑与:全真则真,一假则假
2.逻辑或:全假则假,一真则真
3.逻辑非:真变假,假变真
4.逻辑短路: 如果出现了短路效果,后面的代码不执行
短路条件:
(1) True or 表达式
(2) False and 表达式
5.逻辑运算符的优先级:() > not > and > or

and 逻辑与:全真则真,一假则假

res = True and True
res = True and False
res = False and True
res = False and False
print(res)

or 逻辑或:全假则假,一真则真

res = True and True
res = True and False
res = False and True
res = False and False
print(res )

not 逻辑非:真变假,假变真

res = not False
res = not True
print(res)

逻辑短路

逻辑短路:如果出现了短路效果,后面的代码不执行 逻辑短路的两种形式:
(1) True or 表达式;
(2) False and 表达式。
上述的两种情况,虽然后面的表达式不执行,但是表达式中如果有语法 错误,还是会报错的

True or print('我们都是小怪兽呀')
# True or True => True
# True or False => True
False and print('凡王之血,必以剑终')
# False and True => False
# False and False => Fal se

注意:只有and或者or出现一次的情况下才考虑逻辑短路,否则运算符 的优先级会影响短路的效果。

 print(False and 7 or 8) # 由于运算符优先级的缘故,并不会出现短路的效果,结果是8,而不是False

位运算符: & | ~ ^ << >>

1.按位与 &
2按位或 |
3.按位异或 ^ (两个值不一样,返回真,否则返回假)
4.<< 左移 :左移相当于做乘法 : a * 2的n次幂 >> 右移 :右移相当于做除法 : a // 2的n次幂
5.~ 按位非 (针对于补码进行操作,按位取反,包括符号位)

var1 = 19
var2 = 15
print(var1 & var2)
'''
19的二进制
0000 ... 10011
15的二进制
0000 ... 01111
0000 ... 01111
0000 ... 01111
0000... 00011 => 3
'''

#按位或|
var1 = 19
var2 = 15
print(var1| var2)
'''
19的二进制
0000 ... 10011
15的二进制
0000 ... 01111
0000 ... 01111
0000 ... 01111
0000 ... 11111 => 31
'''

#按位或异^两个值不一样,返回真,否则返回假
'''
1 0=>1
0 1=>1
0 0=>0
1 1=>0
'''
var1 = 19
var2 = 15
print(var1 ^ var2)
'''
19的二进制
0000. ..10011
15的二进制
0000 ... 01111
0000 ... 01111
0000 ... 11100 => 28
'''

# << 左移
...左移相当于做乘法: 5 * 2的n次幂'..
res=5<<1
res=5<<2
res= 5<<3
print(res)
'''
0000..101
0000 .. 1010移动一位
0000 .. 10100移动两位
'''
#>>右移
'''右移相当于做除法: 5112的n次幕'''
res=5>> 1
res=5>>2
res=5>>3
print(res)
'''
68 0000 ... 101
69 0000 ... 010移动1位
70 0000 ... 001移动2位
71 0000 ... 000移动3位
'''

# ~ 按位非(针对于补码进行操作,按位取反,包括符号位)
'''公式:‐(n+1)'''
var1 = ~19
print(var1)
'''
~ 按位非每一位都取反,包括符号位,求反码是每一位除了符号位
原码:
0000 ... 10011 
反码:
0000 ... 10011 
补码:0000 ... 10011

补码: 0000 ... 10011 
按位非: 1111 ... 01100

给你补码求原码:
补码:1111 ... 01100 
反码:1000 ... 10011 
原码:1000 ... 10100 => ‐20
'''
var1 = ~(‐19)
print(var1)
'''
原码:1000 ... 10011
反码:1111 ... 01100 
补码:1111 ... 01101

补码: 1111 ... 01101
按位非:0000 ... 10010

补码:0000 ... 10010
原码:0000 ... 10010 => 18 108 
'''

运算符的总结

1.个别的特殊运算符:

优先级最高:** (幂运算符) 
优先级最低:= (赋值运算符) 

2 对于全体运算符来说:

一元运算符 > 二元运算符 
一元运算符:同一时间,只操作一个值 二元运算符:同一时间,操作两个值

3.处于同一层级的运算符:

逻辑:() > not > and > or 
算数:乘除 > 加减 
位运算符:(<< >>) > & > ^ > | 

4.运算符的优先级:

算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 >逻辑运算符 > 赋值运算符

流程控制

判断类型 isinstance

语法:
用法一:
	isinstance(要判断的值,要判断的类型)返回True或者False
用法二:
	isinstance(要判断的值,(可能的类型1,可能的类型2,可能的类型3...))如果有一个类型满足,返回的类型是True否则返回False
适用的数据类型:
int float bool complex str list tuple set dict

用法一:

res = isinstance(5,int)
print(res)
# 结果为True
res = isinstance("11223344",str)
print(res)
# 结果为True
res = isinstance([1,2,3],tuple)
print(res)
# 结果为False

用法二:

res = isinstance(16, (str,list,tuple)  )
print(res)
# 结果为False

代码块

代码块:以冒号作为开始,用缩进来划分作用域
作用域:作用的区域,作用的范围

# 判断条件为True,代码执行
if 10 == 10: 
    print(1)
    print(2)
    print(3)
    print(4)
# 判断条件为False,代码执行
if 10 == 11: 
   print(11)
   print(22)
   print(33)
print(44)

代码块的注意点:

要么全都是一个Tab缩进,要么全部都是4个空格,不能混合使用

if 10 == 10:
   print(100)
# print(200)前有一个2个空格和一个tab所以代码报错
    print(200)

流程控制

流程:代码执行的过程
控制:对代码执行过程的一种把控
三大结构:
1.顺序结构:默认代码依次从上到下执行
2.分支结构:4种
(1)单项分支
(2)双项分支
(3)多项分支
(4)巢状分支
3.循环结构:for 和 while
<==========================================================>

单项分支:

if 条件表达式:
code1
code2
当条件表达式成立,返回True,执行对应的代码块,反之不执行

# 定义变量"女生"
liucaixia = "女生"
# 判断条件,判断liucaixia是否是女生,True执行,False不执行
if liucaixia == "女生":
    # 执行打印
   print("给他买一些好吃的")
   print("给他买一些好玩的")
   print("陪她出去逛街")
   print("陪她买化妆品")

双项分支:

if 条件表达式:
code1
code2
else:
code3
code4
如果条件表达式成立,执行if对应的代码块
如果条件表达式不成立,则执行else对应的代码块
if 代码块也叫做真区间
else 代码块也叫做假区间

# 定义变量"抠脚老汉"
liucaixia = "抠脚老汉"
# 判断liucaixia是否是"抠脚老汉",结果为False,不执行if语句,
执行else语句
if liucaixia == "女生":
    print("加他微信")
    print("加他手机")
    print("收集他的兴趣爱好")
    print("以后多联系")
else:
    print("给你一榔头~")
    
youqian = True
# 双项分支
if youqian == True:
   print("上午刚认识,下午就结婚")
else:  
   print("你是个好人")
    
# input 等待用户输入字符串,接受的数据是字符串
"""
name = input("先森,你妈贵姓?~")
print(name , type(name))
"""

多项分支:

语法:
if 条件表达式1:
code1
code2
elif 条件表达式2:
code1
code2
elif 条件表达式3:
code1
code2
else:
code…
如果条件表达式1成立,返回True,执行对应的代码块,反之则向下执行
如果条件表达式2成立,返回True,执行对应的代码块,反之则向下执行
如果条件表达式3成立,返回True,执行对应的代码块,反之则向下执行
直到最后,任何条件都不满足,执行else这个分支的代码块。
elif 可以出现0次或者多次
else 可以出现0次或者1次

# 定义变量都为假
youqian = False
youfang = False
youche = False
youyanzhi = False
youtili = False
# 判断变量是否为真,不为真,则直接执行else
if youqian == True:
    print("我就嫁给你1")
elif youfang == True:
    print("我就嫁给你2")
elif youche == True:
    print("我就嫁给你3")
elif youyanzhi == True:
    print("我就嫁给你4")
elif youtili == True:
    print("我就嫁给你5")

else:
    print("你是个好人")
    
# 定义变量
youqian = True
youfang = False
youche = False
youyanzhi = False
youtili = False
# 判断变量是否为真,第一个变量为真,则直接执行第一个if语句
if youqian == True:
    print("我就嫁给你1")
elif youfang == True:
    print("我就嫁给你2")
elif youche == True:
    print("我就嫁给你3")
elif youyanzhi == True:
    print("我就嫁给你4")
elif youtili == True:
    print("我就嫁给你5")
else:
    print("你是个好人")
    
# 定义变量
youqian = False
youfang = True
youche = False
youyanzhi = False
youtili = False
# 判断变量是否为真,第二个变量为真,则直接执行第二个if语句
if youqian == True:
    print("我就嫁给你1")
elif youfang == True:
    print("我就嫁给你2")
elif youche == True:
    print("我就嫁给你3")
elif youyanzhi == True:
    print("我就嫁给你4")
elif youtili == True:
    print("我就嫁给你5")
else:
    print("你是个好人")
    
# 定义变量
youqian = True
youfang = True
youche = True
youyanzhi = True
youtili = True
# 判断变量都为真,只执行第一个if语句
if youqian == True:
    print("我就嫁给你1")
elif youfang == True:
    print("我就嫁给你2")
elif youche == True:
    print("我就嫁给你3")
elif youyanzhi == True:
    print("我就嫁给你4")
elif youtili == True:
    print("我就嫁给你5")
else:
    print("你是个好人")

巢状分支:

单项分支,双项分支,多项分支的相互嵌套

youqian = False
youfang = False
youche = False
youyanzhi = False
youtili = False
# 判断第一个if为假,往后的判断条件都不执行,直接执行else
if youqian == True:
    if youfang == True:
        if youche == True:
            if youyanzhi == True:
                if youtili == True:
                    print("老娘今天死活要嫁给你,等着接盘吧,兄弟")
                else:
                    print("恭喜你~ 成为我的1号备胎")
            else:
                print("你可以上韩国整整容,整成金城武再来.")
else:
    print("出门左拐,乘2路汽车,2站之后下是你家,不送了,老弟.")

while循环

循环结构:while 循环
特点:减少冗余的代码,提升代码的效率
语法:
while 条件表达式:
code1…
code2…
1.初始化一个变量
2.写上循环的判断条件
3.自增自减的变量值

打印1 ~ 100

# 打印1 ~ 100 
i = 1
while i <= 100:
   # 在这个位置写要执行的逻辑
   print(i)
   i += 1 # i = i + 1

代码解析:

初始化一个变量i
第一次循环
i = 1 , i<=100 成立返回True,执行循环
print(1)
i += 1 => 2
第二次循环
i = 2 , i<=100 成立返回True,执行循环
print(2)
i += 1 => 3
第三次循环
i = 3 , i<=100 成立返回True,执行循环
print(3)
i += 1 => 4
....
什么时候结束?
当i = 101时候, 判断i <= 100 不成立返回False ,不执行循环
循环结束...

计算1~100的累加和
方法一:

# 打印1 ~ 100 
i = 1
while i <= 100:
   # 在这个位置写要执行的逻辑
   print(i)
   i += 1 # i = i + 1

代码解析

第一次循环
i = 1 i<=100 成立执行循环
total += i => total = total + i => 0 + 1
i+=1 => 2
第二次循环
i = 2 i<=100 成立执行循环
total += i => total = total + i => 0 + 1 + 2
i+=1 => 3
第三次循环
i = 3 i<=100 成立执行循环
total += i => total = total + i => 0 + 1 + 2 + 3
i+=1 => 4
....
依次循环
什么时候结束?
i = 100 
total = 0 + 1 + 2 + 3 + 4 + ...+ 100 = 5050
当i = 101 不满足循环的条件 , 直接跳出,循环结束..
到此打印 5050 ;

方法二:

# 方法二.
total = 0
i = 1
sign = True
while sign:    
   total += i # total = total + i
   i+=1
   # 手动加上终止循环的条件
   if i == 101 :
      sign = False
print(total)

关键字使用 pass break continue

pass 过(占位)

# 条件为真,执行while代码
while True:
    # pass占位不执行下面代码,返回while继续执行,所以是死循环
    pass
if 10 == 10:
    print(123)
# if条件为真,打印123,执行下一行代码
if 10 == 10:
    print(123)
# while为真执行
while True:
    # pass占位不执行,所以只打印123后死循环
    pass

break 终止当前循环

# 打印1~10 遇到5就终止循环
# 定义变量i从1开始
i = 1
# 循环i,并且让i<=10成立为True,执行下面代码
while i <= 10:
    # 判断i是否等于5
    if i == 5:
        # 当i等于5时 终止当前循环
        break
        # 打印i的结果
    print(i)
    # i+1=i 循环
    i += 1
# 输出结果:1 2 3 4
# break 终止的是当前循环
# 定义变量i
i = 1
# i<=3,控制外层循环,当i=3时终止循环
while i <= 3:
    # 定义变量j
    j = 1
    # j<=3,控制内层循环
    while j <= 3:
        # 判断j是否等于2
        if j == 2:
            # 当j等于2时终止当前循环
            break
        # 打印i和j的值
        print(i, j)
        # 内层循环j+1=j
        j += 1
    # 外层循环i+1=i
    i += 1
# 输出结果:1外层 1内层
#          2外层 1内层
#          3外层 1内层

continue 跳过当前循环,从下一次循环开始

# 打印1~10 跳过5
i = 1
while i <= 10:
    # 当i不等于5时,会执行外层的i+=1,i等于5时才会执行内层的i+=1
    if i == 5:
        # 需手动自增加1. 当执行continue时,后面的代码不执行,
        # 跳到while循环的条件判断处,会造成死循环
        i += 1
        continue
    print(i)
    i += 1
    
# 打印1~ 100 所有不含有4的数字
i = 1
while i <= 100:
    # i地板除10取高位值,判断高位值是否等于4
    # or(或者)
    # i取余10取个位值,判断个位值是否等于4
    if i // 10 == 4 or i % 10 == 4:
        i += 1
        # 当i等于4或i有含有4的值不执行下面代码,直接返回while
        continue
    print(i)
    i += 1

for遍历

功能:遍历、循环、迭代

# while循环取出列表中的元素
lst = ["刘鑫", "刘子豪", "刘子涛", "晏国彰"]
# i等于lst列表的索引
i = 0
# len计算lst列表的长度,然后循环i
while i < len(lst):
    print(lst[i])
    i += 1
# 输出结果:刘鑫 刘子豪 刘子涛 晏国彰
# for 直接遍历出lst列表中的每个元素
for i in lst:
    print(i)
# 输出结果:刘鑫 刘子豪 刘子涛 晏国彰

for主要用于遍历数据而提出,while在遍历数据时,有局限性
for语法:
for 变量 in 可迭代对象:
code1
code2
可迭代对象(容器类型数据,range对象,迭代器)

# 遍历字符串
container = "雷霆嘎巴,ZBC,无情哈拉少"
# 输出结果:雷/n霆/n嘎/n巴/n,/nZ/nB/nC/n,/n无/n情/n哈/n拉/n少
# 遍历列表
container = ["刘鑫", "刘子豪", "刘子涛", "晏国彰"]
# 输出结果:刘鑫/n刘子豪/n刘子涛/n晏国彰
# 遍历元组
container = (1, 2, 3, 45)
# 输出结果:1/n2/n3/n45
# 遍历集合
container = {"白星","高峰峰","孙志和","刘鹏","牧树人"}
# 输出结果:高峰峰/n白星/n牧树人/n刘鹏/n孙志和
# 遍历字典 (遍历字典时,只遍历键)
container = {"ww":"伟大的人,风流倜傥","msr":"树人,伟大的人","mh":"猥琐的老男人"}
# 输出结果:ww/n msr/n mh
for i in container:
   print(i)

遍历不等长的二级容器

# 遍历不等长的二级容器
container = [["刘聪", "毛洪磊", "余锐", "张家豪"], ("崔文君", "张捷")]
# 先遍历第一级的元素赋值给i
for i in container:
    # 在遍历第二级容器中每个元素赋值给j
    for j in i:
        print(j)
# 输出结果:
 # 刘聪
# 毛洪磊
# 余锐
# 张家豪
# 崔文君
# 张捷
# 变量的解包
# a, b = 1, 2
# a, b = [3, 4]
a, b = {"a": 5, "b": 6}
print(a, b)
# 输出结果:
# 1 2
# 3 4
# a b

遍历等长的二级容器

# 遍历等长的二级容器
container = [("王健林", "王思聪", "王美丽"), ("马云", "马化腾", "马生平"), ("王宝强", "马蓉", "宋小宝")]
# 遍历container赋值给a,b,c
for a, b, c in container:
    print(a, b, c)
# 输出结果:
# 王健林 王思聪 王美丽
# 马云 马化腾 马生平
# 王宝强 马蓉 宋小宝

range对象

语法:
range(开始值,结束值,步长)
结束值本身取不到,取到结束值之前的那个数

# 遍历0到9的元素,10本身取不到
for i in range(10):
    print(i)
# 遍历3到10
for i in range(3, 11):
    print(i)
# 遍历1到10的元素,每隔三个取一次值,结束值10本身取不到
for i in range(1, 10, 3):
    print(i)  # 1,4,7
# 倒序打印10 ~ 1
for i in range(10,0,-1):
   print(i)
# 10 9 8 7 6 .... 1

while和for循环总结

while:适合较为复杂的逻辑
for: 适合数据遍历
while和for部分代码可以互相转换

区别写法1:

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)

区别写法2

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()
上一篇:管道、状态码、循环


下一篇:设计模式—门面模式