江湖道

庙堂,江湖,学术!

返回顶部

python字符编码与数据类型

1变量

1.1 变量类型

变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。

基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。

因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。

1.2 变量赋值

Python中的变量赋值不需要类型声明。

每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。

每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。

等号(=)用来给变量赋值。

等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu

name = 'anliu jiang'
age = 18
salary = 0.001
print(name,age,salary)

1.3 多个变量赋值

Python允许你同时为多个变量赋值。例如:

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
a = b = c = 1
print(a)
print(b)
print(c)
print(a,b,c)

以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。

您也可以为多个对象指定多个变量。例如:

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
a,b,c,= 1,3.1415,"john"
print(a,b,c)

以上实例,两个整型对象 1 和 2 分别分配给变量 a 和 b,字符串对象 "john" 分配给变量 c。

1.4 变量的赋值

思考:一下程序输出结果是什么?

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
name1 = "anttech"
name2 = name1
print(name1,name2)
name2 = "thinking"
print(name1,name2)

1.5 定义变量的规则

变量名只能是字母,数字或下划线的组合

变量名的第一个字符不能是数字

关键字不能声明为变量:

1584632132621

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu

tingtingceshi =
DMDB_OF_dir =
cmdb_of_dir=
CmdbOfDir =

注意:在python中是没有常量的概念。在C中const定义常量。

在Python中表示常量用大写的变量名表示(只是人为规定)

1.6 字符串操作

#Author:Anliu
name = "{name} is a boy,\the likes {yunwei}"
print(name)
print(name.count("l")) #统计字母个数
print(name.capitalize()) #将字符串首字母大写
print(name.center(50,"-")) #将字符串格式化居中输出
print(name.encode(encoding="utf-8")) #将字符串编码
print(name.endswith("x")) #判断字符串结尾字符
print(name.expandtabs(tabsize=10)) #将tab转换为空格
print(name.format(name="anliu",yunwei="linux")) #格式化输出
print(name.find("n"))  #获取索引
print(name.format_map({"name":"anliu","yunwei":"linux"}))  #字典的方式格式输出
print(name.index("a")) #获取索引
print("123".isdigit()) #判断字符串是否为数字
print("wq123q".isalnum()) #判断字符串是否为数字字母组合
print("wql".isalpha()) #判断字符串是否为字母
print("111".isdecimal())  #判断字符串是否为十进制
print(name.isidentifier()) #判断是否为合法的标识符
print("abc".islower()) #判断是否为小写字母
print("123".isdigit()) #判断是否为数字
print("123".isprintable()) #判断字符串是否可打印,tty File OR driver File
print(" ".isspace()) #判断是否为空格
print("15000 International Students Are Living In A Dilemma".istitle()) #是否为标题
print("ABC".isupper()) #是否大写
print("SBA".lower()) #转换为小写
print("   ABC".lstrip())
print("ABC     ".rstrip())
print("   ABC   ".strip())
print("abc".ljust(10,"+"))
print("abc".rjust(10,"+"))
p = str.maketrans("anliua","123456")
print("anliu".translate(p))
print("anliu".partition("l")) #分割成元组
print("anliu".replace("a","A"))  #替代
print("anliu".split("l")) #分割成列表
print("1+1+1+1".split("+"))
print("anliu\nis \na \nboy".splitlines()) #按换行返回列表
print("www.baidu.com".startswith("www")) #判断以某前缀开始
print("This is a web addr:www.baidu.com".startswith("www",19))
print("abc".zfill(50))


2 字符编码

2.1 python程序中的字符编码

python解释器在加载.py文件中的代码时,会对内容进行编码(默认ascill)

在python2以及python3.6下执行一下代码:

[root@bogon test]# cat hw.py

#/usr/bin/python2
print ("您好,世界!!!")
[root@bogon test]# python2 hw.py 
File "hw.py", line 2 SyntaxError: Non-ASCII character '\xe6' in file hw.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

在python3.6上运行

1562577876395

在python3.7版本下运行改代码:

1562575164785

在pyhon2以及python3.6上再次执行如下代码:

[root@bogon test]# cat hw.py
#/usr/bin/python3
#-*-coding:utf-8 -*-
print("您好,世界!!!")

1562575420972

Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。

解决方法为只要在文件开头加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了

1562577063169

