第一类:数值类型
一.数值型包括
1.int(整型):python3里数字不管多大永远都是int长整型,且没有大小限制,受限于内存区域的大小
类型转换:int(x)返回一个整数
2.float(浮点型):有整数部分和小数部分组成。支持十进制和科学计数法表示。只有双精度型
类型转换:float(x)返回一个浮点数
3.complex(负数):有实数和虚数部分组成,实数和虚数部分都是浮点数,3+4.2J
类型转换:comlex(x),complex(x,y)返回一个复数
4.bool(布尔型):int的子类,仅有2个实例True,False对应1和0,可以和整数直接运算
类型转换:bool(x)返回布尔值
二.数字的处理函数
1.round():四舍六入五取偶
>>> round(2.6)
3
2.floor()地板:向下取整
>>> import math >>> math.floor(2.9) 2
3.ceil()天花板:向上取整
>>> import math >>> math.ceil(2.1) 3
4.int()取整数部分,和//整除一样
>>> int(1.8)
1
5.min():取最小值
>>> min(1,6,9)
1
6.max():取最大值
>>> max(1,6,9)
9
7.pow(x,y):等于x**y平方
>>> pow(5,2)
25
8.math.sqrt():返回数字x的平方根
>>> import math >>> math.sqrt(100) 10.0
9.进制函数,返回值是字符串
(1)bin():二进制整数
>>> bin(2) '0b10'
(2)oct():八进制整数
>>> oct(2) '0o2'
(3)hex():十进制整数
>>> hex(2) '0x2'
10.math.pi:π的值
>>> import math >>> math.pi 3.141592653589793
11.math.e自如常数
>>> import math >>> math.e 2.718281828459045
三.类型判断
1.type(obj),返回类型,而不是字符串
举例:判断1是什么类型
>>> type(1) <class 'int'>
2.isinstance(obj,class_or_tuple)返回值是布尔值
举例:判断6是不是int类型
>>> isinstance(6,int)
True
举例:判断6是不是int类型或者str类型的其中一个
>>> isinstance(6,(int,str))
True
四.类型转换
1.字符串类型转换数字类型功能:将字符串转换为数字:a="123"是字符串,通过int(a),把a变成int数字类型,type查看是类型
a = "123" print(type(a), a) b = int(a) print(type(b), b)
输出:
<class 'str'> 123
<class 'int'> 123
2.进制转换功能:通过base=16把num="a"以16进制的方式转换成十进制
num = "a" v = int(num, base=16) print(v)
输出:
10
3.bit_lenght功能:当前数字的二进制,至少用n位表示
举例:通过age.bit_length查看age=5是的二进制数字是几位来表示
age = 5 r = age.bit_length() print(r)
5的二进制数字是101输出:
3
第二类:线性结构(包括字符串-列表-元祖-bytes-bytearray)
字符串类型
一.字符串特性
1.使用引号定义的一组可以包含数字,字母,符号(非特殊系统符号)的集合
2.使用单引号,双引号,三引号引住的字符序列
3.字符串是不可变对象
4.一旦修改或者拼接,都会造成重新生成字符串
5.不同的字符串占用不同的空间
6.Python3起字符串就是Unicode类型
二.字符串定义初始化
举例1
>>> s1 = 'string' >>> s1 'string'
举例2
>>> s2 = "string" >>> s2 'string'
举例3
>>> s3 = '''this's a "string" ''' >>> s3 'this\'s a "string" '
举例4
>>> s4 = 'hello \n xixi.com' >>> s4 'hello \n xixi.com'
举例5
>>> s5 = r"hello \n xixi.com" >>> s5 'hello \\n xixi.com'
举例6
>>> s6 = 'C:\windows\nt' >>> s6 'C:\\windows\nt'
举例7
>>> s7 = R"C:\windows\nt" >>> s7 'C:\\windows\\nt'
举例8
>>> s8 = 'C:\windows\\nt' >>> s8 'C:\\windows\\nt'
举例9
>>> sql = """select * from user where name='xixi'""" >>> sql "select * from user where name='xixi'"
三.字符串元素访问---下标
1.字符串支持使用索引访问
>>> sql = """select * from user where name='xixi'""" >>> sql "select * from user where name='xixi'" >>> sql[4] 'c'
2.有序的字符集合,字符序列
格式:
for 变量名 in 值:
执行
举例:
test = "西西是好人" for i in test: print(i) 输出: 西 西 是 好 人
3.可迭代
举例:获取字符列表
s1 = '东西南北' lst = list(s1) print(lst) 返回结果: ['东', '西', '南', '北']
四.字符串连接
1.字符串+连接
将2个字符串连接在一起,返回一个新的字符串
>>> s1 = 'abc' >>> s2= 'def' >>> s1 + s2 'abcdef'
2.字符串join连接:将可迭代对象连接起来,使用string作为分隔符,可迭代对象本身元素都是字符串,返回一个新的字符串
举例1:
test = "你是风儿我是沙" v1 = "_".join(test) print(v1) 返回: 你_是_风_儿_我_是_沙
举例2:\转义引号用引号分割开
test = "你是风儿我是沙" v2 = "\"".join(test) print(v2) 返回: 你"是"风"儿"我"是"沙
举例3:
test = "你是风儿我是沙" v3 = "\n".join(test) print(v3) 返回: 你 是 风 儿 我 是 沙
五.字符串分割:分割字符串的分类分为两类
第一类:split()系
1.split()功能:分割为指定个数,从左边开始分割(弊端分割的字符自己拿不到)
语法:split(sep=None,maxsplit=-1)-> list of strings
sep指定分割字符串,缺省的情况下空白字符串作为分隔符
maketrans指定分割的次数,-1表示遍历整个字符串
举例:按照默认空白字符分割
test ="I'm \ta super student." print(test.split()) 返回:["I'm", 'a', 'super', 'student.']
举例:根据字符串s分割
test ="I'm \ta super student." print(test.split('s')) 返回: ["I'm \ta ", 'uper ', 'tudent.']
举例:根据字符串super分割
test ="I'm \ta super student." print(test.split('super')) 返回: ["I'm \ta ", ' student.']
举例:根据空格分割
test ="I'm \ta super student." print(test.split(' ')) 返回: ["I'm", '\ta', 'super', 'student.']
举例:根据空格分割切两
test ="I'm \ta super student." print(test.split(' ',2)) 返回: ["I'm", '\ta', 'super student.']
举例:按照\t分割切两次
test ="I'm \ta super student." print(test.split('\t',2)) 返回: ["I'm ", 'a super student.']
2.rsplit()功能:分割为指定个数,从右边开始分割(弊端分割的字符自己拿不到)
语法:rsplit(sep=None,maketrans=-1)->list of strings
sep指定分割字符串,缺省的情况下空白字符串作为分隔符
maketrans指定分割的次数,-1表示遍历整个字符串
3.splitlines()功能:只根据换行符分割(只能根据,true,false:是否保留换行)
语法:splitlines([keepends])->list of strings
按照行来切分字符串
keepends指的是是否留存分隔符
行分隔符包括\n,\r\n,\r等
举例:
test = "asdfadfasdf\nasdfasdf\nadfasdf" v = test.splitlines(False) print(v) 输出: ['asdfadfasdf', 'asdfasdf', 'adfasdf']
第二类:partition系
1.partition()功能:
语法:partition(sep)->(head,sep,tail)
从左至右,遇到分隔符就把字符串分割成两部分,返回头,分隔符,尾三部分的三元组;如果没有找到分隔符,就返回头,2个空元素的三元组
sep分割字符串,必须指定
举例1:通过s分割
s1 = "I'm a super student." print(s1.partition('s')) 返回: ("I'm a ", 's', 'uper student.')
举例:通过stu分割
s2 = "I'm a super student." print(s2.partition('stu')) 返回: ("I'm a super ", 'stu', 'dent.')
举例:通过abc没有这个分割
s2 = "I'm a super student." print(s2.partition('abc')) 返回: ("I'm a super student.", '', '')
2.rpartition()功能:
语法:rpartition(sep)->(head,sep,tail)
从右至左,遇到分隔符就把字符串分割成两部分,返回头,分隔符,尾三部分的三元组;如果没有找到分隔符,就返回头,2个空元素的三元组
sep分割字符串,必须指定
六.字符串大小写
1.upper()功能:转换为大写
s1 = "I'm a super student." print(s1.upper()) 输出: I'M A SUPER STUDENT.
2.casefold()功能和lower()功能:所有变小写,casefold()可以很多未知的对相应变小写,lower()只能把英文转换小写
test = "wangXIXI" v1 = test.casefold() print(v1) v2 = test.lower() print(v2) 输出: wangxixi wangxixi
3.swapcase()大小写转换功能:大写变小写,小写变大写
test = "WanG" v = test.swapcase() print(v) 输出: aANg
七.字符串的排版
1.title()功能:把普通字符串转换成标题
举例:标题的每个单子都大写
test = "return True if all cased characters in S are uppercase and there is" v1 = test.title() print(v1) 输出: Return True If All Cased Characters In S Are Uppercase And There Is
2.capitalize()功能:首字母大写
test = "wang xi xi" v = test.capitalize() print(v) 输出: Wang xi xi
3.center()功能:设置宽度,并将内容居中(只能填一个字符,不填默认为空格)
语法:center(width[,fillchar])->str
width打印宽度
fillchar填充的字符
举例:宽度20,填充*
test = "wangXIXI" v = test.center(20,"*") print(v) 输出: ******wangXIXI******
4.zfill()功能:默认不能指的填充,默认0
语法:zfill(width)->str
width打印宽度,居右,左边用0填充
test = "wangxixi" v = test.zfill(20) print(v) 输出: 000000000000wangxixi
5.ljust()功能:内容在左参数右边填充
test = "wangxixi" v = test.ljust(20,"*") print(v) 返回: wangxixi************
6.rjust()功能:内容在右参数左边填充
test = "wangxixi" v = test.rjust(20,"*") print(v) 输出 ************wangxixi
八.字符串修改
1.replace()替换功能:将指定字符串替换为指定字符串
语法:replace(old,new[,count])->
字符串中找到匹配替换为新字符,返回新字符
count表示替换几次,不指定就是全部替换
举例:把bbb换所有xixi
test = "wangxishixi" v = test.replace("xi",'bbb') print(v) 输出: wangbbbshibbb
举例:把bbb换所有xixi,只替换第一个
test = "wangxishixi" v = test.replace("xi",'bbb',1) print(v) 输出: wangbbbshixi
2.strip()去掉功能:
语法:strip([chars])->str
从字符串两端去除指定的字符集chars中的所有字符
如果chars没有指定,去除两端的空白字符
举例:把不可见空白字符都去掉
s = "\r\n\t Hello XiXi \n \t" print(s.strip()) 输出: Hello XiXi
举例:去掉r字符y和空格
s = 'I am very very very sorry ' print(s.strip('r y')) 输出: I am very very very so
3.lstrip()从左边开始去掉
举例:将字符串去掉右边空格
test = " xixi " v = test.lstrip() print(v) 输出: xixi
4.rstrip()功能:从右边开始去掉
test = " xixi " v = test.rstrip() print(v) 输出: xixi
5.expandtabs()功能:断句,把字符串中的tab符号('\t')转为空格
test = "username\temail\tpassword\nxixi\txixi@q.com\t123\nshishi\tshishi@q.com\t123\nwangwang\twangwang@q.com\t123" v = test.expandtabs(20) print(v) 输出:(每行不够20位数用/t空格补够20位) username email password xixi xixi@q.com 123 shishi shishi@q.com 123 wangwang wangwang@q.com 123
6.maketrans( )对应关系替换功能:
test = "aeiou" test1 = "12345" v = "asidufkasd;fiuadkf;adfkjalsdjf" m = str.maketrans("aeiou", "12345") new_v = v.translate(m) print(new_v) 创建对应关系str.maketrans("aeiou", "12345")用v.translate(m)做出对应关系的替换字符串v里的所有aeiou替换成12345输出: 1s3d5fk1sd;f351dkf;1dfkj1lsdjf
九.字符串查找
1.find()功能:
语法:find(sub[,start[,end]])->int
在指定的区间[start,end),从左到右,查找子串sub,找到返回索引,没找到返回-1
举例:找到第一个very的索引
s = 'I am very very very sorry' print(s.find('very')) 输出: 5
2.rfind()功能:
语法:find(sub[,start[,end]])->int
在指定的区间[start,end),从右到左,查找子串sub,找到返回索引,没找到返回-1
举例:从-1开始找,
3.index()功能:
语法:index(sub,[,start[,end]])->int
在指定的区间[start,end),从右到左,查找子串sub,找到返回索引,没找到抛出异常ValueError
4.rindex()功能
语法:index(sub,[,start[,end]])->int
在指定的区间[start,end),从左到右,查找子串sub,找到返回索引,没找到抛出异常ValueError
5.count()功能寻找:去字符串中寻找,寻找子序列的出现次数
语法:count(sub[,start[,end]])-> int
在指定的区间[start,end),从右到左,统计子串sub出现次数
举例:从第5个位数开始往后找到第6个位数范围内寻找
test = "aLexalexr" v = test.count('ex',5,6) print(v) 输出: 0
6.endswith()功能:以什么什么结尾
语法:endswith(suffix[,start[,end]])->bool
在指定的区间内[start,end),字符串是否是suffix结尾
举例:查询是very结尾吗?
s = "I am very very very sorry" print(s.startswith('very')) 输出: False
举例:查询第五位结尾是不是very
s = "I am very very very sorry" print(s.startswith('very',5)) 输出: True
举例:只留5-8位是判断是否是very结尾
s = "I am very very very sorry" print(s.startswith('very',5,9)) 输出: True
7.startswith()功能:以什么什么开始
在指定的区间内[start,end),字符串是否是prefix开头
s = "I am very very very sorry" print(s.endswith('sorry',5,100)) 输出: True
8.len():获取当前字符串中由几个字符组成
test = "西西是好人" v = len(test) print(v) 输出: 5
十.字符串判断
1.isalnum()功能:判断字符串中是否只包含字母和数字
test = "123" v = test.isalnum() print(v) 输出: True
2.isalpha()功能:判断字符串中是否是字母或汉子
test = "as2df" v = test.isalpha() print(v) 输出: False
3.isdecimal()功能:是否只包含十进制数字
4.isdigit()功能:判断当前输入是否是数字,包含特殊特殊符号的字符不支持中文
5.isnumberic()功能:判断当前输入是否是数字,支持中文
6.isprintable()功能:判断是否存在不可显示的字符 ( \t制表符 \n换行)
test = "oiuas\tdfkj" v = test.isprintable() print(v) 输出: False
7.isspace()功能:判断是否全部都是空格
test = "a b" v = test.isspace() print(v) 输出: False istitle()功能:判断是否是标题
8.islower()功能:判断是否全部是小写
test = "XIxi" v1 = test.islower() print(v1) 输出: False
9.isupper()功能:判断是否全部是大写
test = "Xixi" v1 = test.isupper() print(v1) 输出: False
10.isidentifier()功能:是否字母和下划线开头,其他都是字母,数字下划线
11.startswith功能:以xxx开头:是否以a开头不是返回False
test = "backend 1.1.1.1" v = test.startswith('a') print(v) 输出: False
12.endswith功能:以xx结尾功:是否以1为结尾是返回True
test = "backend 1.1.1.1" v = test.endswith('1') print(v) 输出: True
十一.字符串格式化
1.字符串格式化是一种拼接字符串输出样式的手段,更灵活方便
(1)join拼接只能使用分隔符,且要求被拼接的是可迭代对象
(2)+拼接字符串还算方便,但是非字符串需要先转换为字符串才能拼接
2.在2.5版本之前,只能使用printf style风格的print输出
(1)printf-style formatting来自C语言的printf函数
(2)格式要求:
<1>占位符:使用%和格式字符组成,例如%s,%d等
s调用str(),r会调用repr()。所有对象都可以被这两个转换。
<2>占位符中还可插入修饰字符,例如%03d表示打印3个位置,不够前面补零
<3>format % values,格式字符串和被格式的值之间使用%分割
<4>values只能是一个对象,伙食一个和格式字符串占位符数目相等的元祖,或字典
3.printf-style formatting举例
举例1:传单个值(3d替换20)
>>> "I am %03d" % (20,) 'I am 020'
举例2:传单个值(%s可以接收任何类型值)
>>> 'I like %s.' % 'python' 'I like python.'
举例3:%3打印3位有效数字,.2小数点两位
>>>'%3.2f%%,0x%x,0X%02X' %(89.7654,10,15) '89.77%,0xa,0X0F'
举例4
>>> "I am %-5d" % (20,) 'I am 20 '
举例5:根据键拼接字符串%()s %()d传字典
>>> tpl = "i am %(name)s age %(age)d" % {"name": "xixi", "age": 18} >>> print(tpl) i am xixi age 18
举例6:打印浮点数percent %.2f
tpl = "percent %.2f" % 99.976234444444444444 print(tpl) 打印小数点后面俩位(四舍五入)输出: percent 99.98
举例7:%%打印百分号
tpl = 'percent %.2f %%' % 99.976234444444444444 print(tpl) 打印小数点后面两位的百分百输出: percent 99.98
举例8:%%打印百分号
tpl = 'percent %.2f %%' % 99.976234444444444444 print(tpl) 打印小数点后面两位的百分百输出: percent 99.98 %
举例9:给字符串加分隔符sep=''
print('root','x','0','0',sep=':') 输出: root:x:0:0
4.format()函数格式字符串语法---Python鼓励使用
语法:"{} {xxx}".format(*args, **kwargs)->str
花括号表示占位符
{}表示按照顺序匹配位置参数,{n}表示取位置参数索引为n的值
{xxx}表示在关键字参数中搜索名称一致的
{{}}表示打印花括号
(1)args是位置参数,是一个元祖
"{}:{}.format('192.168.1.1',8888),这就是按照位置顺序用位置参数替换前面的格式字符串的占位符中"
(2)kwargs是关键字参数,是一个字典
"{setver}{1}:{0}".format(8888,'192.1681.1.1',server='Web Server Info:'),位置参数按照序号匹配,关键字参数按照名次匹配
举例:根据名字替换:name替换xixi,a替换19
test = 'i am {name}, age {a}' print(test) v = test.format(name='xixi',a=19) print(v) 输出: i am {name}, age {a} i am xixi, age 19
3.访问元素
举例:根据出现的顺序替换:第一次出现0替换xixi,第二次出现1替换19
test = 'i am {0}, age {1}' print(test) v = test.format('xixi',19) print(v) 输出: i am {0}, age {1} i am xixi, age 19
4.对象属性方法访问
>>> from collections import namedtuple >>> Point = namedtuple('Point','x y') >>> p1 = Point(5,6) >>> p1.x 5 >>> p1.y 6 >>> "Point = ({{{0.x},{0.y}}})".format(p1) 'Point = ({5,6})'
5.对齐
举例:右边对齐
>>> '{0}*{1}={2:>02}'.format(3,2,2*3) '3*2=06'
举例:居中
>>> '{:^30}'.format('centered') ' centered '
举例:居中空格用*代替
>>> '{:*^30}'.format('centered') '***********centered***********'
6.进制
>>> "int:{0:d},hex:{0:x}:oct:{0:o}:bin:{0:b}".format(42) 'int:42,hex:2a:oct:52:bin:101010'
列表list
一.列表的特性
(1)一个队列,一个排列整齐的队伍
(2)列表内的个体称作元素,由若干元素组成列表
(3)元素可以是任意对象(数字,字符串,对象,列表等)
(4)列表内元素有顺序,可以使用索引
(5)线性的数据结构
(6)使用[ ]表示
(7)列表是可变的
(8)列表list,链表,queue(队列),stack的差异
(9)列表不能一开始就定义大小
二.列表list定义初始化
1.定义list列表初始化
语法:list():新建空列表
方式一:
>>> list()
[]
方式二:
>>> lst = [] >>> lst []
2.list(可迭代对象):可放可迭代对象初始化的新列表
>>> list(range(5))
[0, 1, 2, 3, 4]
3.定义list列表初始化
>>> list = [1, 12, 9, "age", ["西西", ["19", 10], "大西西"], "shishi", True] >>> list [1, 12, 9, 'age', ['西西', ['19', 10], '大西西'], 'shishi', True]
4.由加创建新列表+ - >list
连接操作,将两个列表连接起来
产生新的列表,原列表不变
本质上调用的是__add__()方法
>>> list = [11,12,13] >>> list1 = [1,2,3,4,5,6] >>> list + list1 [11, 12, 13, 1, 2, 3, 4, 5, 6]
5.由乘创建新列表* - >list
重复操作将本列表元素重复n次,返回新的列表
举例:list列表有一个元素1,list列表乘以5,相当于列表元素重复了5次
>>> list = [1] >>> list [1] >>> list = list*5 >>> list [1, 1, 1, 1, 1]
三.列表索引切片访问
(1)索引,也叫下标
(2)正索引:从左至右,从0开始,为列表中每一个元素编号
(3)负索引:从右至左,从-1开始
(4)正负索引不可以超界,否则引发异常
(5)为了理解方便,可以认为列表是从左至右排列的,左边是头部,右边是尾部,左边是下界,右边是上界
(6)列表通过索引访问list[index],index就是索引,使用中括号访问
(7)列表元素的取值
1.索引取值:取出列表第三个元素
li = [1, 12, 9, "age", ["西西", ["19", 10], "诗诗"], "xixi", True] print (li[3]) 输出: age
2.切片取值:取出列表(大于等于3小于5)的值,切片取值的结果也是一个列表
li = [1, 12, 9, "age", ["西西", ["19", 10], "诗诗"], "xixi", True] print (li[3:5]) 输出: ['age', ['西西', ['19', 10], '诗诗']]
四.列表的查询
1.通过值value,从指定区间查找列表内的元素是否匹配
语法:index(value,[start,[stop]])
匹配第一个就立即返回索引
匹配不到,抛出异常ValueError
举例:查找7在索引的第几位
>>> list=[1,5,7,'ab'] >>> list.index(7) 2
举例:从指定区间第三个位置开始匹配一次,返回3的索引位置是2
>>> list=[1,2,3,4,5,6,7] >>> list.index(3,1) 2
2.返回列表中匹配value的次数
语法:count(value) 举例:2这个元素出现几次 >>> list.count(2) 4
3.时间复杂度
index和count方法都是O(n)随着列表数据规模的增大,而效仿下降
4.内置函数len():取列表长度
举例:获取列表list的长度
>>> list=[1,2,3,4,5,6,7] >>> len(list) 7
五.列表的元素切片的修改
1.索引修改:把列表的第二个元素12换成777
语法:list[index] = value
li = [1, 12, 9, "age", ["西西", ["19", 10], "诗诗"], "alex", True] li[1] = 777 print (li) 输出: [1, 777, 9, 'age', ['西西', ['19', 10], '诗诗'], 'alex', True]
2.切片修改:把列表元第1个元素到第2个元素换成777和888
li = [1, 12, 9, "age", ["西西", ["19", 10], "诗诗"], "alex", True] li[1:3] = [777,888] print (li) 输出: [1, 777, 888, 'age', ['西西', ['19', 10], '诗诗'], 'alex', True]
六.列表增加,插入元素
1.增加append()功能:原来的值后追加
语法:append(object)->None
列表尾部追加元素,返回None
返回None就意味着没有新的列表产生,就地修改
时间复杂度是O(1)
li = [11, 22, 33, 22, 44] li.append(5) li.append("alex") li.append([1234,2323]) print(li) 输出: [11, 22, 33, 22, 44, 5, 'alex', [1234, 2323]]
2.插入insert()功能:在指定索引位置插入元素
语法:insert(index,object)->None
在指定的索引index处插入元素object
返回None就意味着没有新的列表产生,就地修改时间复杂度是O(1)
索引超越上界,尾部追加,超越下界,头部追加
li = [11, 22, 33, 22, 44] li.insert(0,99) print(li) 在列表第0个位置插入元素99输出: [99, 11, 22, 33, 22, 44]
3.extend()扩展原列表,参数:可迭代对象(可以被for循环)把要追加的值循环,把每一个元素做一个for循环扩展到列表的最后边
语法:extend(iteratable)->None(就地修改)
方法一:把可迭代对象列表扩展到li这个列表后
li = [11, 22, 33, 22, 44] li.extend([9898,"不得了"]) print(li) 输出: [11, 22, 33, 22, 44, 9898, '不得了']
方法二:把可迭代对象里的元素(字符串)扩展到li这个列表后
li = [11, 22, 33, 22, 44] li.extend("不得了") print(li) 输出: [11, 22, 33, 22, 44, '不', '得', '了']
七.列表删除元素
1.索引删除:的方式把列表的第二个元素12删除
li = [1, 12, 9, "age", ["西西", ["19", 10], "诗诗"], "alex", True] del li[1] print (li) 输出: [1, 9, 'age', ['西西', ['19', 10], '诗诗'], 'alex', True]
2.切片删除:把列表2-5的元素删除
li = [1, 12, 9, "age", ["西西", ["19", 10], "诗诗"], "alex", True] del li[2:6] print (li) 输出: [1, 12, True]
3.remove()功能:从左至右查找第一个匹配value的值,移除该元素,返回None,就地修改
语法:remove(value)_>None
li = [11, 22, 33, 22, 44] li.remove(22) print(li) 删除列表指定值第一个22输出: [11, 33, 22, 44]
4.pop()功能:不指定索引index,就从列表尾部弹出一个元素.指定索引index,就从索引处弹出一个元素,索引超界抛出IndexError错误
语法:pop([index])->item
方法一:
li = [11, 22, 33, 22, 44] v = li.pop() print(li) print(v) 删除列表最后一个值44并把这个删除的值44打印出来输出: [11, 22, 33, 22] 44
方法二:
li = [11, 22, 33, 22, 44] v = li.pop(1) print(li) print(v) 指定索引删除列表第二个值22并把这个删除的值22打印出来输出: [11, 33, 22, 44] 22
5.clear()功能:清除列表所有元素,剩下一个空元素(会引起垃圾回收)
语法:clear()->None
li = [11, 22, 33, 22, 44] li.clear() print(li) 输出: []
八.列表其它操作
1.reverse()功能:将当前列表进行翻转,就地修改
语法:reverse()->None
li = [11, 22, 33, 22, 44] li.reverse() print(li) 输出: [44, 22, 33, 22, 11]
2.sort()功能:列表的排序(默认不加参数是从小到大排序)
对列表元素进行排序,就地修改,默认升序
reverse为True,反转,降序
key一个函数,指定key如何排序
举例:利用reverse=True参数把列表从大到小排序
li = [11,44, 22, 33, 22] li.sort(reverse=True) print(li) 输出: [44, 33, 22, 22, 11]
3.利用in操作查找列表里有没有"age"元素
li = [1, 12, 9, "age", ["西西", ["19", 10], "诗诗"], "alex", True] v = "age" in li print (v) 输出: True
九.列表复制
1.浅拷贝(shadow copy):影子拷贝,也叫浅拷贝,遇到引用类型,只是复制了一个引用而已
语法:copy()->List
方式一:
>>> li = [11, 22, 33, 22, 44] >>> li2 = li.copy() >>> li2 [11, 22, 33, 22, 44] 内容一样: >>> li == li2 True id不一样: >>> id(li) 139821729157384 >>> id(li2) 139821729158088
2.深拷贝:copy模块提供了deepcopy(深拷贝)
>>> li = [1,[2,3,4],5] >>> li2 = li.copy() >>> li [1, [2, 3, 4], 5] >>> li2 [1, [2, 3, 4], 5] 改变li2里的[2,3,4]地址也改变了li里的[2,3,4] >>> li2[1][1] = 20 >>> li [1, [2, 20, 4], 5] >>> li2 [1, [2, 20, 4], 5]
十.列表的转换(数字转换不成列表)
1.字符串转换成列表(内部使用的for循环)
li = "adfasdfsdffdf" new_li = list(li) print(new_li) 输出: ['a', 'd', 'f', 'a', 's', 'd', 'f', 's', 'd', 'f', 'f', 'd', 'f']
2.列表转换成字符串(俩种方法)
方法一:列表中只有字符串,直接使用字符串的join方法
li = ["123","西西"] v = "".join(li) print(v) 输出: 123西西
方法二:列表中既有数字又有字符串,需要自己写一个for循环一个一个处理
li = [11,22,33,"123","西西"] s = "" for i in li: s = s + str(i) print(s) 输出: 112233123西西
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
元祖tupl
1.元祖的组成
元祖和列表十分类似,可以存储一系列的元素,元祖的元素不可被修改,元祖不能被增加或者删除,元祖相当于列表的二次加工
tu叫对象,元祖对应的类叫tuple
2.tuple类中提供的方法共6个
(1)书写格式
tu = (111,"alex",(11,22),[(33,44)],True,33,44,)
#元素不可被修改,不能被增加或者删除
(2)通过索引取值
tu = (111,"alex",(11,22),[(33,44)],True,33,44,) v = tu[0] print(v)
111
(3)通过切片取值
tu = (111,"alex",(11,22),[(33,44)],True,33,44,) v = tu[0:2] print(v)
(111, 'alex')
(4)可以被for循环(可迭代对象)
tu = (111,"alex",(11,22),[(33,44)],True,33,44,) for item in tu: print(item)
111
alex
(11, 22)
[(33, 44)]
True
33
44
(5)相互转换
s = "asdfasdf0" v = tuple(s) print(v)
('a', 's', 'd', 'f', 'a', 's', 'd', 'f', '0')
li = ["asdf","asdfasdf"] v = tuple(li) print(v)
('asdf', 'asdfasdf')
tu = ("asdf","asdf") v = list(tu) print(v)
['asdf', 'asdf']
元祖转换成字符串:如果元祖里都是字符串的话可以通过join方法直接把元祖转换成字符串
tu = ("asdf","asdf") v = "_".join(tu) print(v)
asdf_asdf
(6)元组的二极元素增删改(一级元素不可修改/删除/增加)
tu = (111,"alex",(11,22),[(33,44)],True,33,44,) v=tu[3] print(v) tu[3][0] = 567 print(tu)
[(33, 44)]
(111, 'alex', (11, 22), [567], True, 33, 44)
3.元祖的俩个基本方法
(1)tu.count()功能:去元祖中寻找,寻找子序列的出现次数
tu = (11,22,33,44,)
v = tu.count(22) print(v)
查找22出现的次数输出:
1
2.tu.index()功能:根据值获取当前值索引位置(左边优先)
tu = (11,22,33,44)
v = tu.index(33) print(v)
查找33出现的索引位置输出:
2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bytes(字节)
一.bytes定义:不可变字节序列
1.bytes()空bytes
2.bytes(int)指定字节的bytes,被0填充
3.bytes(iterable_of_ints)->bytes[0,255]的int组成的可迭代对象
>>> bytes([1,3,5]) b'\x01\x03\x05'
4.bytes(string,encoding,[,errors])->bytes等介于string.encode()
>>> bytes("abc","utf8") b'abc'
5.bytes(bytes_or_buffer)->immutable copy of bytes_or_buffer从一个字节序列或者buffer复出一个新的不可变的byters对象
6.使用b前缀定义
(1)只允许基本ASCII使用字符形式b
(2)使用16进制表示b"\x41\x61"
二.bytes操作
1.和str类型类似,都是不可变类型,所以方法很多都一样,只不过bytes的方法是输入bytes,输出是bytes
2.类方法bytes.fromhex(string)
(1)string必须是2个字符的16进制的形式,'6162 6a 6b',空格将被忽略
>>> bytes.fromhex('6162 09 6a 6b00') b'ab\tjk\x00'
3.hex()
返回16进制表示的字符串
>>> 'abc'.encode().hex() '616263'
4.索引
b'abcdef'[2]返回该字节对应的数,int类型
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bytearray(字节数组)
一.bytearray定义:可变的字节序列,相当于bytes的可变版本
(1)bytearray()空bytearray
(2)bytearray(int)指定字节的bytearray,被0填充
(3)bytearray(iterable_of_ints)->bytearray[0,255]的int组成的可迭代对象
(4)bytearrays(string,encoding,[,errors])->bytearray等介于string.encode(),不过返回可变对象
(5)bytearray(bytes_or_buffer)->immutable copy of bytes_or_buffer从一个字节序列或者buffer复出一个新的不可变的bytearray对象
二.bytearray操作:
1.append(int)尾部追加一个元素
2.insert(inedx,int)在指定索引位置插入元素
3.extend(iterable_of_ints)将一个可迭代的整数集合追加到当前bytearray
4.pop(index=-1)从指定索引上移除元素,默认从尾部移除
5.remove(value)找到第一个value移除,找不到抛ValueError异常
6.clear()清空bytearray
7.reverse()翻转bytearray,就地修改
三.字符串与bytes
1.字符串是字符组成的有序序列,字符可以使用编码来理解
2.bytes是字节组成的有序的不可变序列
3.bytearray是字节组成的有序的可变序列
编码与解码
<1>字符串按照不同的字符集编码encode返回字节序列bytes
encode(encoding = 'utf-8',errors='strict')->bytes
<2>字节序列按照不同的字符集解码decode返回字符串
bytes.decode(encoding="utf-8",errors="strict")->str
bytearray.decode(encoding="utf-8",errors="strict")->str
线性结构切片
1.可迭代for...in
(1)len()可以获取长度
(2)通过下标可以访问
(3)可以切片:学过的线性结构
(4)列表,元祖,字符串,bytes,bytearray
2.切片
(1)通过索引区间访问线性结构的一段数据
(2)sequence[start:stop]表示返回[start,stop)区间的子序列
(3)支持负索引
(4)start为0,可以省略
(5)stop为末尾,可以省略
(6)超过上界(右边界),就取到末尾;超过下界(左边界),取到开头
(7)start一定要在stop的左边
(8)[:]表示从头至尾,全部元素被取出,等效于copy()方法
3.切片举例
举例:切4-8
>>> 'www.xixi.com'[4:8] 'xixi'
举例:切0-8
>>> 'www.xixi.com'[:8] 'www.xixi'
举例:切4往后的
>>> 'www.xixi.com'[4:] 'xixi.com'
举例:切从头到尾
>>> 'www.xixi.com'[:] 'www.xixi.com'
举例:
>>> 'www.xixi.com'[:-1] 'www.xixi.co'
举例:
>>> 'www.xixi.com'[4:-4] 'xixi'
举例:
>>> 'www.xixi.com'[4:50] 'xixi.com'
举例:
>>> b'www.xixi.com'[-40:10] b'www.xixi.c'
举例:
>>> bytearray(b'www.xixi.com')[-40:4] bytearray(b'www.')
举例:元祖
>>> tuple('www.xixi.com')[4:8] ('x', 'i', 'x', 'i')
举例:列表
>>> list('www.xixi.com')[4:8] ['x', 'i', 'x', 'i']
4.步长切片
[start:stop:step]
step为步长,可以正,负整数,默认是1
step要喝start:stop同向,否则返回空序列
举例:
>>> 'www.wang.com'[4:8:2] 'wn'
第三类:键值对(包括集合,字典)
集合(set)
一.集合(set)
(1)可变的,无序的,不重复的元素,不可以索引,可以迭代
(2)无序排列的可hash值
(3)集合中元素必须是不可变类型(不可变类型包括数字,字符串,元祖)
二.set定义初始化
(1)迭代结果放到集合里
>>> s1 = set(range(5)) >>> s1 {0, 1, 2, 3, 4}
(2)把列表里的元素放到集合里
>>> s2 = set(list(range(5))) >>> s2 {0, 1, 2, 3, 4}
(3)把元祖,字符串,数字放到集合里
>>> s4={(1,2),3,'a'} >>> s4 {(1, 2), 'a', 3}
(4)通过set列表简化去重方
names=['shi','shi','xixi'] names=list(set(names)) print(names) 输出: ['shi', 'xixi']
(5)通过frozenset()定义不可变集合[不可变集合就不能删除或添加]
s=frozenset('hello') print(s) 输出: frozenset({'h', 'l', 'e', 'o'})
三.set增加
(1)add(elem):增加一个元素到set中,如果元素存在什么都不做
s = {1,2,3,4,5,6} s.add('xixi') s.add('shishi') print(s) 输出: {1, 2, 3, 4, 5, 6, 'xixi', 'shishi'}
(2)update(*others):合并其他元素到set集合中来,参数others必须是可迭代对象,就地修改
s1={1,2} s2={1,2,3} s1.update(s2) print(s1) 把s2的值更新到s1输出: {1, 2, 3}
(3)copy()拷贝方法:
s = {1,2,3,4,5,6} s1=s.copy() print(s1) 输出: {1, 2, 3, 4, 5, 6}
四.set删除
(1)remove(elem):从set中移除元素,元素不存在,抛出KeyError异常。
s = {1,2,3,4,5,6} s.remove(5) print(s) 输出: {1, 2, 3, 4, 6}
(2)discard(elem):从set中移除一个元素,元素不存在,什么都不做(删除元素不存在的情况下不会报错)
s = {1,2,3,4,5,6} s.discard(5555) print(s) 输出: {1, 2, 3, 4, 5, 6}
(3)pop()->item:移除并返回任意的元素(无序的随机删除一个)。空集返回KeyError异常
>>> s1 = set(range(5)) #s1集合内容 >>> s1 {0, 1, 2, 3, 4} #随机删除一个 >>> s1.pop() 0 #当前s1集合内容 >>> s1 {1, 2, 3, 4}
(4)clear():移除所有元素
s = {1,2,3,4,5,6} s.clear() print(s) 输出: set()
五.set修改,查询
(1)修改:要么删除,要么假如新的元素
(2)查询:非线性结构,无法索引
(3)遍历:可迭代所有元素
(4)成员运算符:in和not in判断元素是否在set中
六.set和线性结构
1.线性结构的查询时间复杂度是O(n),即随着数据规模的增大而增加耗时
2.set,dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关
3.可hash包括:
数值型int,float,complex
布尔值True,False
字符串string,bytes
元祖tuple
None
以上都是不可变类型,成为可哈希类型
4.set的元素必须是可hash的
七.集合数学方面的概念
1.全集:所有元素的集合。例如实数集,所有实数组成的集合就是全集
2.子集subset和超集superset:一个集合A所有元素都在另一个集合B内,A是B的子集,B是A的超集
3.真子集和真超集:A是B的子集,且A不等于B,A就是B的真子集,B是A的真超集
(1)语法:issubset(other),<=
举例:issubset判断:集合1是不是集合2的子集,如果是返回True不是返回False
s1={1,2} s2={1,2,3} print(s1.issubset(s2))#s1是s2的子集 print(s2.issubset(s1))#False 输出: True False
(2)判断当前集合是否是other的超集
语法:issuperset(other),>=
举例:issuperset判断:集合1是否是集合2的父集是返回True
s1={1,2} s2={1,2,3} print(s2.issuperset(s1))#s1是s2的父集 输出: True
4.并集:多个集合合并的结果,将两个集合A和B的所有元素合并到一起,组成的集合称作集合A与集合B的并集
语法:union(*others)返回和多个集合合并后的新的集合。运算符重载:|等同union
update(*others)和多个子集合并,就地修改,|=等同update
举例求并集:
python_l=['wang','shi','yao','xixi'] linux_l=['xixi','shi','yueyue'] p_s=set(python_l) l_s=set(linux_l) print(p_s,l_s) print(p_s.union(l_s)) #方式1 print(p_s|l_s) #方式2 输出: {'xixi', 'shi', 'yao', 'wang'} {'yueyue', 'xixi', 'shi'} {'xixi', 'shi', 'yueyue', 'yao', 'wang'} {'xixi', 'shi', 'yueyue', 'yao', 'wang'}
举例:调a的方法并b的元素,并好后赋值给a,
>>> a={1,2,3,4} >>> b={5,6,7,8} >>> c={9,10,11,12} >>> c=a.update(b) >>> a {1, 2, 3, 4, 5, 6, 7, 8} >>> b {8, 5, 6, 7} >>> c >>>
5.交集:多个集合的公共部分,集合A和B,由所有属于A且属于B的元素组成的集合
语法:intersection(*others)返回和多个集合的交集。&等同于intersection
intersection_update(*others)获取和多个集合的交集,并就地修改。&=等同于intersection_update
举例1:intersection()求交集:
python_l=['wang','shi','yao','xixi'] linux_l=['xixi','shi','yueyue'] p_s=set(python_l) l_s=set(linux_l) print(p_s,l_s) print(p_s.intersection(l_s)) #方式1 print(p_s&l_s) #方式2 输出: {'shi', 'xixi', 'yao', 'wang'} {'yueyue', 'xixi', 'shi'} {'xixi', 'shi'} {'xixi', 'shi'}
举例2:求a和b的交集
>>> a={1,2,3,4} >>> b={3,4,5,6} >>> a.intersection_update(b) >>> a {3, 4} >>> b {3, 4, 5, 6}
当前集合和另一个集合没有交集
语法:isdisjoint(other)没有交集返回True
举例:判断集合a和集合b有相交的部分,有返回False
>>> a={1,2,3,4} >>> b={3,4,5,6} >>> a.isdisjoint(b) False
6.差集:集合中除去和其他集合公共部分,集合A和B,由所有属于A且不属于B的元素组成的集合
difference(*thers)返回和多个集合的差集。-等同于difference
difference_update(*others)获取和多个集合的差集并就地修改。-=等同difference_update
举例:difference()求差集
python_l=['wang','shi','yao','xixi'] linux_l=['xixi','shi','yueyue'] p_s=set(python_l) l_s=set(linux_l) print(p_s,l_s) print('差集',p_s-l_s) #p_s-l_s方式1 print(p_s.difference(l_s)) #p_s-l_s方式2 print('差集',l_s-p_s) #l_s-p_s方式1 print(l_s.difference(p_s)) #l_s-p_s方式2 输出: {'yao', 'shi', 'xixi', 'wang'} {'yueyue', 'xixi', 'shi'} 差集 {'yao', 'wang'} {'yao', 'wang'} 差集 {'yueyue'} {'yueyue'}
7.对称差集:集合A和B,由所有不属于A和B的交集元素组成的集合,记作(A-B) U (B-A)
symmetric_differece(other)返回和另一个集合的差集。^等同于symmetric_differece
symmetric_differece_update(other)。^=等同于symmetric_differece_update
python_l=['wang','shi','yao','xixi'] linux_l=['xixi','shi','yueyue'] p_s=set(python_l) l_s=set(linux_l) print(p_s,l_s) p_s.difference_update(l_s) #相当于:p_s=p_s-l_s print(p_s) 输出: {'shi', 'wang', 'yao', 'xixi'} {'shi', 'xixi', 'yueyue'} {'wang', 'yao'}
举例:首先把俩合到一起在减去共同部分
python_l=['wang','shi','yao','xixi'] linux_l=['xixi','shi','yueyue'] p_s=set(python_l) l_s=set(linux_l) print(p_s|l_s) print('交叉补集',p_s.symmetric_difference(l_s)) #方式1 print('交叉补集',p_s^l_s) #方式2 输出: {'yao', 'xixi', 'wang', 'yueyue', 'shi'} 交叉补集 {'yao', 'wang', 'yueyue'} 交叉补集 {'yao', 'wang', 'yueyue'}
八.集合应用
1.共同好友:
你的好友A,B,C ,他的好友C,B,D,求共同好友
交集问题:
>>> {'A','B','C'}.intersection({'B','C','D'}) {'C', 'B'}
2.微信群提醒
XXX与群里其他人都不是微信好友关系
并集问题:
userid in (A|B|C|...)==False,A,B,C等是微信好友的并集,用户Id不在这并集中,说明他和任何人都不是朋友
3.权限判断
1)有一个API,要求权限同时具备A,B,C才能访问,用户权限是B,C,D,判断用户是否能够访问该API
API集合A,权限集合P
A-P={},A-P为空集,说明P包含A
A.issubset(P)也行,A是P的子集也行
A&P=A也行
2)有一个API,要求权限具备A,B,C任意一项就可以访问,用户权限是B,C,D,判断用户是否能够访问API
API集合A,权限集合P
A&P!={}就可以
A.isdisjoint(P)==False表示有交集
4.一个总任务列表,存储所有任务,一个完成的任务列表。找出未完成的任务
业务中,任务ID一般不可以重复
所有任务Id放到一个set中,假设为ALL
所有已完成的任务Id放到一个set中,假设为COMPLETED,它是ALL的子集
ALL=COMPLETED=UNCOMPLETED
九.集合练习
2组各10个数字的列表
每个数字取值范围[10,20]
统计20个数字中,一共有多少个不同的数字
2组中,不重复的数字有几个?分别是什么
2组中,重复的数字有几个?分别是什么
>>> a=[1,2,4,5,7,3,8,5,1,3] >>> b=[3,5,6,8,3,1,5,7,9,7] >>> s1=set(a) >>> s2=set(b) >>> print(s1) {1, 2, 3, 4, 5, 7, 8} >>> print(s2) {1, 3, 5, 6, 7, 8, 9} #统计20个数字中,一共有多少个不同的数字 >>> print(s1.union(s2)) {1, 2, 3, 4, 5, 6, 7, 8, 9} #2组中,不重复的数字有几个?分别是什么 >>> print(s1.symmetric_difference(s2)) {2, 4, 6, 9} #2组中,重复的数字有几个?分别是什么 >>> print(s1.intersection(s2)) {8, 1, 3, 5, 7}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
字典dict
一.字典dict
1.字典是python中唯一的映射类型(哈希表)
2.字典独享是可变的,无序的,但是字典的键(索引)必须不重复,并且一个字典以使用不同类
二.字典dict定义初始化
(1)d=dict()或d={}
(2)dict(**kwargs)使用name=value对初始化一个字典
info = { "k1": "v1", # 键值对(一个键K1一个值V1生成了一对) "k2": "v2" }
举例1:
info = { "k1": 18, "k2": True, "k3": [ 11, [], (), 22, 33, { 'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11,22), } ], "k4": (11,22,33,44) } print(info) 四组键值对输出: {'k1': 18, 'k2': True, 'k3': [11, [], (), 22, 33, {'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11, 22)}], 'k4': (11, 22, 33, 44)}
举例2:列表、字典不能作为字典的key, 布尔值(1,0)是可以做key但不能跟别的重复,数字,字符串,元祖可以做字典的key
info ={ 1: 'asdf', "k1": 'asdf', (11,22): 123, } print(info) 数字,字符串,元祖作为key输出: {1: 'asdf', 'k1': 'asdf', (11, 22): 123}
(3)dict(iterable,*kwarg)使用可迭代对象和name=value对构造字典,不可迭代对象的元素必须是一个二元结构
举例1:
>>> d=dict(((1,'a'),(2,'b'))) >>> d {1: 'a', 2: 'b'}
举例2:
>>> d=dict((([1,'a'],[2,'b']))) >>> d {1: 'a', 2: 'b'}
(4)dict(mapping,*kwarg)使用一个字典构造另一个字典
(5)d={'a':10,'b':20,'c':None,'d':[1,2,3]}
>>> d={'a':10,'b':20,'c':None,'d':[1,2,3]} >>> d {'c': None, 'a': 10, 'b': 20, 'd': [1, 2, 3]}
(6)类方法dict,fromkeys(iterable,value)
举例1:
>>> d=dict.fromkeys(range(5)) >>> d {0: None, 1: None, 2: None, 3: None, 4: None}
举例2:
>>> d=dict.fromkeys(range(5),0) >>> d {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
举例3
dic = { "k1": 'v1' } v = dict.fromkeys(["k1",123,"999"],123) print(v) 创建字典key是["k1",123,"999"]value是123输出: {'k1': 123, 123: 123, '999': 123}
三.字典元素的访问
1.d[key]返回key对应的值value
key不存在抛出KeyError异常
举例:通过[key]获取value的值
>>> d2=dict(([(1,3,4),{1,3,5,6,6}],)) >>> d2 {(1, 3, 4): {1, 3, 5, 6}} >>> d2[(1,3,4)] {1, 3, 5, 6}
举例:索引方式找到指定元素
info = { "k1": 18, 2: True, "k3": [ 11, [], (), 22, 33, { 'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11,22), } ], "k4": (11,22,33,44) } v = info['k1'] print(v) v = info[2] print(v) v = info['k3'][5]['kk3'][0] print(v) 通过字符串key="k1"输出: 18 通过数字key=2输出: True 通过元祖key=['k3']列表=[5]找到['kk3']的[0]输出: 11
2.get(key[,default])返回key对应的值value
key不存在返回缺省值,如果没有设置缺省值就返回None
举例1:通过get[key]获取value的值
>>> d=dict(([(1,3,4),{1,3,5,6,6}],)) >>> f=d.get((1,3,4)) >>> f {1, 3, 5, 6}
举例2:通过get[key]获取value的值,key不存在返回填入的缺省值50
>>> d=dict(([(1,3,4),{1,3,5,6,6}],)) >>> f=d.get((1),50) >>> f 50
举例3:
dic = { "k1": 'v1' } v = dic.get('k1',111111) print(v) 取字典的value值输出: v1
3.setdefault(key,[,default])返回key对应的值value。key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省为None
举例1:当key已存在,不设置,获取当前key对应的值:
dic = { "k1": 'v1', "k2": 'v2' } v = dic.setdefault('k1','123') print(dic,v) 存在不设置输出key对应的值: {'k1': 'v1', 'k2': 'v2'} v1
举例2:当key不存在,设置,获取当前key对应的值
dic = { "k1": 'v1', "k2": 'v2' } v = dic.setdefault('k1111','123') print(dic,v) 不存key值设置进去并把新value值拿到输出: {'k1': 'v1', 'k2': 'v2', 'k1111': '123'} 123
四.字典的增加和修改
(1)d[key]=value将key对应的值修改为value,key不存在添加新的kv对
增加举例:把100:100增加到字典d里
>>> d {(1, 3, 4): {1, 3, 5, 6}} >>> d[100]=100 >>> d {100: 100, (1, 3, 4): {1, 3, 5, 6}}
修改举例:把100:50修改字典d里100: 100
>>> d {100: 100, (1, 3, 4): {1, 3, 5, 6}} >>> d[100]=50 >>> d {100: 50, (1, 3, 4): {1, 3, 5, 6}}
(2)update([other])->None使用另一个字典的kv对更新本字典,key不存在,就添加。key存在,覆盖已经存在的key对应的值就地修改
增加举例:
dic = { "k1": 'v1', "k2": 'v2' } dic.update({'k1': '111111','k3': 123}) print(dic) 输出: {'k1': '111111', 'k2': 'v2', 'k3': 123}
修改举例:
dic.update(k1=123,k3=345,k5="asdf") print(dic) 输出: {'k1': 123, 'k2': 'v2', 'k3': 345, 'k5': 'asdf'}
五.字典删除
(1)pop(key[,default])key存在,移除它,并返回它的value,key不存在,返回给定的default。当default未设置,key不存在则抛出keyError异常
举例:
dic = { "k1": 'v1', "k2": 'v2' } v = dic.pop('k1') print(dic,v) 删除key="k1"的value值v1并打印出来: {'k2': 'v2'} v1
(2)popitem()移除并返回一个任意的键值对,字典为empty,抛出KeyError异常。
举例:
dic = { "k1": 'v1', "k2": 'v2' } k,v = dic.popitem() print(dic,k,v) 删除key="k2"的value值v2并打印出删除的键值对并获取打印: {'k1': 'v1'} k2 v2
(3)clear()清空字典
(4)del语句
举例:
info = { "k1": 18, 2: True, "k3": [ 11, [], (), 22, 33, { 'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11,22), } ], "k4": (11,22,33,44) } del info['k1'] del info['k3'][5]['kk1'] print(info) 根据字符串字符串key="k1"删除18,根据元祖key=['k3']列表=[5]找到['kk1']删除vv1输出: {2: True, 'k3': [11, [], (), 22, 33, {'kk2': 'vv2', 'kk3': (11, 22)}], 'k4': (11, 22, 33, 44)}
六.字典遍历
(1)for ...in dict
<1>遍历key
方式一:
for k in d: print(k)
方式二:
for k in d.keys(): print(k)
举例:
info = { "k1": 18, 2: True, "k3": [ 11, [], (), 22, 33, { 'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11,22), } ], "k4": (11,22,33,44) } for item in info: print(item) 遍历key输出: k1 2 k3 k4
<2>遍历value
方式一:
for k in d: print(d[k])
方式二:
for k in d.keys(): print(d.get(k))
通过info.values for循环values的值输出:
info = { "k1": 18, 2: True, "k3": [ 11, [], (), 22, 33, { 'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11,22), } ], "k4": (11,22,33,44) } for item in info.values(): print(item) 通过info.values for循环values的值输出: 18 True [11, [], (), 22, 33, {'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11, 22)}] (11, 22, 33, 44)
(2)for...in dict
遍历item,即kv对
方式一:
for item in d.items(): print(item)
方式二:
for k,v in d.items(): print(k,v)
举例:通过items获取字典出键值对
info = { "k1": 18, 2: True, "k3": [ 11, [], (), 22, 33, { 'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11,22), } ], "k4": (11,22,33,44) } for k,v in info.items(): print(k,v) 通过info.items for循环出键值对的值输出: k1 18 2 True k3 [11, [], (), 22, 33, {'kk1': 'vv1', 'kk2': 'vv2', 'kk3': (11, 22)}] k4 (11, 22, 33, 44)
总结:
python3中,keys,values,items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中
python2中,上面的方法会返回一个新的列表,占据新的内存空间
七.字典的key
(1)key的要求和set的元素要求一致,hashable可哈希才可以作为key
举例:
>>> d={1:0,2.0:3,"abc":None,('wang','xi','xixi'):"string",b'abc':'135'} >>> d {'abc': None, 1: 0, 2.0: 3, b'abc': '135', ('wang', 'xi', 'xixi'): 'string'}
八.defaultdict
(1)collections.defaultdict([default_factory[,...]])
第一个参数是default_factory,缺省是None,它提供一个初始化函数。当key不存在的时候,会调用这个工厂函数来生成key对应的value
举例:未用default_factory
d1 = {} for k in "abcde": #迭代顺序的结构字符串生成5个key:a,b,c,d,e for v in range(5): #value凑了5个数0,1,2,3,4 if k not in d1.keys(): #判断k在不在,如果不在 d1[k] = [] #初始化空列表 d1[k].append(v) print(d1) 返回: {'d': [0, 1, 2, 3, 4], 'b': [0, 1, 2, 3, 4], 'e': [0, 1, 2, 3, 4], 'c': [0, 1, 2, 3, 4], 'a': [0, 1, 2, 3, 4]}
举例:用default_factory
from collections import defaultdict d1 = {} d2 = defaultdict(list) #定义初始化函数,当有key缺值的时候凑上 for k in "abcde": #迭代顺序的结构字符串生成5个key:a,b,c,d,e for v in range(3): #value凑了3个数0,1,2 d2[k].append(v) #相当于a进来凑了3个数,b进来凑了3个数 print(d2) 返回: defaultdict(<class 'list'>, {'c': [0, 1, 2], 'd': [0, 1, 2], 'b': [0, 1, 2], 'e': [0, 1, 2], 'a': [0, 1, 2]})
九.OrderedDict
collections.OrderedDict([items])
有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
from collections import OrderedDict import random d = {'banana':3,'apple':4,'pear':1,'orange':2} print('当前字典:',d) keys = list(d.keys()) #把所有的key拿过来 random.shuffle(keys) #把key打乱 print('打乱的key:',keys) od = OrderedDict() #实例化OrderedDict()定义成od for key in keys: # od[key]=d[key] #把加入的顺序赋值 print(od) print(od.keys()) 返回:打乱后加入循环的顺序不变 当前字典: {'apple': 4, 'orange': 2, 'banana': 3, 'pear': 1} 打乱的key: ['pear', 'orange', 'apple', 'banana'] OrderedDict([('pear', 1), ('orange', 2), ('apple', 4), ('banana', 3)]) odict_keys(['pear', 'orange', 'apple', 'banana'])
~~~~~~~~~~~~~~~~~~