VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • python02-字符编码、字符串格式化、进制转化、数据类型、列表、元组、字典总结

.字符编码:

计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号

ascii用1个字节代表一个字符;

unicode常用2个字节代表一个字符,生僻字需要用4个字节;

UTF-8英文字母被编码成1个字节,汉字通常是3个字节有很生僻的字符才会被编码成4-6个字节。

例:

字母x,用ascii表示是十进制的120,二进制0111 1000

汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。

字母x,用unicode表示二进制0000 0000 0111 1000,所以unicode兼容ascii,也兼容万国,是世界的标准

这时候乱码问题消失了,所有的文档我们都使用但是新问题出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效

本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

字符

Ascll

Unicode

Utf-8

x

01000001

00000000 01000001

01000001

不能表示

01001110 00101101

11100100 10111000 10101101

从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

ASCII:只能存英文和拉丁字符,一个字符占一个字节,8位

gb2312:只能存6700多个中文,1980年

gbk1.0:存2万多字符,1995年

gb18030:存27000中文,2000年

万国码:Unicode:utf-32  一个字符占4个字节

                 Utf-16  一个字符占2个字节,或两个以上。

                 Utf-8   一个英文用ASCII码来存,一个中文占3个字节

声明编码  -*- coding:utf-8 -*-

gbk默认不认识utf-8,utf-8是Unicode的一个子集

Unicode 默认向下兼容gbk等

python3内部默认是 unicode,文件默认编码是utf-8

阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII

ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符

ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符),后来为了将拉丁文也编码进了ASCII表,将最高位也占用了

阶段二:为了满足中文和英文,中国人定制了GBK

GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符

为了满足其他国家,各个国家纷纷定制了自己的编码

日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里

阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。如何解决这个问题呢???

说白了乱码问题的本质就是不统一,如果我们能统一全世界,规定全世界只能使用一种文字符号,然后统一使用一种编码,那么乱码问题将不复存在,

很多地方或老的系统、应用软件仍会采用各种各样的编码,这是历史遗留问题。于是我们必须找出一种解决方案或者说编码方案,需要同时满足:

1、能够兼容万国字符

2、与全世界所有的字符编码都有映射关系,这样就可以转换成任意国家的字符编码

这就是unicode(定长), 统一用2Bytes代表一个字符, 虽然2**16-1=65535,但unicode却可以存放100w+个字符,因为unicode存放了与其他编码的映射关系,准确地说unicode并不是一种严格意义上的字符编码表

很明显对于通篇都是英文的文本来说,unicode的式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)

阶段四:于是产生了UTF-8(可变长,全称Unicode Transformation Format),对英文字符只用1Bytes表示,对中文字符用3Bytes,对其他生僻字用更多的Bytes去存。

. Python 字符串格式化

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

格式输出汇总:

复制代码
 1 #第一种
 2 val = "我叫%s,今年%d岁,身高%d"%('zrh',20,175)
 3 print(val)   #运行结果:我叫zrh,今年20岁,身高175
 4 #第二种
 5 val = "我叫{0},今年{1}岁,身高{2},我弟弟身高也是{2}"
 6 val1 = val.format("zrh",20,175)
 7 print(val1) #运行结果:我叫zrh,今年20岁,身高175,我弟弟身高也是175
 8 #第三种
 9 v = input("your name:") #用户输入姓名
10 val = "我叫{name},今年{age}岁,身高{height}"
11 val1 = val.format(name=v,age="20",height="175") #name = v是用户输入的那个姓名
12 print(val1)
13 #第四种
14 val = "我叫{name},今年{age}岁"
15 dic1 = {"name":"zrh","age":20}
16 val1 = val.format(**dic1)
17 print(val1)
18 #第五种
19 name = "我叫{name},年龄{age}"
20 val = name.format_map({'name':'海角','age':18})   #只有一种写法,里面必须是字典
21 print(val)
复制代码

如果在格式化输出中想要输出%号,就要用到%%格式

例如:

print("我是%s,我的进度已经完成80%%" %('zrh'))

输出结果:

我是zrh,我的进度已经完成80%

.进制转换

进制也就是进制位,我们常用的进制包括:二进制、八进制、十进制与十六进制,它们之间区别在于数运算时是逢几进一位。比如二进制是逢2进一位,十进制也就是我们常用的0-9是逢10进一位,16进制的10-15用A、B、C、D、E、F来表示。