就是说,在python7上Cpython强制使用utf-8编码。

所以如果大家在学习过程中,代码中包含中文,就需要在头部指定编码。

**注意:**Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。
**注意:**如果你使用编辑器,同时需要设置 py 文件存储的格式为 UTF-8,否则会出现类似以下错误信息:

1562578880465

2.2 字符编码介绍

ASCII,美国标准信息交换代码是基于拉丁字母的一套电脑编码系统,主要用于显示现在英语和其他西欧语言,其最多只能用8位来表示(一个字节),即:2**8=256-1,所以呢,ASCII码最多只能表示255个字符。

image

有128-255个字符的扩展。

为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体的big5.
7445个汉字扩展存储——JB2312(1980年)
1995年汉字的扩展规模达到21886个符号,分别是汉字区和图形符号区,产生了GBK1.0。
2000年的GB18030取代了GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文,蒙文,维吾尔文等重要的少数民族文字。
从ASCII、GB2312、GBK到GB18030,这些编码是向下兼容的。

显然ASCII码是无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即Unicode。

Unicode(统一码,万国码,单一码)是一种在计算机上使用的字符编码,Unicode是为了解决传统的字符编码方案的局限性而产生的,他为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定所有的字符和符号最少由16位来表示(2个字节)。

UTF-8,是对Unicode编码的压缩和优化,他不在是最少使用2个字节了,而是将所有的字符和符号进行分类:ASCII码中的内容用1个字节保存,欧洲的字符用2个字节保存,东亚的字符用3个字节保存。

故而有了我们上面2.1节描述的问题。

2.3 字符编码与解码

在Python 3里将文本和二进制数据做了更为清晰的区分。文本总是Unicode,有str类型表示,二进制数据则由byte类型表示。Python 3不会以任意隐式的方式混用str和bytes。我们不同拼接字符串与字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。

这就也要我们了解如何将字节码转换成字符串,如何将字符串转换为字节码。

1585060167(1)

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#AUTHOR: Carve
msg = "我们都是好孩子"
print(msg)
print(msg.encode(encoding="utf-8"))
print(msg.encode(encoding="utf-8").decode(encoding="utf-8"))

image

3 数据类型

3.1 数值型

例如我么要开发一个游戏,我们经常需要使用数字记录游戏中用户的得分、游戏中角色的生命值、伤害值等信息,Python 语言提供了数值类型用于保存这些数值。

Python 中这些数值类型都是不可改变的,如果我们要修改数字类型变量的值,那么其底层实现的过程是,先将新值存放到内存中,然后修改变量让其指向新的内存地址,换句话说,Python 中修改数值类型变量的值,其实只是修改变量名所表示的内存空间。

数值类型只是一个泛泛的统称,Python 中的数值类型主要包括整形、浮点型和复数类型。

3.1.1 整型(int)

在常规语言中:

在32位机器上,整数的位数为32位,取值范围-2**32~2**32-1。
在64位机器上,整数的位数为64位。取值范围-2**64~2**64-1。

整形专门用来表示整数,即没有小数部分的数。在 Python 中,整数包括正整数、0 和负整数。

和其他强类型语言不同,它们会提供多种整形类型,开发者要根据数值的大小,分别用不同的整形类型存储,以 C 语言为例,根据数值的大小,开发者要合理选择 short、int、long 整形类型存储,大大增加了开发难度。

Python 则不同,它的整型支持存储各种整数值,无论多大或者多小,Python 都能轻松处理(当所用数值超过计算机自身的计算功能时,Python 会自动转用高精度计算)。

#!/bin/evn python
#Author:Anliu
a = 56
print(a)
a=999999999999999999999999999999
print(a)
print(type(a))

3.1.2 浮点型

浮点型数值用于保存带小数点的数值,Python 的浮点数有两种表示形式:

- 十进制形式:这种形式就是平常简单的浮点数,例如 5.12、512.0、0.512。浮点数必须包含一个小数点,否则会被当成整数类型处理。
- 科学计数形式:例如 5.12e2(即 5.12×10^2)、5.12E2(也是 5.12 ×10^2)。

必须指出的是,只有浮点型数值才可以使用科学计数形式表示。例如 51200 是一个整型值,但 512E2 则是浮点型值。

