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 算数运算符 - 例如:加减乘除

image-20201011165419956

print( 9//2 )

3.1.2 比较运算符 - 例如:大于小于

image-20201011165434014

注意:python3中不支持<>

if 1 >2:
  pass
while 1>2:
  pass

data = 1 == 2

3.1.3 赋值运算符 - 例如:变量赋值

image-20201011165501909

num = 1
while num < 100:
  print(num)
  # num = num + 1
  num += 1

3.1.4 成员运算符 - 例如:包含

image-20201011165515812

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 逻辑运算符 - 例如:且或非

image-20201011165530169

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的改成0

    a = 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("已完毕")
    

Python开发-003_Python基础
http://localhost:8080/archives/evuKUbQr
作者
kinght
发布于
2024年11月11日
更新于
2024年11月11日
许可协议