Python开发-003_Python基础
1. 循环语句
在编程语言中最常用的循环语句是while循环和for循环,python中做循环的主要是while,而for循环通常用于遍历和解压。我们先将for循环放在后文中进行讲解。
# while循环基本格式
while 条件:
...
...
...
python是一个很看重缩进格式的编程语言,while 条件:
下方缩进区域就是while的循环体。如果while
后的条件是成立的(也就是True),即运行循环体内代码。
1.1 循环语句基本使用
示例1:
print("开始")
while True:
print("amber是个小都比")
print("结束")
# 输出:
开始
amber是个小都比
amber是个小都比
amber是个小都比
amber是个小都比
...
while True
代表while后面跟的结果一直为True,所以会无限循环(死循环)print("amber是个小都比")
,print("结束")
就不能得到运行。
示例2:
print("开始")
while 1 > 2:
print("如果祖国遭受到侵犯,热血男儿当自强。")
print("结束")
# 输出:
开始
结束
1 > 2
为False,故不允许print("如果祖国遭受到侵犯,热血男儿当自强。")
,直接运行循环体外的print("结束")
。
示例3:
data = True
print("开始")
while data:
print("如果祖国遭受到侵犯,热血男儿当自强。")
print("结束")
# 输出:
开始
如果祖国遭受到侵犯,热血男儿当自强。
如果祖国遭受到侵犯,热血男儿当自强。
如果祖国遭受到侵犯,热血男儿当自强。
...
while
后的条件并不一定是个具体的值,可以使用变量进行代替,本示例就是使用变量data进行代替,当data内的值为True,即认为while True。
示例4:
print("开始")
flag = True
while flag:
print("滚滚黄河,滔滔长江。")
flag = False
print("结束")
# 输出:
开始
滚滚黄河,滔滔长江。
结束
示例3提到过可以使用变量作为while 条件
,那么在循环体内也可以通过重新给那个变量赋值的方式,变成while False
。
示例5:
print("开始")
num = 1
while num < 3:
print("滚滚黄河,滔滔长江。")
num = 5
print("结束")
# 输出:
开始
滚滚黄河,滔滔长江。
结束
while
的条件也是可以进行计算和比较的,本示例num最初小于3,但是运行一次循环体代码后,num被赋值为了5,所以第二次循环无法进行,执行循环体外代码。
示例6:
print("开始")
num = 1
while num < 5:
print("给我生命,给我力量。")
num = num + 1
print("结束")
# 输出:
开始
给我生命,给我力量。
给我生命,给我力量。
给我生命,给我力量。
给我生命,给我力量。
结束
num被赋值为了1,在执行while循环的时候,判断条件是num<5,故条件成立执行循环体内代码,打印给我生命,给我力量,然后执行,num=num+1,即每次循环num就会增加1,当循环4次后,num=5,不符合num<5的循环条件,即跳出循环执行循环体外代码,print("结束")
。
1.2 综合小案例
请实现一个用户登录系统,如果密码错误则反复提示让用户重新输入,直到输入正确才停止。
# 请实现一个用户登录系统,如果密码错误则反复提示让用户重新输入,直到输入正确才停止。
print("开始运行路飞系统")
flag = True
while flag:
user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == "wupeiqi" and pwd == "luffy":
print("登录成功")
flag = False
else:
print("用户名或密码错误")
print("系统结束")
1.3 break
每次通过修改变量的方式终止循环,还是有一点麻烦,而python本身就为我们提供了终止变量的函数。
break,用于在while循环中帮你终止循环。
print("开始")
while True:
print("红旗飘飘,军号响。")
break # break终止掉循环后,循环体的代码不会被继续运行
print("剑已出鞘,雷鸣电闪。")
print("从来都是狭路相逢勇者胜。")
print("结束")
# 输出
开始
红旗飘飘,军号响。
结束
通过示例来更深入理解break的应用。
示例1:
print("开始")
i = 1
while True:
print(i)
i = i + 1
if i == 101:
break
print("结束")
# 输出
开始
1
2
...
100
结束
一个正常的循环i从1加到100,在i=101次的时候,运行break,终止掉了循环。
示例2:
print("开始运行系统")
while True:
user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == 'wupeiqi' and pwd = "oldboy":
print("登录成功")
break
else:
print("用户名或密码错误,请重新登录")
print("系统结束")
# 输出
开始运行系统
>>> 用户名
>>> 密码
正确,登录成功
系统结束
不正确,一直循环输出
所以,以后写代码时候,想要结束循环可以通过两种方式实现了,即:条件判断 和 break关键字,两种在使用时无好坏之分,只要能实现功能就行。
1.4 continue
continue,结束掉本次循环,不继续往下执行代码,开始下一次循环。
print("开始")
while True:
print("红旗飘飘,军号响。")
continue # 结束掉本次循环,循环体下方的代码不执行。
print("剑已出鞘,雷鸣电闪。")
print("从来都是狭路相逢勇者胜。")
print("结束")
# 输出
开始
红旗飘飘,军号响。
红旗飘飘,军号响。
红旗飘飘,军号响。
红旗飘飘,军号响。
...
示例1:
print("开始")
i = 1
while i < 101:
if i == 7:
i = i + 1
continue
print(i)
i = i + 1
print("结束")
# 输出
开始
1
2
3
4
5
6
8
9
10
...
100
结束
当i==7的时候,首先进行i = i + 1,然后执行代码continue,结束掉本次循环,后面的输出和自加不被执行了,就跳过了当前数。
示例2:
print("开始")
i = 1
while True:
if i == 7:
i = i + 1
continue
print(i)
i = i + 1
if i == 101:
break
print("结束")
# 输出
开始
1
2
3
4
5
6
8
9
10
...
100
结束
# 对break示例2的补充,打印1-100跳过数字7
写在最后,对于break和continue都是放在循环语句中用于控制循环过程的,一旦遇到break就停止所有循环,一旦遇到continue就停止本次循环,开始下次循环。
当然,通过如果没有了break和continue,我们用while条件的判断以及其他协助也能完成很多功能,有了break和continue可以在一定程度上简化我们的代码逻辑。
1.5 while else
当while后的条件不成立时,else中的代码就会执行。
while 条件:
代码
else:
代码
示例1:
num = 1
while num < 5:
print(num)
num = num + 1
else:
print(666)
# 输出
1
2
3
4
666
num在前四次判断循环时是满足num<5的,第五次不满足了,就执行else的内容。
示例2:
while True:
print(123)
break
else:
print(666)
# 输出
123
如果是break跳出的循环,则不执行else内容。
2.字符串格式化
字符串格式化,使用更便捷的形式实现字符串的拼接。
2.1 %
%
是python最古老的格式化方式。
2.2.1 基本格式化操作
name = 'kinght'
# %s为字符串占位符,代指后面的%name变量
# %d为整数占位符,代指后面的18
text = '我叫%s,今年%d岁'%(name,18)
print(text)
# 根据名称对应的占位符
print('%(name)s毕业于%(school)s'%{'name':'koko','school':'绝望学院'})
# 格式化模板
demo = "文件名叫:%s,文件大小:%dMB" # demo作为模板进行字符串拼接
demo1 = demo %('test',23)
demo2 = demo %('next',11)
print(demo1)
print(demo2)
占位符对应的类型(遇到查询即可)
- s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
- r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
- c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
- o,将整数转换成 八 进制表示,并将其格式化到指定位置
- x,将整数转换成十六进制表示,并将其格式化到指定位置
- d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
- e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
- E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
- f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
- F,同上
- g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
- G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
- %,当字符串中存在格式化标志时,需要用 %%表示一个百分号
2.2.1 百分比
在我们使用百分号占位符的时候会遇到一个问题就是,文本内容需要使用百分号,例如这个片已经下载了99%了,居然断网了
,假设我们要让99作为一个变量传入。
plan = 99
text = '这个片已经下载了%d%%了,居然断网了'%plan
print(text)
一旦字符串格式化中存现百分比的显示,请一定要呀加 %% 以实现输出 %。
2.2 format(推荐使用)
本方法是使用大括号来做占位符,后跟.format
进行拼接
# 序号对应大括号
text = '我叫{0},今年{1}岁,我{0}是废物'.format('kinght',18)
print(text)
# 无序号默认顺序对应大括号
text1 = '我叫{},今年{}岁,我{}是废物'.format('kinght',23,'kinght')
print(text1)
# 根据名称对应大括号
text3 = '我叫{name},今年{age}岁,我{name}是废物'.format(name='kinght',age=25)
print(text3)
# 格式化模板
demo = "文件名叫:{},文件大小:{}MB" # demo作为模板进行字符串拼接
demo1 = demo .format('test',23)
demo2 = demo .format('next',11)
print(demo1)
print(demo2)
2.3 f
python3.6版本更新的新格式化方式,只有python3.6及之后的版本才能使用。
f'{变量名}'
使用此方式可直接代入变量、数值、算式。
color = '蓝色'
print(f'我想开周少的{color}保时捷,他说开了{1+1}年,该淘汰了')
# 结果
我想开周少的蓝色保时捷,他说开了2年,该淘汰了
name = 'kinght'
print(f'我叫{name.upper()}')
# 结果
我叫KINGHT
# 进制转换
print(f'周少车库有{500}辆车') # 十进制
print(f'周少车库有{500:#b}辆车') # 二进制
print(f'周少车库有{500:#o}辆车') # 八进制
print(f'周少车库有{500:#x}辆车') # 十六进制
# 在python3.8中有引入了
print(f'易少说她老婆比他小{23-18=}岁')
# 结果
易少说她老婆比他小23-18=5岁
3.运算符
我们接触最多的运算符就是加减乘除,但在编程中,还有更多的运算符,我们分为五类
3.1 运算符
3.1.1 算数运算符 - 例如:加减乘除
print( 9//2 )
3.1.2 比较运算符 - 例如:大于小于
注意:python3中不支持<>
if 1 >2:
pass
while 1>2:
pass
data = 1 == 2
3.1.3 赋值运算符 - 例如:变量赋值
num = 1
while num < 100:
print(num)
# num = num + 1
num += 1
3.1.4 成员运算符 - 例如:包含
v1 = "le" in "alex" # True/False
# 让用户输入一段文本,检测文本中是否包含敏感词。
text = input("请输入内容:")
if "玩偶姐姐" in text:
print("少儿不宜")
else:
print(text)
'i' in 'kinght' # 判断i在没在kinght里,如果在返回True,不在返回False
3.1.5 逻辑运算符 - 例如:且或非
if username == "alex" and pwd == "123":
pass
data = 1 > 2
if not data:
pass
3.2 运算符优先级
运算符的优先级非常多,但不需要都背下来,记住规律即可:
-
算数优先级优先级 大于 比较运算符
if 2 + 10 > 11: print("真") else: print("假")
-
比较运算符优先级 大于 逻辑运算符
if 1>2 and 2<10: print("成立") else: print("不成立")
-
逻辑运算符内部三个优先级 not > and > or
if not 1 and 1>2 or 3 == 8: print("真") else: print("假")
上述这3个优先级从高到低总结:加减乘除 > 比较 > not and or
。绝招:加括号。
示例1:
v2 = "wupeiqi" and "alex"
# 第一步:将and前后的只转换为布尔值 True and True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于后面的值。
# 所以,后面的只等于多少最终结果就是多少。 v2 = "alex"
v3 = "" and "alex"
# 第一步:将and前后的只转换为布尔值 False and True
# 第二步:判断本次操作取悦于谁?由于前面的是False,所以本次逻辑判断取决于前面的值。
# 所以,前面的只等于多少最终结果就是多少。 v2 = ""
v4 = 1 or 8
# 第一步:将and前后的只转换为布尔值 True or True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于前面的值。
# v4 = 1
v5 = 0 or 8
# 第一步:将and前后的只转换为布尔值 False or True
# 第二步:判断本次操作取悦于谁?由于前面的是False,所以本次逻辑判断取决于后面的值。
# v5 = 8
示例2:
如果多个and 和or的情况,先计算and再计算or.
v1 = 0 or 4 and 3 or 7 or 9 and 6
0 or 3 or 7 or 9 and 6
0 or 3 or 7 or 6
3 or 7 or 6
3 or 6
3
v2 = 8 or 3 and 4 or 2 and 0 or 9 and 7
8 or 4 or 0 or 7
8 or 0 or 7
8 or 7
8
v3 = 0 or 2 and 3 and 4 or 6 and 0 or 3
4
先计算not,在计算and,最后计算or
v4 = not 8 or 3 and 4 or 2
4
4 两个特殊的运算符
4.1 is比较
is
也是进行比较的运算符,那么is
和 ==
的区别是什么?
==
,用于比较两个值是否相等。- is,用于表示内存地址是否一致。
# 示例1
v1 = []
v2 = []
print( v1 == v2 ) # True,两个值相当
print( v1 is v2 ) # False,不属于同一块内存。
# 示例2
v1 = []
v2 = v1
print( v1 == v2 ) # True,两个值相当
print( v1 is v2 ) # True,属于同一块内存。
# 示例3
v1 = None
v2 = None
# 证明None节省内存空间
print(v1 == v2) # True,两个值相当
print(v1 is v2) # True,属于同一块内存。
4.2 位运算
计算机底层本质上都是二进制,我们平时在计算机中做的很多操作底层都会转换为二进制的操作,位运算就是对二进制的操作。
-
&
,与(都为1)a = 60 # 60 = 0011 1100 b = 13 # 13 = 0000 1101 c = a & b # 12 = 0000 1100
-
|
,或(只要有一个为1)a = 60 # 60 = 0011 1100 b = 13 # 13 = 0000 1101 c = a | b # 61 = 0011 1101
-
^
,异或(值不同即为1)a = 60 # 60 = 0011 1100 b = 13 # 13 = 0000 1101 c = a ^ b # 49 = 0011 0001
-
~
,取反,0的改成1,1的改成0a = 60 # 60 = 0011 1100 c = ~a; # -61 = 1100 0011
-
<<
,左移动,位的二进制向左移动a = 60 # 60 = 0011 1100 c = a << 2; # 240 = 1111 0000
-
>>
,右移动,位的二进制向右移动,多余部分会丢弃a = 60 # 60 = 0011 1101 c = a >> 2; # 15 = 0000 1111
平时在开发中,二进制的位运算几乎很好少使用,在计算机底层 或 网络协议底层用的会比较多,例如:
-
位运算计算 2**n
2**0 1 << 0 1 1 2**1 1 << 1 10 2 2**2 1 << 2 100 4 2**3 1 << 3 1000 8 ...
-
计算一个数的一半
v1 = 10 >> 1 # 1010 -> 101 print(v1) # 值为5 v2 = 20 >> 1 print(v2) # 值为 10
-
网络传输数据,文件太大还未传完(websocket源码为例)。
第1个字节 第2个字节 ... 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + FIN位置是0,表示这是一部分数据,后续还有数据。 FIN位置是1,表示这是最后数据,已发送完毕。
# 例如:接收到的第一个字节的值为245(11110101),让v的二进制和 1000 0000 做 & 与运算。 v = 245 # 245 11110101 # 128 10000000 10000000 data = v & 128 # 128 =》 10000000 做与运算 及判断 第一个数是否为1,都为1才会是1 if data == 0: print("还有数据") else: print("已完毕")