#!/bin/evn python
#Author:Anliu
af1 = 3.14159265
print(af1)
af2 = 3.14
print(type(af2))
f1 = 5.12e2
print(f1)
f2 = 5e3
print(f2)
print(type(f2))

3.1.3 复数

复数是由实数部分和虚数部分组成,一般的形式为x+yj,其中的X 是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。

3.2 布尔值

真或者假

1或者0

#/usr/bin/python3
#-*- coding:utf-8 -*-
#author: Carve
a = 1
if a :
    print("good")
else:
    print("bad")

3.3字符串

字符串就是一系列数字,在python中,用引号引起来的都是字符串,其中的引号可以是单引号,也可以是双引号

符串或串(String)是由数字、字母、下划线组成的一串字符。

一般记为 : s="a1a2···an"(n>=0)

它是编程语言中表示文本的数据类型。

python的字串列表有2种取值顺序:

从左到右索引默认0开始的,最大范围是字符串长度少1
从右到左索引默认-1开始的,最大范围是字符串开头

如果你要实现从字符串中获取一段子字符串的话,可以使用 [头下标:尾下标] 来截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。

[头下标:尾下标] 获取的子字符串包含头下标的字符,但不包含尾下标的字符。

a = "womendoushihaohaizi"
a[:5]
'women'
a[5:]
'doushihaohaizi'
a[5:10]
'doush'
#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
str = 'Hello World'
print(str)
print(str[0])
print(str[2:5])
print(str[2:])
print(str * 2)
print(str + "TEST")

加号(+)是字符串连接运算符,星号(*)是重复操作。

Python 列表截取可以接收第三个参数,参数作用是截取的步长,以下实例在索引 1 到索引 4 的位置并设置为步长为 2(间隔一个位置)来截取字符串:

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
str = "abababababa"
print(str[2:10:2])

输出结果:aaaa

使用方法修改字符串的大小写

#Author:Anliu
name = "wo men ai shangluo"
print(name.title())
输出结果:Wo Men Ai Shangluo

注:name.title()中,name后面的(.)让Python对变量name执行的方法。

还有类似以下方法:

#Author:Anliu
name = "wo men ai shangluo"
print(name.title())
print(name.upper())
print(name.lower())

字符串拼接:

#Author:Anliu
name = "wo men ai"
name1 = "shangluo"
ull_name = name +" "+ name1
print(full_name)

使用制表符或者换行符来添加空白:

要在字符串中添加换行符,可使用字符组合\n:

#Author:Anliu
print("python \nC")
输出结果:

python
C

还可以在同一个字符串中同时包含制表符和换行符。字符串"\n\t"r让python换到下一行,并在下一行开头添加一个制表符。

#Author:Anliu
print("python \nC \n\tJava")

输出结果:

python
C
     Java

删除空白:

#Author:Anliu
name = "\tpython\t"
print(name)
print(name.rstrip())
print(name.lstrip())
print(name.strip())

什么意思呢?你猜。。。

输出高亮显示:

1.实现过程

终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关。控制字符颜色的转义序列是以ESC开头,即用\033来完成

2.书写过程

