一、编码问题
1、字符集
定义:对字符的集合,字符的集合是用来映射存储字符的,将字符映射在二进制中存储。
2、常见的几种字符集
1)ASCII编码
8个数据位:对应127个字母、数字、符号
可用如下方式查询对应的ASCII编码:
print(ord("a"))
print(bin(ord("a")))
输出:
97
0b1100001
其中0b1100001是存储在计算机中对应字母a的ASCII编码。
2)GB2312编码
由中国开发的针对汉字等文字的编码集 两个字节16个数据
3)unicode编码
unicode将所有语言都统一到一套编码集,通常使用两个字节16位,有的是4个字节。
unicode编码是定长存储,会比较浪费空间
4)utf-8编码
英文字符使用1个字节,沿用原来的ASCII编码
中文存储使用3个字节
uft-8是变长存储
在python中,字节采用的是ASCII编码集,字符采用的是unicode编码集
a = "中"
#b = b"中" 无法执行,会报错
3、unicode和utf-8编码之间的关系
1)获得汉字的unicode编码
print(hex(ord("华")))
输出:
0x534e
如何进行验证0x534e就是“华”的unicode的编码?
需要注意的一点是unicode编码是十六进制,且格式为\u…
具体如下:
print("\u534e")
输出结果为:
华
将unicode编码转化成二进制可得:
print(bin(0x534e))
输出:
0b101001101001110
2)获得汉字的utf-8编码
a = "华"
print(a.encode("utf-8"))
输出为:
b’\xe5\x8d\x8e’
同时也验证utf-8中的汉字是3个字节(如:’\xe5\x8d\x8e’),而unicode中汉字存储是2个字节(如:0x534e)
将输出转换为二进制可得到:
print(bin(0xe5),bin(0x8d),bin(0x8d))
输出:
0b11100101 0b10001101 0b10001101
3)unicode码实际上可以看成utf-8编码的一部分,大量支持unicode码的历史软件仍然可以在utf-8下使用。
4、unicode和utf-8在计算机中的工作方式
(1)计算机内存中统一使用unicode编码,当需要保存到硬盘或者传输时会转化成utf-8编码;
(2)浏览网页时服务器也是把动态生成的unicode编码转化成utf-8编码模式传输到浏览器。
5、字节和字符之间的转换
字节转换成字符:解码 decode
字符转化成字节:编码 encode
例如:
s = "溪云阁"
print(s.encode("utf-8"))
print(s.encode("gbk"))
输出:
b’\xe6\xba\xaa\xe4\xba\x91\xe9\x98\x81’
b’\xcf\xaa\xd4\xc6\xb8\xf3’
解码:
s = "溪云阁"
a = s.encode()
print(a.decode())
输出:
溪云阁
二、格式化详解
python中有两种格式化的方法:一种是采用%进行格式化,另外一种是采用format方法
1、%方法介绍
%s---------------相当于str(o)
%d---------------带符号的十进制整数
%f----------------浮点数,可以指定保留设置的小数位
%r----------------相当于repr(o)
print("abs%s"%1)
print("abs"+str(1))
这两种方式输出均为abs1,%s相当于是调用str方法
2、%方法使用
1)简单使用
print("%s+%s=%s"%(1,2,3))
输出:
1+2=3
2)方法扩展
a) %ns:表示总共n个占位符,且右对齐,如果n小于需求长度,正常输出,如果n大于需求长度,剩下的用空格填充,如下所示:
print("%20s"%12345)
print("%3s"%12345)
输出如下:
12345
12345
b)%-ns:表示左对齐,其他使用规则如上一致,如:
print("%-20s"%12345)
print("%-3s"%12345)
print("%-20s"%12345,end="end")
print("%-3s"%12345,end="end")
输出:
12345
12345
12345 end12345end
可以看出采用%-20s"%12345
输出时12345后面是有空格的
c)%.ns表示截取几位,当n大于字符长度时,不会留空格,如下:
print("%.5s" % "hello world")
print("%.20s" % "hello world",end="|||")
输出:
hello
hello world|||
d)%m.ns:m表示总的占位符,n表示截取的数量,m正数时表示右对齐,反之左对齐
print("%20.5s" % "hello world")
print("%-20.5s" % "hello world",end="|||")
输出为:
hello
hello |||
当m小于n时,以n的数据为准,且都是左对齐
print("%3.5s" % "hello world")
print("%3.15s" % "hello world")
print("%-3.15s" % "hello world",end="|||")
输出:
hello
hello world
hello world|||
3)%f格式化浮点数
a)%m.nf,m是总的占位符,n是保留的小数,当m小于n时,以n为准,且保留小数是四舍五入的。
print("%0.0f"%3.1415926)
print("%0.f"%3.1415926)
print("%.0f"%3.1415926)
输出:
均为3
以上三种写法结果一样,n为0时只取整数部分
print("%20.2f"%13.1415926)
print("%1.20f"%13.1415926)
输出:
13.14
13.14159259999999918023
整数部分的占位符,会默认用空格表示
b)可以指定是否用0进行填充,如下:
print("%020.2f"%13.1415926)
输出:
00000000000000013.14
3、format方法
格式为:{[参数/索引]:[对齐方式][占位数].[保留位数][s/f等格式(可省略)]}.format(要替换的值)
基础使用如下:
print("{}+{}={}".format(1,2,3))
print("{}+{}={}".format(2,1,3))
print("{x}+{y}={z}".format(x=1,y=2,z=3))
输出:
1+2=3
2+1=3
1+2=3
b)对于字符串而言,s可以省略,且默认对齐方式为<左对齐
左对齐<,居中^,右对齐>
print("{:<10} {:>10}".format("happy","everyday"))
输出如下:
happy everyday
数字表示占位符
c)浮点数f的使用
print("{} {:0.2f}".format(3.1415,3.1415))
输出:
3.1415 3.14
小数点后的参数表示保留的有效位数
d)混合使用
索引:对齐方式m.nf >>>m表示占位符,m<n时无效,n表示保留的有效位数,采用四舍五入的方法
print("{1} {0:>10.2f}".format(1.1415,2.1415))
输出:
2.1415 1.14
三、 程序执行的过程:
1、程序执行的过程
顺序:按部就班
选择:二选一、多选一
循环:重复
需注意python的格式为:
缩进:决定当前代码的层次,同一层次的语句必须有相同的缩进,通常使用tab键代表一个层次
2、选择(if)
a)格式如下:
if 布尔条件:
布尔条件返回True会执行的代码
elif 布尔条件:
布尔条件返回True会执行的代码
else:
以上布尔条件返回False会执行的代码
elif可根据实际情况来选择是否存在
elif 当满足一次条件,下面的判断不再执行
a = 101
if a>100:
print("大于100的数")
else:
print("小于等于100的数")
输出:
大于100的数
a = 90
if a>=90:
print("优")
elif a>=70:
print("良")
elif a>=60:
print("及格")
else:
print("不及格")
输出:
优
需要注意的点是:
1) if后面是条件,可以单独存在
2)else后面没有条件,不能单独存在
3)elif后面有条件,也不能单独存在
4)当有多个elif的时候只执行一次,尽量将判断按照从大到小,或者从小打到顺序判断
如果没有顺序,需要使用链式比较
5)如果有多个if,要把发生概率大的放在前面
例子:根据今天是星期几(1-7),输入星期几,输出要做的事情,周一----周五:上课 周六:自习 周天:休息
day = int(input("请输入今天星期几:"))
if day<=0 or day>7:
print("输入错误,范围不在1~7!")
else:
if day<=5:
print("上课")
else:
if day == 6:
print("自习")
else:
print("休息")
b)相关类型的bool值说明
c)三元表达式
格式如下:
True执行 if 条件 else False执行
具体如下:
a = 90
print("优") if a>=90 else print("需继续努力")
输出:
优
d)断言
判断某些语句是否正确
格式为:assert 表达式 ,[错误信息]
运用如下:
assert 1<0 ,"1<0错误"
print("继续")
报错:
assert 1<0 ,“1<0错误”
AssertionError: 1<0错误
assert 1>0 ,"1<0错误"
print("继续")
输出:
继续
主要用来调试程序时用
3、循环
a)while循环体
格式为:
while 布尔条件:
循环体
一般运用于:1.有明确的循环条件,特别以次数为条件 2. 永远为真
如:求1到100内所有数字之和
s = 0
n = 1
while n<=100:
s+=n
n+=1
print(s)
输出:
5050
b)for循环
格式为:
for 每一个变量名字 in 迭代体:
循环的程序
如:
s = 0
for i in range(1,101):
s+=i
print(s)
c)for循环的嵌套
如:打印九九乘法表
for i in range(1,10):
for j in range(1,i+1):
print("{}*{}={}".format(j,i,j*i),end=" ")
print()
输出:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
d)跳出循环
- break 跳出当前循环
2)continue 跳出循环后继续执行下一次循环
用法如下:
for i in range(100):
if i ==10:
print("找到了10")
break
print("程序结束")
输出:
找到了10
程序结束
for i in range(5):
if i ==2:
print("找到了2")
continue
print("继续执行")
print("程序结束")
输出:
继续执行
继续执行
找到了2
继续执行
继续执行
程序结束
e)在循环后使用else
else:在循环迭代正常完成之后执行的代码段
当for循环、while循环异常结束(break),就不执行else
如:
以下循环始终没有执行break语句
for i in range(5):
if i ==8:
print("找到了8")
break
else:
print("没找到2")
输出:
没找到2
如果执行了break语句,就不会执行else的执行体
如:
for i in range(5):
if i ==2:
print("找到了2")
break
else:
print("没找到2")
输出:
找到了2