Python fullstack系列【2】Python数据类型
基本数据类型
学习一门编程语言通常都是先了解其不同的数据类型,以及每种数据类型对象所附带的方法,Python也不例外,本篇就详细介绍下这部分。
Python基本数据类型总览:
1.Booleans(布尔型):其值为True或False
2.数值型,包含以下几种:
integer(整数型)
float(浮点型)
fraction(分数)
复数
3.Strings(字符串) :元素不可修改
4.List(列表):有序可修改
5.Dictionary(字典):无序可修改的键值对
6.Tuple(元组):有序且不可修改
7.Set(集合):无序的,通常用来求交并集。
在说Python的数据类型前,先说说类和对象,Python.org是这样解释两者关系的:对象是对客观事物的抽象,而类是对对象的抽象。
dir(类名)可以查看改类都含有哪些方法,help(类名)是对这些类所含方法的详细描述。Python还可以help(类名.方法名),单独查看该方法的描述,如help(list.sort)
另外在pycharm中也可以通过Ctrl+类查看Python内部定义描述。
下面开始介绍Python的各种数据类型及常用方法。
1、布尔型
1或0
真或假
2、数字
int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
Python内存优化 -5~257是经常用的数,内部还用一份内存。(实测IDLE上到256,pycharm内到257,如a1 = 257 ,a2 = 257,a1 is a2,IDLE上显示为True,pycharm内显示为false)
超出范围自动转换为long int(3.5中貌似没这种长度限制)
long 类型:无限制
1 class int(object): 2 """ 3 int(x=0) -> int or long 4 int(x, base=10) -> int or long 5 6 Convert a number or string to an integer, or return 0 if no arguments 7 are given. If x is floating point, the conversion truncates towards zero. 8 If x is outside the integer range, the function returns a long instead. 9 10 If x is not a number or if base is given, then x must be a string or 11 Unicode object representing an integer literal in the given base. The 12 literal can be preceded by '+' or '-' and be surrounded by whitespace. 13 The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to 14 interpret the base from the string as an integer literal. 15 >>> int('0b100', base=0) 16 """ 17 def bit_length(self): 18 """ 返回表示该数字的时占用的最少位数 """ 19 """ 20 int.bit_length() -> int 21 22 Number of bits necessary to represent self in binary. 23 >>> bin(37) 24 '0b100101' 25 >>> (37).bit_length() 26 """ 27 return 0 28 29 def conjugate(self, *args, **kwargs): # real signature unknown 30 """ 返回该复数的共轭复数 """ 31 """ Returns self, the complex conjugate of any int. """ 32 pass 33 34 def __abs__(self): 35 """ 返回绝对值 """ 36 """ x.__abs__() <==> abs(x) """ 37 pass 38 39 def __add__(self, y): 40 """ x.__add__(y) <==> x+y """ 41 pass 42 43 def __and__(self, y): 44 """ x.__and__(y) <==> x&y """ 45 pass 46 47 def __cmp__(self, y): 48 """ 比较两个数大小 """ 49 """ x.__cmp__(y) <==> cmp(x,y) """ 50 pass 51 52 def __coerce__(self, y): 53 """ 强制生成一个元组 """ 54 """ x.__coerce__(y) <==> coerce(x, y) """ 55 pass 56 57 def __divmod__(self, y): 58 """ 相除,得到商和余数组成的元组 """ 59 """ x.__divmod__(y) <==> divmod(x, y) """ 60 pass 61 62 def __div__(self, y): 63 """ x.__div__(y) <==> x/y """ 64 pass 65 66 def __float__(self): 67 """ 转换为浮点类型 """ 68 """ x.__float__() <==> float(x) """ 69 pass 70 71 def __floordiv__(self, y): 72 """ x.__floordiv__(y) <==> x//y """ 73 pass 74 75 def __format__(self, *args, **kwargs): # real signature unknown 76 pass 77 78 def __getattribute__(self, name): 79 """ x.__getattribute__('name') <==> x.name """ 80 pass 81 82 def __getnewargs__(self, *args, **kwargs): # real signature unknown 83 """ 内部调用 __new__方法或创建对象时传入参数使用 """ 84 pass 85 86 def __hash__(self): 87 """如果对象object为哈希表类型,返回对象object的哈希值。哈希值为整数。在字典查找中,哈希值用于快速比较字典的键。两个数值如果相等,则哈希值也相等。""" 88 """ x.__hash__() <==> hash(x) """ 89 pass 90 91 def __hex__(self): 92 """ 返回当前数的 十六进制 表示 """ 93 """ x.__hex__() <==> hex(x) """ 94 pass 95 96 def __index__(self): 97 """ 用于切片,数字无意义 """ 98 """ x[y:z] <==> x[y.__index__():z.__index__()] """ 99 pass 100 101 def __init__(self, x, base=10): # known special case of int.__init__ 102 """ 构造方法,执行 x = 123 或 x = int(10) 时,自动调用,暂时忽略 """ 103 """ 104 int(x=0) -> int or long 105 int(x, base=10) -> int or long 106 107 Convert a number or string to an integer, or return 0 if no arguments 108 are given. If x is floating point, the conversion truncates towards zero. 109 If x is outside the integer range, the function returns a long instead. 110 111 If x is not a number or if base is given, then x must be a string or 112 Unicode object representing an integer literal in the given base. The 113 literal can be preceded by '+' or '-' and be surrounded by whitespace. 114 The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to 115 interpret the base from the string as an integer literal. 116 >>> int('0b100', base=0) 117 # (copied from class doc) 118 """ 119 pass 120 121 def __int__(self): 122 """ 转换为整数 """ 123 """ x.__int__() <==> int(x) """ 124 pass 125 126 def __invert__(self): 127 """ x.__invert__() <==> ~x """ 128 pass 129 130 def __long__(self): 131 """ 转换为长整数 """ 132 """ x.__long__() <==> long(x) """ 133 pass 134 135 def __lshift__(self, y): 136 """ x.__lshift__(y) <==> x<<y """ 137 pass 138 139 def __mod__(self, y): 140 """ x.__mod__(y) <==> x%y """ 141 pass 142 143 def __mul__(self, y): 144 """ x.__mul__(y) <==> x*y """ 145 pass 146 147 def __neg__(self): 148 """ x.__neg__() <==> -x """ 149 pass 150 151 @staticmethod # known case of __new__ 152 def __new__(S, *more): 153 """ T.__new__(S, ...) -> a new object with type S, a subtype of T """ 154 pass 155 156 def __nonzero__(self): 157 """ x.__nonzero__() <==> x != 0 """ 158 pass 159 160 def __oct__(self): 161 """ 返回改值的 八进制 表示 """ 162 """ x.__oct__() <==> oct(x) """ 163 pass 164 165 def __or__(self, y): 166 """ x.__or__(y) <==> x|y """ 167 pass 168 169 def __pos__(self): 170 """ x.__pos__() <==> +x """ 171 pass 172 173 def __pow__(self, y, z=None): 174 """ 幂,次方 """ 175 """ x.__pow__(y[, z]) <==> pow(x, y[, z]) """ 176 pass 177 178 def __radd__(self, y): 179 """ x.__radd__(y) <==> y+x """ 180 pass 181 182 def __rand__(self, y): 183 """ x.__rand__(y) <==> y&x """ 184 pass 185 186 def __rdivmod__(self, y): 187 """ x.__rdivmod__(y) <==> divmod(y, x) """ 188 pass 189 190 def __rdiv__(self, y): 191 """ x.__rdiv__(y) <==> y/x """ 192 pass 193 194 def __repr__(self): 195 """转化为解释器可读取的形式 """ 196 """ x.__repr__() <==> repr(x) """ 197 pass 198 199 def __str__(self): 200 """转换为人阅读的形式,如果没有适于人阅读的解释形式的话,则返回解释器课阅读的形式""" 201 """ x.__str__() <==> str(x) """ 202 pass 203 204 def __rfloordiv__(self, y): 205 """ x.__rfloordiv__(y) <==> y//x """ 206 pass 207 208 def __rlshift__(self, y): 209 """ x.__rlshift__(y) <==> y<<x """ 210 pass 211 212 def __rmod__(self, y): 213 """ x.__rmod__(y) <==> y%x """ 214 pass 215 216 def __rmul__(self, y): 217 """ x.__rmul__(y) <==> y*x """ 218 pass 219 220 def __ror__(self, y): 221 """ x.__ror__(y) <==> y|x """ 222 pass 223 224 def __rpow__(self, x, z=None): 225 """ y.__rpow__(x[, z]) <==> pow(x, y[, z]) """ 226 pass 227 228 def __rrshift__(self, y): 229 """ x.__rrshift__(y) <==> y>>x """ 230 pass 231 232 def __rshift__(self, y): 233 """ x.__rshift__(y) <==> x>>y """ 234 pass 235 236 def __rsub__(self, y): 237 """ x.__rsub__(y) <==> y-x """ 238 pass 239 240 def __rtruediv__(self, y): 241 """ x.__rtruediv__(y) <==> y/x """ 242 pass 243 244 def __rxor__(self, y): 245 """ x.__rxor__(y) <==> y^x """ 246 pass 247 248 def __sub__(self, y): 249 """ x.__sub__(y) <==> x-y """ 250 pass 251 252 def __truediv__(self, y): 253 """ x.__truediv__(y) <==> x/y """ 254 pass 255 256 def __trunc__(self, *args, **kwargs): 257 """ 返回数值被截取为整形的值,在整形中无意义 """ 258 pass 259 260 def __xor__(self, y): 261 """ x.__xor__(y) <==> x^y """ 262 pass 263 264 denominator = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 265 """ 分母 = 1 """ 266 """the denominator of a rational number in lowest terms""" 267 268 imag = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 269 """ 虚数,无意义 """ 270 """the imaginary part of a complex number""" 271 272 numerator = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 273 """ 分子 = 数字大小 """ 274 """the numerator of a rational number in lowest terms""" 275 276 real = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 277 """ 实属,无意义 """ 278 """the real part of a complex number""" 279 280 int
3、列表
创建列表这种数据类型后,其实是通过列表这个类来创建对象,这个对象所有的方法如下。
dir (list) 列出列表这个对象的所有方法:
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
注:带__ x__的方法这里先不用关注,这是Python内置的方法,例如执行append方法,Python内部就会调用__add__方法,后面关于面向对象的博文中会详细介绍。
基本操作包括:
- 添加
- 清空
- 复制
- 计数
- 扩展
- 索引
- 插入
- 弹出
- 删除
- 反转
- 排序
创建列表:
1 >>> names=['bolen', 'yy', 'kity', 'max', 'hack'] 2 或names=list(['bolen', 'yy', 'kity', 'max', 'hack'])
切片
1 >>> names 2 ['bolen', 'yy', 'kity', 'jack', 'lily'] 3 >>> names[0] #元素从0开始排序 4 'bolen' 5 >>> names[0:2] #包前不包后 6 ['bolen', 'yy'] 7 >>> names[0:-1] #最后一个元素是-1 8 ['bolen', 'yy', 'kity', 'jack'] 9 >>> names[:-1] #等同于0:-1,:前不写的话默认是0,:后面不写默认是到-1 10 ['bolen', 'yy', 'kity', 'jack'] 11 12 >>> names[2:-1] 13 ['kity', 'jack'] 14 >>> names[:-1] 15 ['bolen', 'yy', 'kity', 'jack'] 16 17 >>> names[2:] #如果想取到最后一个元素,就不写-1. 18 ['kity', 'jack', 'lily'] 19 >>> names[0:] 20 ['bolen', 'yy', 'kity', 'jack', 'lily'] 21 22 >>> names[:] 23 ['bolen', 'yy', 'kity', 'jack', 'lily'] 24 >>> names[::2] # :2代表每隔一个元素取一个 25 ['bolen', 'kity', 'lily'] 26 >>>
append
1 names 2 ['bolen', 'yy', 'kity', 'max', 'hack'] 3 names.append('god') 4 names 5 ['bolen', 'yy', 'kity', 'max', 'hack', 'god']
clear
1 names.clear()
copy
1 name_new=names.copy() #要注意深浅拷贝的区别,并且copy和直接将一个变量赋值给另一个变量,数据在内存中的存储是有区别的。详见下一篇 2 等同于name_new=names
count
1 names.count('bolen')#针对某个具体元素出现的次数
extend&insert
1 >>> names.insert(2,'插入') #从kity前面插进去~ insert 方法需要指定插入位置 2 >>> names 3 ['bolen', 'yy', '插入', 'kity', 'max', 'hack', 'god'] 4 nums=[6,7,8,9] 5 >>> names+nums 6 ['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god', 6, 7, 8, 9] 7 >>> names 8 ['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god'] 9 >>> names.extend(nums) 10 >>> names 11 ['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god', 6, 7, 8, 9]
index(或者列表元素的下标)
1 >>> names.index('bolen') 2 0 3 >>> names.index('hack') 4 4
删除(del\pop\remove)
1 >>> del names[2] #只能指定元素下标 2 >>> names 3 ['bolen', 'yy', 'kity', 'max', 'hack', 'god'] 4 >>> names=['bolen', 'yy', '换个姿势', 'kity', 'max', 'hack', 'god'] 5 >>> names.pop() #默认弹出最后一个元素,pop后可加下标 6 god 7 >>> names.remove('max') #只能指定具体的元素,不能指定下标。 8 >>> names 9 ['bolen', 'yy', '换个姿势', 'kity', 'hack']
sort&reverse
1 >>> names.sort()#Python3.0中不能对不同数据类型混合排序了 2 Traceback (most recent call last): 3 File "<pyshell#43>", line 1, in <module> 4 names.sort() 5 TypeError: unorderable types: int() < str() 6 7 >>> nums 8 [6, 7, 8, 9, 1, 2, 4, 6, 9] 9 >>> nums.sort() 10 >>> nums 11 [1, 2, 4, 6, 6, 7, 8, 9, 9] 12 13 >>> names 14 ['bolen', 'bolen', 'god', 'hack', 'kity', 'max', 'yy', '换个姿势'] 15 >>> names.append('allen') 16 >>> names 17 ['bolen', 'bolen', 'god', 'hack', 'kity', 'max', 'yy', '换个姿势', 'allen'] 18 >>> names.sort() 19 >>> names 20 ['allen', 'bolen', 'bolen', 'god', 'hack', 'kity', 'max', 'yy', '换个姿势'] 21 --------------------------------------------------------- 22 **reverse 23 >>> names.reverse() 24 >>> names 25 ['换个姿势', 'yy', 'max', 'kity', 'hack', 'god', 'bolen', 'bolen', 'allen'] 26 >>> nums.reverse() 27 >>> nums 28 [9, 9, 8, 7, 6, 6, 4, 2, 1]
4、元组
元组其实就是不可变的列表,元组中的元素在创建之后不可被修改。
1 a_tuple=('bolen','a','jack','nick','name') 2 >>> a_tuple 3 ('bolen', 'a', 'jack', 'nick', 'name') 4 >>> a_tuple[0] 5 'bolen' 6 >>> a_tuple[-1] 7 'name' 8 >>> a_tuple[:-2] 9 ('bolen', 'a', 'jack')
元组只能用于查看和切片,对元组切片会产生新的元组,对列表切片也会产生新的列表。
元组只有两个方法,count和index。
那么元组和列表的区别是什么呢?
元组与列表对比
劣势:
元组中的元组是不可变的,所以也就没有了列表中的pop、remove、insert、appand、extend等方法。
优势
1、元组比列表访问速度快,如果只是想写入元素,不对元素作变更,请用元组;
2、元组对元素写保护,相对列表会使代码更安全;
3、元组可作为字典键使用,列表由于是可变的,不会别用作字典键。
但要注意的是元组中的元素不可变是相对的,例如元组可以接受列表作为元素(嵌套),且这里的列表还是可变的,列表也可以接受元组作为元素。
1 #便捷的为多变量赋值 2 >>> n=(1,2,3) 3 >>> x,y,z=n 4 >>> x 5 1 6 >>> y 7 2 8 >>> z 9 3 10 #但实测列表也是可以这么赋值的 11 >>> (MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7) 12 >>> MONDAY 13 0 14 >>> [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY] = range(7) 15 >>> TUESDAY
5、字符串
字符串类型是不可变的,其常用方法如下:
- 移除空白
- 分割
- 长度
- 索引
- 切片
name.capitalize() #首字母大写 name.casefold() #大写全部变小写 >>> name='bolen' >>> name.capitalize() 'Bolen' >>> name.casefold() 'bolen' name.center() #定义宽度和添加的字符 >>> name.center(50,'=') '======================bolen=======================' name.count('bo') 统计 bo出现次数 name.encode() 将字符串编码成bytes格式 >>> new=name.encode() >>> type(new) <class 'bytes'> name.endswith("en") 判断字符串是否以 en结尾 >>> 'Bolen\tZhang'.expandtabs(4) 'Bolen Zhang 将\t转换成多长的空格 name.find('A') 查找A,找到返回其索引, 找不到返回-1 format : >>> msg = "my name is {}, and age is {}" >>> msg.format("bolen",32) 'my name is bolen, and age is 32' >>> msg = "my name is {1}, and age is {0}" >>> msg.format("bolen",32) 'my name is 32, and age is bolen' >>> msg = "my name is {name}, and age is {age}" >>> msg.format(age=32,name="bolen") 'my name is ale, and age is 22' format_map >>> msg.format_map({'name':'jack','age':22}) 'my name is jack, and age is 22' #输入字典 msg.index('a') 返回a所在字符串的索引 >>> 'adf9'.isalnum() True >>> '9'.isalnum() True >>> '9'.isdigit() 是否整数 name.isnumeric name.isprintable name.isspace name.istitle >>> name.title() 'Bo Le Na' >>> name1=name.title() >>> name1 'Bo Le Na' >>> name1.istitle() True name.isupper "|".join(['alex','jack','rain']) 'alex|jack|rain' maketrans >>> intab = "aeiou" #This is the string having actual characters. >>> outtab = "12345" #This is the string having corresponding mapping character >>> trantab = str.maketrans(intab, outtab) #先自己制作转换关系表。 >>> str = "this is string example" >>> str.translate(trantab) 'th3s 3s str3ng 2x1mpl2' msg.partition('is') 输出 ('my name ', 'is', ' {name}, and age is {age}') >>> "alex li, chinese name is lijie".replace("li","LI",1) 'alex LI, chinese name is lijie' msg.swapcase 大小写互换 >>> msg.zfill(40) > """方法返回指定长度的字符串,原字符串右对齐,前面填充0。""" '00000my name is {name}, and age is {age}' >>> 'Hello world'.ljust(20,"-") 'Hello world---------' >>> 'Hello world'.rjust(20,"*") '*********Hello world' name_define='tWst@123' >>> name_define.isidentifier() False #检测一段字符串可否被当作标志符,即是否符合变量命名规则 def strip(self, chars=None): """ 移除两端空白 """ >>> name=' bole ' >>> name ' bole ' >>> name.strip() 'bole'
6、字典
创建字典:
person = {"name": "bolen", 'age': 18} 或 person = dict({"name": "bolen
", 'age': 18})
常用操作:
- 索引
- 新增
- 删除
- 键、值、键值对
- 循环
- 长度
字典是键值对的无序集合,且key不能重复。
#定义 >>> userdb {'user002': 'kobe', 'user003': 'kity', 'user001': 'bolen', 'user004': 'tom'} #增加 >>> userdb['user005']='baby' >>> userdb {'user002': 'kobe', 'user003': 'kity', 'user001': 'bolen', 'user004': 'tom', 'user005': 'baby'} #修改 >>> userdb['user005']='angela' >>> userdb {'user002': 'kobe', 'user003': 'kity', 'user001': 'bolen', 'user004': 'tom', 'user005': 'angela'} #删除 字典的删除有三种方式:pop,del和popitem,其中前两种较常用。最后一种由于是随机删除元素的,一般来说并没什么卵用。 >>> userdb.pop('user003') 'kity' >>> userdb {'user002': 'kobe', 'user001': 'bolen', 'user004': 'tom', 'user005': 'angela'} >>> del userdb['user004'] >>> userdb {'user002': 'kobe', 'user001': 'bolen', 'user005': 'angela'} >>> userdb.popitem() ('user002', 'kobe') #查找 >>> 'user002' in userdb #标准用法 True >>> userdb.get('user004') 'tom' >>> userdb['user004'] 'tom' >>> userdb.get('user005')#注意get不到key就没返回值,而下面的取法,get不到key就会报错。 >>> userdb['user005'] Traceback (most recent call last): File "<pyshell#165>", line 1, in <module> userdb['user005'] KeyError: 'user005' #多级嵌套 av_catalog = { "欧美":{ "www.youporn.com": ["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] }, "日韩":{ "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] }, "大陆":{ "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } } av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" print(av_catalog["大陆"]["1024"]) #ouput ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来'] 其他 #获取keys >>> userdb.keys() dict_keys(['user002', 'user003', 'user001', 'user004']) #获取values >>> userdb.values() dict_values(['kobe', 'kity', 'bolen', 'tom']) #设置默认值,注意此方法是新加,不可修改。 >>> userdb {'user002': 'kobe', 'user003': 'kity', 'user001': 'bolen', 'user006': '希特勒', 'user004': 'tom'} >>> userdb.setdefault('user006','bolenzhang') '希特勒' >>> userdb.setdefault('user006','bolenzhang') '希特勒' >>> userdb {'user002': 'kobe', 'user003': 'kity', 'user001': 'bolen', 'user006': '希特勒', 'user004': 'tom'} >>> userdb.setdefault('user001','bolenzhang') 'bolen' >>> userdb {'user002': 'kobe', 'user003': 'kity', 'user001': 'bolen', 'user006': '希特勒', 'user004': 'tom'} #update >>> newb={'user110':'michal',9:6,1:1} >>> newb {9: 6, 'user110': 'michal', 1: 1} >>> userdb.update(newb) >>> userdb {1: 1, 'user001': 'bolen', 'user003': 'kity', 'user006': 'xitele', 'user004': 'tom', 9: 6, 'user002': 'kobe', 'user110': 'michal'} #获取items >>> userdb.items() dict_items([(1, 1), ('user001', 'bolen'), ('user003', 'kity'), ('user006', 'xitele'), ('user004', 'tom'), (9, 6), ('user002', 'kobe'), ('user110', 'michal')]) #通过一个列表生成默认dict,有个没办法解释的坑,少用吧这个 >>> dict.fromkeys([1,2,3],'test') {1: 'test', 2: 'test', 3: 'test'} #字典的循环 #方法1 >>> for key in userdb: print(userdb[key]) 1 bolen kity xitele tom 6 kobe michal >>> userdb {1: 1, 'user001': 'bolen', 'user003': 'kity', 'user006': 'xitele', 'user004': 'tom', 9: 6, 'user002': 'kobe', 'user110': 'michal'} #方法2 >>> for k,v in userdb.items(): print (k,v) 1 1 user001 bolen user003 kity user006 xitele user004 tom 9 6 user002 kobe user110 michal
7、集合
集合是一个无序的,不重复的数据组合,它的主要作用如下:
1、去重,把一个列表变成集合,就自动去重了
2、关系测试,测试两组数据之前的交集、差集、并集等关系
# 去重 >>> b=[1,1,2,3,4,4] >>> s = set(b) >>> s {1, 2, 3, 4} s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) 基本操作: t.add('x') # 添加一项 s.update([10,37,42]) # 在s中添加多项 使用remove()可以删除一项: t.remove('H') len(s) set 的长度 x in s 测试 x 是否是 s 的成员 x not in s 测试 x 是否不是 s 的成员 s.issubset(t) s <= t 测试是否 s 中的每一个元素都在 t 中 s.issuperset(t) s >= t 测试是否 t 中的每一个元素都在 s 中 s.union(t) s | t 返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) s & t 返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t) s - t 返回一个新的 set 包含 s 中有但是 t 中没有的元素 se.difference_update(be)#找se中存在,be中不存在,并更新se.
se.discard()
se.remove()#同上,但是没有会报错
se={11,22,33}
be={22,95}
#对称差集(互为差集的合计)
se.symmetric_difference(be)
se.symmetric_difference_update(be)
#交集
ret=se.intersection(be)
ret=se.intersection_update(be)
#有交集是false,没交集True.
se.isdisjoint(be)
#父集、子集
se.issubset(be)
se.issuperset(be)
#并集
ret=se.union(be)
se.update(be)#把se更新了
se.update([444,555,666])
#pop可以拿到移除元素的返回值(集合是无序的,不一定pop谁)
ret=se.pop()
s.symmetric_difference(t)
s ^ t
返回一个新的 set 包含 s 和 t 中不重复的元素
s.copy()
返回 set “s”的一个浅复制
其他
1、range
>>> for i in range(1,10):
print(i)
range(1, 10, 2)
# 结果:[1, 3, 5, 7, 9]
range(30, 0, -2)
# 结果:[30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2]
2、enumrate
为可迭代的对象添加序号
li = [11,22,33]
for k,v in enumerate(li, 1):
print(k,v)