Python自动化运维 - day2 - 数据类型
1、进制
每8位分为一组,8位成为一个字节
万国码定义字节是不固定的,最少两个字节
保存文件的时候要选择编码格式
unicode - utf-8 每个字符集,都有自己的编码格式(编码对应关系)
utf-8 3个字节
gbk 2个字节
不能以utf-8存储,用gbk去读取,这样就会造成乱码
总结:
1、硬盘上保存的数据是以二进制保存的
2、读取二进制,然后转换成对应编码的数据
3、 f = open('test.txt','rb')
4、往往用户看到的是
- 转换完成的字符出啊
- 以十六进制展示的0101011,因为16进制表示的一个字符的所需位数更少(以\x开头来显示)
2、基本数据类型
不同的数据类型具备不同的功能
1、字符串
不可变对象
所有的方法均会产生新的对象,并应用对应的方法
1 - capitalize() 首字母大写 2 3 例: name = 'hello' name.capitalize() 结果: 'Hello' 4 5 - casefold() 3.x新增 字符串转换为小写,可以转换各种语言大小写(法语、德语...) 6 7 例: name = 'HELLO' name.casefold() 结果: 'hello' 8 9 * - lower() 字符串转换为小写,只能转换英文字母 10 11 例: name = 'World' name.lower() 结果: 'world' 12 13 - center(width,filechar=None) 文本填充,width为字符串的总长度,str居中然后两端用fillcharacter填充,fillchar默认为空格 14 例: name = 'hello' name.center(7,'*') 结果: *hello* 15 16 - counter(sub,start=None,end=None) sub为统计的字符串(子序列),统计sub出现的次数,start为起始位置,end为结尾位置 17 18 例: name = 'hello' name.counter('l') 结果: 2 19 20 * - startswith(suffix,start=None,end=None) 以suffix为开头,返回bool值,start起始位置,end结束位置 21 22 例: name = 'Hello' name.startswith('H') 结果: True 23 24 * - endswith(suffix,start=None,end=None) 以suffix为结尾,返回bool值,start起始位置,end结束位置 25 26 例: name = 'world' name.endswith('d') 结果: True 27 28 - expendtabs(20) 找到tab键,然后对它做一个特殊的替换,20表示,两个\t之前的总和(开头没有的话,默认从开头开始) 29 30 例: name = 'a\tb\tc\t' name.expendtabs(3) 结果: 'a b c' 解读:中间两个空格,算上单字符串和空格,总长度为3。 31 32 * - find(sub,start=None,end=None) 找到sub在str中的位置,如果找到返回index(匹配到第一个),找不到返回-1 33 34 例: name = 'hello' name.find('l') 结果: 2 35 36 * - format() 格式化字符串,位置占位符为{0},{1} 37 38 例: print("Hello {0},I'am {1}".format('daxin','20')) 39 可以命名占位符{name},{age},那么赋值的时候就需要 40 name=daxin,age=20 41 42 - format_map() 格式化字符串,只不过传递的值是一个字典接上个例子:{'name':"daxin",'age'=20} 43 44 - index(sub) 查询sub在str中的index,如果不存在,会报错 45 46 例: name = 'hello world' name.index('w') 结果: 6 47 48 - isalnum() 判断str中是否包含数字,字母,汉字等等,然后bool 49 50 例: name = 'abc123你好' name.isalnum() 结果: True 51 52 - isalpha() 判断字符串是否都为字母,返回bool类型 53 54 例: name = 'abc123' name.isalpha() 结果:False 55 56 * - isdecimal() 只能认识阿拉伯数字,'123' 57 58 例: name = '123' name.isdecimal() 结果:True 59 60 - isdigit() 只能认识阿拉伯数字、以及特殊符号的数字,'123','②' 61 62 例: name = '123②二' name.digit() 结果:False 63 64 - isnumerice() 只能认识阿拉伯数字、以及特殊符号的数字,以及中文数字'123','②','二' 65 66 例: name = '123②二' name.isnumerice() 结果:True 67 68 - isidentifier() 判断对象是否可以成为标识符(变量名)来用,不会判断关键字 69 70 例: name = '9hello' name.isidentifier() 结果: False 71 72 - islower() str是否都是小写,返回bool 73 74 例: name = 'hello' name.islower() 结果:True 75 76 - isupper() str是否是大写,返回bol 77 78 例: name = 'HELLO' name.isuper() 结果: True 79 80 * - upper() 把str转换为大写 81 82 例: name = 'hello' name.upper() 结果: 'HELLO' 83 84 - isprintable() 判断对象是否可以被打印(不包含隐藏字符,例如\n,这种打印不出来的,就会返回False) 85 86 例: name = 'hello\n' name.isprintable() 结果: False 87 88 - isspace() 判断对象是否是空格 89 90 例: name = ' ' name.isspace() 结果: True 91 92 - istitle() 判断对象是否是标题,既首字母大写(既每个单词的首字母大写) 93 94 例: name = 'Hello World' name.istitle() 结果: True 95 96 * - join() 连接,用于把可迭代对象的每个元素用 什么 连接起来,可迭代对象的元素必须是str 97 98 例1: a = 'hello' '*'.join(a) 结果: h*e*l*l*o 99 100 例2: '*'.join([ str(i) for i in range(10)]) 101 102 - ljust(width,fillchar=None) 左填充,fillchar为填充的字符 103 104 例:name = 'hello' name.ljust(10,'*') 结果:*****hello 105 106 - rjust(width,fillchar=None) 右填充,fillchar为填充的字符 107 108 例: name = 'hello' name.rjust(10,'*') 结果:hello***** 109 110 - lstrip() 左去除,既删除左边的空格换行符和制表符 111 112 例: name = '*hello*' name.lstrip('*') 结果: 'hello*' 113 114 - rstrip() 右去除,既删除右边的空格换行符和制表符 115 116 例: name = '*hello*' name.rstrip('*') 结果: '*hello' 117 118 - maketrans('abc','123') 创建对应关系,既a对应1,b对应2,c对应3 119 120 例: m = str.maketrans('abc','123') 121 122 name = 'abc123' 123 124 v = name.translate(m) 125 126 print(v) 127 128 '123123' 129 130 - translate() 和maketrans连用,用来表示按照什么规则进行翻译解释,例子如上 131 132 - partition('split') 根据split进行分割,从左开始,只分割遇到的一个split,并且保存分隔符,返回的对象为元祖 133 134 例: name = 'Hello|World' name.partition('|') 135 136 ('hello','|','World') 137 138 * - replice('src','dst',counter=None) 字符串的替换,把src替换为dst,counter为替换几次 139 140 例: name = 'Hello World' name.replice('H','h') 结果: 'hello World' 141 142 - rfind('sub') 右查找,既丛字符串的右边开始查找sub,并返回它对应的index 143 144 例: name = 'hello' name.rfind('l') 结果: 3 145 146 - rindex('sub') 从右边查找sub的index,如果sub在str对象中不存在,那么会报valueError异常 147 148 例: name = 'hello' name.rindex('l') 结果: 3 149 150 - rpatition('split') 既从右边开始,对找到的第一个split进行分割,返回值为元祖(包含分隔符) 151 152 例: name = 'hello' name.rpatition('l') 结果: ('hel','l','o') 153 154 * - split('split',num=None) 把字符串默认从左开始对象使用split进行分割,默认会对所有分割符进行分割,num可以指定分隔符的个数 155 156 例1: name = 'hello world' name.split('l') 结果: ['he','','o wor','d'] 157 158 例2: name = 'hello world' name.split('l',1) 结果: ['he','lo world'] 159 160 - rsplit('split',num=None) 把字符串从右开始使用split进行分割,在不指定num的情况下和split相同 161 162 例: name = 'hello world' name.rsplit('l',1) 结果: ['hello wor','d'] 163 164 - splitlines(keepends=None) 以什么为分行符,功能等同于split('\n') 165 166 例: name = 'hello\nworld' name.splitlines('\n') 167 168 * - strip('string') 去除两边的string,默认是移除空格换行及制表符。 169 170 例: name = ' hello ' name.strip() 结果: 'hello' 171 172 - swapcase() 大小写转换,既把对象的大写转换为小写,小写转换为大写 173 174 例: name = 'Hello' name.swapcase() 结果: 'hELLO' 175 176 - title() 把单词的首字母换成大写 177 178 例: name = 'hello' name.title() 结果: 'Hello' 179 180 - zfill(width) 在字符串的左边填充0,width为总长度 181 182 例: name ='hello' name.zfill(10) 结果: '00000hello' 183 184 - encode(encoding = 'UTF-8') 把字符串转换为二进制(字节类型),encodinf=UTF-8,表示转换的时候按照UTF-8进行编码 185 186 例: name = '你好' name.encode(encoding='UTF-8') 结果: b'\xe4\xbd\xa0\xe5\xa5\xbd' 187 188 也可以用其他的编码类型如:gbk
练习题:
name = ' aleX'
1、移除name变量对应的值两边的空格,并输出移除后的内容
name.strip()
2、判断name变量对应的值是否已"al"开头,并输出结果
name.startswith('al')
3、判断name变量对应的值是否已'X'结尾,并输出结果
name.endswith('X')
4、将name变量对应的值中的'l',替换为'p',并输出结果
name.replice('l','p')
5、将name变量对应的值根据'l',进行分割,并输出结果
name.split('l')
name.partition('l')
6、请问上一题e,分割后得到值的类型是?
name.split('l') list
name.partition('l') tuple
7、将name变量都应的值变大写,并输出结果
name.upper()
8、将name变量对应的值变小写,并输出结果
name.lower()
9、请输出name变量对应的值的第二个字符
name[1]
10、请输出name变量对应的值的前三个字符
name[:3]
11、请输出name变量对应值的后2个字符
name[-2:]
12、请输出name变量对应的值中'e' 所字啊索引的位置
name.find('e')
name.index('e')
13、获取子序列,仅不包含最后一个字符
name[:-1]
2、int类型
不可变类型
1 - bit_length() --> 3.x 显示对象占用的位数(当前整数最少用几位来表示) 2 3 例: name = 2 name.bit_length() 结果: 2 4 5 - to_bytes(length,byteorder='big') 获取整数对象的byte表示(一般用16进制显示),length表示用几个字节来显示,byteorder='big/little',"big"表示最有意义的字节放在字节数组的开头,"little"表示最有意义的字节放在字节数组的结尾 6 7 例1: name = 15 name.to_bytes(5,byteorder='big') 结果: b'\x00\x00\x00\x00\x0f' 8 9 例2: name = 15 name.to_bytes(5,byteorder='little') 结果: b'\x0f\x00\x00\x00\x00'
3、布尔值
不可变类型
bool(int),既布尔类型,继承了int类型的属性
非0,None,'',[] 等默认布尔类型为True,其他对象全为False
4、列表
可变类型
支持索引,切片及for循环
所有的操作,直接作用于list对象,这一点和str不同(str是拷贝)。
1 - append() 列表追加,表示追加一个元素 2 3 例: name = [1,2] name.append(3) 结果: [1,2,3] 4 5 - clear() 列表清空 6 7 - copy() 列表复制,浅copy 8 9 例: name = [1,2] copy = name.copy() 10 11 - count('元素') 计算元素在list中的个数 12 13 例: name = [1,2,3,1] name.count(1) 结果: 2 14 15 注意:如果直接用=(name1=name),那么对name进行修改同样会作用在name1行,因为它俩指向一个内存地址 16 17 - extend('list/iterable') 把列表或者可迭代对象中的元素,循环的append到list中去 18 19 例: name = [1,2] name.extend([i for i in range(2)]) 结果: [1,2,0,1] 20 21 注意:如果这里跟string,那么它会把string的每个字母当成一个元素进行append 22 23 - index('元素') 从左向右查找元素,返回元素的index,如果没有,则会报错 24 25 例: name = [1,2,3] name.index('3') 结果: 2 26 27 - insert('index','元素') 在index的位置上插入元素 28 29 例: name = [1,2,3] name.insert(1,10) 结果: [1,10,2,3] 30 31 - pop(index=None) 根据index,弹出(删除)一个元素,这个元素会作为方法的返回值 32 33 例: name = [1,2,3] name.pop(1) 结果: [1,3] 34 35 如果没有指定index,那么默认会从list的右边进行弹出 36 37 - remove('元素') 删除一个元素,并不会做为方法返回值 38 39 例: name = [1,2,3] name.remove('1') 结果: [2,3] 40 41 注意:这里也可以直接通过关键字del 来删除列表中的某个元素 42 43 - reverse() 反转一个元素,既倒序 44 45 例: name = [1,2,3] name.reverse() 结果: [3,2,1] 46 47 - sort(reverse=False) 元素的排序,直接作用在列表上,默认是正序,当reverse=True时为倒序 48 49 例: name = [1,2,3] name.reverse(reverse=True) 结果: [3,2,1] 50 51 range(start=0,end,setp=None) 在2.x中会直接生成一个列表,在3.x中会生成一个生成器,当作用于for循环进行迭代的时候,才会依次生成,start默认从0开始,setp为步长,不会包含end的数字 52 53 例: range(1,10) 在迭代的时候为 1,2,3,4,5,6,7,8,9 54 55 注意:2.x 中的 xrange 和 3.x 中的 range 相同 56 57 enumerate('list',index=0) 为list对象依次添加数字(在循环中额外生成一列有序的数字) 58 59 例: for i,ele in enumerate(range(3),1): 60 61 print(i,ele) 62 63 结果: 1 0 64 65 2 1 66 67 3 2
练习题:
li = ['alex','eric','rain']
1、计算列表长度并输出
len(li)
2、列表中追加元素'seven',并输出添加后的结果
li.append('seven')
li.insert(3,'seven')
3、请在列表中的第1个位置插入元素'Tony',并添加输出后的结果
li.insert(1,'Tony')
4、修改列表第2个元素为'Kelly',并添加输出后的结果
li[2] = 'Kelly'
5、请删除列表中的元素'eric' ,并输出修改后的列表
li.remove['eric']
li.pop(1)
del li[1]
6、请删除列表中的第2个元素,并输出删除的元素的值和删除元素后的列表
name = li.pop(2)
7、请删除列表中的第3个元素,并输出删除元素后的列表
del li[2]
8、请删除列表中的第2至4个元素,并输出删除元素后的列表
del li[1:4]
9、请将列表所有的元素进行反转,
li.reverse()
li.sort(reverse=True)
10、请使用for、len、range输出列表的索引
for i in range(0,len(li)):
print i
11、请使用enumerate输出列表元素和序号(序号从100开始)
for i,k in enumerate(li,100):
print i,k
12、请使用for循环列出列表的所有元素
for i in li:
print i
5、元组
不可变类型
可以认为是一个特殊的列表,拥有list的切片,index等功能
* 创建元组: user_tuple = ('daxin',) --> 一个元素需要加逗号(,)
- count('元素') 统计元素出现的次数 例: a = ('h','h','e') a.count('h') 结果:2 - index('元素',start=首,end=尾) 获取元素的index位置 例: a = ('h','h','e') a.index(h) 结果:0 注意: 当list作为元组的一个元素的话,那么这个列表是可以修改的,元组保存的是指向list的指针,只要指向的list没变,那么list的对象就可以随意变化 当数据进行嵌套的时候,数据是否可以修改,要遵循目标数据类型的规则 既:当被嵌套的数据类型为list,list本事是可变的,那么就可以修改,当嵌套的数据类型为tuple,tuple本事是不可变的,那么就不能修改
5、字典
可变类型,并且是无序的,可以嵌套
注意:字典的key是不可变类型,元组可以,但是元祖嵌套list就不可以了,因为list不是一个hashable的对象
bool,int 都可以作为key,需要注意的是bool的 True 隐含的默认值 为 1, False 为 0 ,所以当 True 和 1 都存在的话(Python认为True就是1),会只显示 True 。
创建字典: dic = {'name':'daxin'}
1 - clear() 清空字典 2 3 - copy() 字典copy,浅拷贝 4 5 * - get('key',default=None) 获取key对应的value,如果key不存在,那么返回None,default表示默认值,如果key不存在,并且指定了default,那么就会返回default对应的值 6 7 例: dic = {'name':'daxin','age':20} dic.get['name'] 结果:'daxin' 8 9 - items() 把字典的key:value变成一个元组 10 11 例: dic = {'name':'daxin','age':20} dic.items() 结果: [('age', 20), ('name', 'daxin')] 12 13 - keys() 获取字典的key值,然后以列表的形式返回 14 15 例: dic = {'name':'daxin','age':20} dic.keys() 结果: ['age', 'name'] 16 17 - values() 获取字典的value值,然后以列表的形式返回 18 19 例: dic = {'name':'daxin','age':20} dic.values() 结果: [20, 'daxin'] 20 21 - pop('key') 弹出(删除)key对应的value,那么方法会返回key对应的value的值 22 23 例: dic = {'name':'daxin','age':20} dic.pop('age') 结果: 20 24 25 - popitem() 随机弹出一个key:value对,那么方法会随机返回一个key:value元组,我们可以指定两个参数进行接收 26 27 例: dic = {'name':'daxin','age':20} dic.popitem() 结果: ('name', 'daxin') 28 29 - setdefaut('key','value') 设置key的默认值为value,当key不存在的时候,创建并返回value,若存在则不修改,返回对应的value 30 31 例: dic = {'name':'daxin','age':20} dic.setdefaut('job','Linux') 结果: {'name':'daxin','age':20,'job':'Linux'} 32 33 - update(dic1) dic1增加到dic中去,如果存在,那么更新,不存在就增加(批量进行增加和修改) 34 35 例: dic = {'name': 'daxin', 'age': 20} dic1 = {'salary': 25000, 'name': 'alex'} dic.update(dic1) 结果: dic {'salary': 25000, 'name': 'alex', 'age': 20} 36 37 del dic['key'] 通用方法,删除一个元素 38 39 40 41 fromkeys()静态方法,直接可以通过dict.fromkeys进行调用 42 43 dict.fromkeys('list',default) 用于生成字典,key从list中循环读取,并且值都设置为default。 44 45 注意:当default的类型为list,那么修改一个key的value,会作用在所有的value中,因为fromkeys保存的是key对应的list的内存地址(因为内存地址是相同的) 46 47 例: li = ['a','b','c'] dict.fromkeys(li,'hello') 结果: {'c': 'hello', 'a': 'hello', 'b': 'hello'}
6、集合
可变类型,集合元素是不可变类型
集合是一个特殊的列表,它的元素都是唯一的(元素不能重复),不支持索引,支持for循环
创建: se = {'daxin','age','job'} 和字典很像,只不过不是key:value
- add('元素') 添加一个元素,如果元素存在,则不变 - clear() 清空 - copy() 浅拷贝 - difference('set1') 找到set中存在,set1不存在的元素 --> 写cmdb会用 - symmetrice_defference('set1') 对称差集,交集以外的所有元素 - intersection('set1') 取set和set1之间的交际 - union('set1') 取set和set1之间的并集 - defference_update('set1') 找到set中存在,set1不存在的元素,然后赋值给set(清空set,然后再赋值) - discard('元素') 移除一个元素 - isdifjoint() 是否有交集 - issubset() 是否是子集 - issuperset() 是否是父集 - pop() 取值并移除,然后返回对应的值 - remove() 直接删除,不返回 - update('set1/list') 把set1/list中set没有的数据添加到set中去