开头部分: \033[显示方式;前景色;背景色m

结尾部分: \033[0m

注意

开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个;另外由于表示三个参数不同含义的数值都是唯一的没有重复的,所以三个参数的书写先后顺序没有固定要求,系统都能识别;但是,建议按照默认的格式规范书写。

结尾部分其实也可以省略,但是为了书写规范,建议\033[***开头,\033[0m结尾。

3.参数

- 显示方式:** 0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、 5(闪烁)、25(非闪烁)、7(反显)、27(非反显)
- **前景色**: 30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋 红)、36(青色)、37(白色)
- **背景色**: 40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋 红)、46(青色)、47(白色)

4.常见开头格式

\033[0m 默认字体正常显示,不高亮 \033[32;0m 红色字体正常显示 \033[1;32;40m 显示方式: 高亮 字体前景色:绿色 背景色:黑色 \033[0;31;46m 显示方式: 正常 字体前景色:红色 背景色:青色

#/usr/bin/python3
#-*- coding:utf-8 -*-
#author: Carve

UserName = input("\033[0;31;44m please input your username:\033[0m")
PassWord = input("\033[5;31;44m please input your password:\033[0m")
print(UserName,PassWord)

3.3 列表

List(列表) 是 Python 中使用最频繁的数据类型。

列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。

列表用 []标识,是 python 最通用的复合数据类型。

列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。

加号 + 是列表连接运算符,星号 * 是重复操作。如下实例:

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
list = ['runoob',777,3.14,'anliu',70.2]
tinylist = [123,'john']
print(list)
print(list[0])
print(list[1:3])
print(list[2:])
print(tinylist * 2)
print(list + tinylist)

输出结果:

['runoob', 777, 3.14, 'anliu', 70.2]
runoob
[777, 3.14]
[3.14, 'anliu', 70.2]
[123, 'john', 123, 'john']
['runoob', 777, 3.14, 'anliu', 70.2, 123, 'john']

查:(切片操作)

#Author:Anliu
#names = "zhangsan lisi wanger"
names =["zhangsan","lisi","wanger"]
print(names)
print(names[0])
print(names[2])
print(names[:2])
print(names[2:])

查看索引:

names = ["zhangsan","lisi","wanger","xx"]
print(names[names.index("xx")])

统计元素:

names = ["zhangsan","lisi","wanger","xx","lisi"]
print(names.count("lisi"))

翻转:

names = ["zhangsan","lisi","wanger","xx","lisi"]
names.reverse()
print(names)

排序:

#Author:Anliu
names = ["zhangsan","lisi","wanger","xx","lisi"]
names.sort()
print(names)

排序按照ACSII码的顺序:

遍历:

#Author:Anliu
names = ["zhangsan","lisi",["wanger","xx"],"lisi"]
for i in names:
    print(i)

合并:

#Author:Anliu
names = ["zhangsan","lisi","wanger","xx","lisi"]
names2 = ["dasfh","gsfs","","bcvbfj"]
names.extend(names2)
print(names)
print(names2)

增:

1 在列表末尾添加元素

#Author:Anliu
names = ["zhangsan","lisi","wanger"]
names.append("mazi")
print(names)
2 在列表中插入元素

#Author:Anliu
names = ["zhangsan","lisi","wanger"]
names.insert(0,"xxx")
print(names)

3 复制

“深copy”与“浅copy”

(1)“浅copy”

实质上是对第一个列表元素的引用

#Author:Anliu
import copy
p1 = ["name",["a",100]]
print(p1)
#方法一:
#p2 = p1.copy()
#p3 = p1.copy()
#方法二:
#p2 = copy.copy(p1)
#p3 = copy.copy(p1)
#方法三:
#p2 = p1[:]
#p3 = p1[:]
#方法四:
p2 = list(p1)
p3 = list(p1)

p2[0] = "zhangxiudu"
p3[0] = "duyang"

p2[1][1] = 50

print(p2)
print(p3)

对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

(2)深“copy”

p1 = ["name",["a",100]]
p2 = copy.deepcopy(p1)
p3 = copy.deepcopy(p1)
p2[0] = "zhangxiudu"
p3[0] = "duyang"

p2[1][1] = 50

print(p2)
print(p3)
深拷贝不仅仅拷贝最外层容器,还会拷贝容器中的元素

删:

1 使用del语句删除

#Author:Anliu
names = ["zhangsan","lisi","wanger"]
del names[1]
print(names)

2 使用方法pop()删除元素

默认删除最后一个元素

#Author:Anliu
names = ["zhangsan","lisi","wanger"]
names.pop()
print(names)

3 弹出列表中任何位置处的元素

如果你确定使用del语句还是pop()方法,就这样判断:如果你要存列表中删除一个元素,切不在以任何方式使用它,就用del语句;如果你要在删除元素之后还能继续使用它,就用pod()方法。

#names = "zhangsan lisi wanger"
names = ["zhangsan","lisi","wanger"]
del_name = names.pop()
print("This a test_names of pop",del_name)
4 根据值删除元素
#Author:Anliu
names = ["zhangsan","lisi","wanger"]
names.remove("lisi")
print(names)

改:

#Author:Anliu
names = ["zhangsan","lisi","wanger"]
names[0]="123"
print(names)


练习:用python语言把列表[1,3,5,7,9]倒序并将元素变为字符类型,请写出多种方法

#Author:Anliu
list = [1,2,5,7,9]
# 方法一:
'''
list1 = []
for i in list[::-1]:
    list1.append(str((i)))
print(list1)
'''
#方法二:
'''
list1 = []
for i in range(len(list)-1,-1,-1):
    list1.append(str(list[i]))
print(list1)
'''
#方法三:
'''
list1 = []
for i in reversed(list):
    list1.append(str(i))
print(list1)
'''
#方法四:
'''
list1 = []
for i in 4,3,2,1,0:
    list1.append(str(list[i]))
for j in list1:
    print(type(j))
#print(type(list1))
'''

3.4 元组

元组是另一个数据类型,类似于 List(列表)。

元组用 () 标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
tuple = ('runoob', 786, 2.23, 'john', 70.2)
tinytuple = (123, 'john')
print(tuple)  # 输出完整元组
print(tuple[0])  # 输出元组的第一个元素
print(tuple[1:3])  # 输出第二个至第四个(不包含)的元素
print(tuple[2:])  # 输出从第三个开始至列表末尾的所有元素
print(tinytuple * 2)  # 输出元组两次
print(tuple + tinytuple)  # 打印组合的元组

元祖就其本质而言,就是一个不可变列表,不像列表一样能够修改元素。因此,元组没有修改操作以为,其他类似于列表。这里不再赘述。

3.5 字典

字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。

两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典用"{ }"标识。字典由索引(key)和它对应的值value组成。

#!/bin/evn python
#-*- coding:utf-8 -*-
#Author:Anliu
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'john', 'code': 6734, 'dept': 'sales'}
print(dict['one'])  # 输出键为'one' 的值
print(dict[2])  # 输出键为 2 的值
print(tinydict)  # 输出完整的字典
print(tinydict.keys())  # 输出所有键
print(tinydict.values())  # 输出所有值
info = {
    'hebei':"shijiazhuang",
    'shanxi':"shangluo",
    'henan':"zhumadian"}
print(info)
增,删,改,查:

#Author:Anliu
info = {
    'hebei':"shijiazhuang",
    'shanxi':"shangluo",
    'henan':"zhumadian"
}
print(info)

print(info["hebei"]) #访问字典值,该方法在键值不存在时报错
print(info.get("hebei")) #该方法在之不存在的时候,返回null
print("hebei" in info) #判断键值是否存在于字典
info["henan"]  = "toujingai"  #有则修改
print(info)
info["hubei"] = "jinzhou"  #无则添加
print(info)#del info  删除字典
info.pop("henan") #删除元素
print(info)
info.popitem() #随机删除print(info)

嵌套:

#Author:Anliu
info = {
    '1001':{'name':"zhangsan",'身高':"195",'体重':"180"},
    '1002':{'name':"lisi",'身高':"179",'体重':"250"},
    '1002':{'name':"wangwu",'身高':"180",'体重':"130"}}
print(info)

3.6 集合

集合:集合是一个无序的,不重复的数据集合,可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

例如:

parame = {value01,value02,...}
或者
set(value)

主要作用如下:

(1)去重,把一个列表变成集合,就自动去重了。

(2)关系测试,测试两组数据之间的交集,差集,并集等关系。

3.6.1 关系测试

#Author:Anliu
list_1 = [1,4,57]
list_1 = set(list_1)
print(list_1,type(list_1))
list_2 = set([1,8,3])
print(list_1,list_2)

#求交集
print(list_1.intersection(list_2))
#求并集
print(list_1.union(list_2))
#求差集
print(list_1.difference(list_2))#list1里面有,list2里面没有的
#求子集
print(list_1.issubset(list_2))
#求父集
print(list_1.issuperset(list_2))
#对称差集
print(list_1.symmetric_difference(list_2))

#判断是否有交集,有则为不为真
list_3 = set([5,6,9])
list_4 = set([4,7,9])
print(list_3.isdisjoint(list_4))

3.6.2 集合操作

#Author:Anliu
#添加
list_1 = set()
list_1.add(999)
print(list_1)
list_1.update([666,777,555])
print(list_1)
#删除
list_1.remove(777)
print(list_1)
print(list_1.pop())    #删除最小的值
print(list_1.discard(777))

#取长度
print(len(list_1))

#判断元素是否在集合中
print(666 in list_1)
print(666 not in list_1)


集合内置方法列表image

image

3.6 数据类型转换

有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。

以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。

image

image



posted @ 2020-03-23 22:22  大江东流水  阅读(904)  评论(0编辑  收藏  举报