1. 十进制转二进制

方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。

2. 二进制转十进制

方法为:把二进制数按权展开、相加即得十进制数。

第一个的1*2的7次方,是因为数位就是8位,8-1=7,依此类推。

数据类型

Python有五个标准的数据类型:

Numbers(数字) V = 1 int类

Boolean value(布尔值) V = True (bool类)

String(字符串) V = “Good” (str类)

List(列表) V = [“good”,”best”] (list类)

Tuple(元组) V = (“good”,”best”) (tuple类)

Dictionary(字典) V = {“name”:”zrh”,”age”:20} (dict类)

1.int类(记住一个)

bit_length()表示当前十进制数用二进制数表示时,最少使用的位数。

代码示例:

count = 16
v = count.bit_length()
print(v,"---",count)

输出结果:

5 --- 16

注意:

复制代码
 1 count = "1"
 2 count1 = "2"
 3 print(count+count1)  #输出结果:12    字符串的加法是拼接的作用
 4 count2 = 1
 5 count3 = 2
 6 print(count2+count3)  #输出结果:3   数字的加法是加法作用
 7 #需求,输入一个数字,然后每个数字相加,列入输入152,结果就是1+5+2
 8 count4 = "152"  #在数字和字符串中只有字符串才可以遍历,所以要把count4转为str类型
 9 val = 0
10 for i in range(len(count4)):    
11     val += int(count4[i])   #count4[i]是字符串,所以要转为数字才能相加
12 print(val) 
复制代码

浮点数:

2.str类

对于字符串,执行内置命令后,原来的值不变。

2.1:upper()转换字符串中的小写字母为大写

代码示例:

name = "zrh"
v = name.upper()
print(v,"---",name)

输出结果:

ZRH --- zrh

2.2:lower()转换字符串中所有大写字符为小写

代码示例:

name = "ZrH"
v = name.lower()
print(v,"---",name)

输出结果:

zrh --- ZrH

2.3:capitalize()将字符串的第一个字符转换为大写

代码示例:

name = "zrh"
v = name.capitalize()
print(v,"---",name)

输出结果:

Zrh --- zrh

2.4:strip()去除首尾的内容 空格、换行符、制表符、指定内容

代码示例:

name = " zrh "
v = name.strip()
print(v+"---",name)

输出结果:

zrh---  zrh

1 name_1 = "\tzrh\t"
2 print(name_1)
3 print(name_1.strip())

输出结果:

    zrh

zrh

1 name_1 = "zrh"
2 print(name_1)
3 print(name_1.strip("h"))

输出结果:

zrh
zr

2.5:lstrip()截掉字符串左边的空格或指定字符

2.6:rstrip()删除字符串字符串末尾的空格

2.7:replace(str1, str2 , max)将字符串中的 str1 替换成 str2,如果max指定,则替换不超过max次

代码示例:

content = "人生自古谁无死,早死晚死都得死"
v = content.replace("","*",2)
print(v,"---",content)

输出结果:

人生自古谁无*,早*晚死都得死 --- 人生自古谁无死,早死晚死都得死

2.8: len(string)返回字符串长度

代码示例:

content = "人生自古谁无死,早死晚死都得死"
v = len(content)
print(v)

输出结果:

15

2.9:[]根据索引取值

代码示例:

复制代码
#索引值从0开始计算不是从1
content = "人生自古谁无死,早死晚死都得死"
v = content[0]       #取字符串的第一个字符
v1 = content[-1]     #-代表从后往前找,1代表第一个,所以-1代表正向的最后一个
v2 = content[0:5]    #从0开始取到索引值为4的对象,不包括索引值为5的对象,相当于数学中的左闭右开区间
v3 = content[8:]     #从索引值为8的对象开始取到最后一个
v4 = content[0:15:2]  #从0开始隔一个取一个,一直取到14,2表步长表示隔一个取一个,3就表示隔2个
print(v,v1,v2,v3,v4)
复制代码

输出结果:

人 死 人生自古谁 早死晚死都得死 人自谁死早晚都死

2.10 :split(“str”,num)  ()里没有参数的话,默认是空格

以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串

代码示例:

content = "人生自古谁无死,早死晚死都得死"
v = content.split("",2)
print(v)

输出结果:

['人生自古谁无', ',早', '晚死都得死']

2.11 :.isdecimal()判断当前字符串中是否全部都是数字

代码示例:

v = "a123"
c = v.isdecimal()
print(c)

输出结果:

False

补充:

python中isdigit()、isdecimal()和isnumeric的区别  

a = "good 1 night 2"
a.isdecimal()    #如果a中只有十进制字符,则返回True,否则为False
a.isdigit()      #如果a中的所有字符都是数字,并且在S中至少有一个字符,则返回True
a.isnumeric()    #如果a中只有数字字符,则返回True,否则为False

 

2.12 :join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

seq里的元素必须是字符串,不能是数字,数字和字符串(前面的“_”)不能相加,

代码示例:

list1 = ['alex','zrh','sdv']
a = '_'.join(list1)             #这里的_就表示用_连接
b = "".join(list1)              #""里什么都没有表示直接连接
print(a)
print(b)

输出结果:

alex_zrh_sdv

alexzrhsdv

2.13:把字符串转换成字节encode()

name = "天下"
name.encode("utf-8")   #把字符串(Unicode)转换成字节(utf-8格式)
name.encode("gbk")     #把字符串(Unicode)转换成字节(gbk格式)

 2.14:count() 

count() 方法用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。

1 name = "ooxxooxxooxx"
2 print(name.count("o"))
3 #有两个参数,不写默认为print(name.count("o",0,len(name)))
4 #0表示条件统计起始索引值,len(name)表示终止索引值

2.15:expandtabs() 方法把字符串中的 ('\t')转为空格,('\t')默认的空格数是 8

\t 表示横向制表符  \n表示换行符

1 name = "ID\tname\tpasswd\n1\tzrh1\t123\n2\tzrh2\t123"
2 val = name.expandtabs(20)   #20表示连同\t前面的内容一共占20个字符的位置
3 print(val)

输出结果:

2.16其他不常用的方法汇总:

五.格式转换

1.数字转字符串 str(对象)

2.字符串转数字 int(对象)

对象必须是形为数字,才能转换

Int(string)就会报错

3.数字转布尔值 bool(对象)

bool(0)是False

其他不是0的数都是True

但是在其他方面true = 1 flase = 0

4.字符串转布尔值 bool(对象)

bool(“”)是False

其他任何字符串都是True

注意:

代码示例:

a = 9 or 2>3
print(a)

输出结果:

9

代码示例:

a = 0 or 2>3
print(a)

输出结果:

False

代码示例:

a = 0 or 6
print(a)

输出结果:

6

代码示例:

a = 0 or 2<3
print(a)

输出结果:

True

5.元组转列表

v = (1,2,3)
val = list(v)

6.列表转元组

v = [1,2,3]
val = tuple(v)

7.列表转字符串

v = ["1","2","3"]
result = "".join(v)
print(result)

六.列表

列表是Python中最基本的数据结构。列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。

如下所示:

list = ["one","two",3,4,"five"]

列表可以进行 增、删、改、查。如果列表只有一个对象,在后面也要加上,

列表中的元素可以是 数字、字符串、布尔值、列表(列表的嵌套)

复制列表:

a = [1,2,3]
b = a[:]      #[:]是复制列表
print(a,b)     

1.查 切片:

list[1:]      #从1开始取到最后 
list[1:-1]    #从1开始取到倒数第二值
list[1:-1:1]   #从左到右一个一个去取,取到倒数第二值
list[1::2]     #左到右隔一个去取
list[3::-1]     #从3开始从右到左一个一个取,注意索引值不变

2.增  添加:

2.1:append()

append(“str”)将数据插到最后一个位置

代码示例:

list = ["one","two",3,4,"five"]
list.append("six")
print(list)

输出结果:

['one', 'two', 3, 4, 'five', 'six']

append()注意事项:

1 list1 = [11,22,33]
2 val = list1.append(44)
3 print(val)
4 #这里返回的是None,对于列表来说,执行方法之后改变的是原来的值,变量接收不到

 

2.2:insert()

根据索引值位置将数据插入到任意一个位置

代码示例:

list = ["one","two",3,4,"five"]
list.insert(2,"two2")     #想把新对象插在什么位置就输入相应的索引值
print(list)

输出结果:

['one', 'two', 'two2', 3, 4, 'five']


相关教程