python是属于弱类型语言,在定义数据类型之前,不须要先声明数据类型。相对应的在强类型语言中(比如c、java等),如果在定义数据之前,没有声明数据类型这回报错。
python3 中,所指的数据类型,并非变量的,而是变量所指内存地址中储存的数据的基本类型。有Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Set(集合)、Dictionary(字典),可以分为两大类:
不可变数据类型:Number(数字)、String(字符串)、Tuple(元组)
可变数据类型:List(列表)、Set(集合)、Dictionary(字典)
数据类型 |
语法格式 |
基本操作(增删改查) |
|||
增加/改动 |
删除 |
查找 |
其他常用函数或方法 |
||
Number (数字) |
python3支持 int、float、bool、complex(复数) 在pyhotn2.x中,还有长整形long |
不可变 |
type(); isinstance(); 数学函数类; float(); real(); |
||
String (字符串) |
字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 转义特殊字符。 |
不可变 |
del; |
count(); |
str();
casefold() zfill() ; rjust(); ljust(); |
Booleans 布尔值 |
True; False。 |
||||
List (列表)。序列 |
列表是写在方括号 [] 之间、用逗号分隔开的元素列表。列表可以嵌套 |
append(); list1+list2; |
del; pop; remove; clear; |
li1[3]; index(‘abc’) count(‘abc’) in; |
list(); |
Tuple (元组)。序列 |
不可变列表,只可访问 |
del; |
tup1[0]; index(); count() in |
tuple(); |
|
Dictionary (字典) |
字典是python中唯一的映射类型数据,key=>value,其中key值必须是不可变数据类型,并且唯一。形式储存数据,用{}包括内容 |
dic1["m"] = "add"; dic1.setdefault("k",'v') |
clear; pop; del; popitem |
dic1["m"] dic1.get() dic1.keys() dic1.values() dic1.items()
|
type();len();cmp(); keys();values();items(); iteritems(); |
Set (集合) |
1.不同元素组成 |
add();update(); |
remove(); discard(); pop(); clear(); |
issuperset();issubset(); intersection();union(); difference(); symmetric_diference() |
其他需要注意的要点:
Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典)、Set(集合)、数据类型扩展
python基本数据类型中,列表、元组、字符串属于序列,序列都可以进行的操作包括索引,切片,加,乘,检查成员。
python3支持 int、float、bool、complex(复数),在pyhotn2.x中,还有长整形long
Python 使用反斜杠()转义特殊字符,如果不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串。另外,反斜杠()可以作为续行符,表示下一行是上一行的延续。字符串连接中,除了可以用join()方法,还可以用 + 运算符连接在一起,此外用 * 运算符重复。
三引号,‘’‘ ’‘’ 或者 “”“ ”“” ,可以实现字符串的多行定义、格式化输出等
‘’或者“”表示的是空字符串,判断的时候,对于任意的字符串,空字符串都在里面。即如果用in来判断的时候,空字符串in任意的字符串,结果都是True
注意的是None表示的是一个空对象,而不是空字符串
1 # !/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 str1 = 'abcdefg0101ABC字符串' 5 str2 = '123.456' 6 str3 = ' abc def' 7 str4 = 'a{addmsg1}b{addmsg3}c{addmsg1}d{addmsg2}efg' 8 # #------------主要的检测方法----------------- 9 # print(str1.isalpha()) # 判断是否全都是字母 10 # print(str1.isalnum()) # 判断是否只有字母和数字 11 # print(str2.isnumeric()) # 检测字符串是否只由数字组成。这种方法是只针对unicode对象。 12 # print(str2.isdigit()) # 检测是否只有数字组成 13 # print(str2.isdecimal()) # 检测是否只由数字组成,包括汉字的数字、罗马数字。只针对unicode对象。 14 # print(str1.isidentifier()) # 用来判断变量名是否合法 15 # print(str1.islower()) # 检测是否全都是小写字母 16 # print(str1.isupper()) # 检测是否全都是大写字母 17 # print(str2.isprintable()) # 检测是否可打印,可判断包含转译字符。Unicode中“Other” “Separator”不可打印,不包括空格 18 # print(str1.isspace()) # 检测是否仅有空格 19 # print(str1.istitle()) # 检测是否是标题,首字母大写 20 # print(str1.endswith("C")) # 检测结束字符 21 # print(str1.startswith("abc")) # 检测开始字符或字符串 22 # #-----------主要的格式变化方法---------------- 23 # print(str1.strip()) # 去处多余字符,如空格、制表符、换行符,还可以制定字符内容 24 # print(str1.lstrip()) 25 # print(str1.rstrip()) 26 27 28 # print(str1.split(" ")) # 用指定的字符划分,得到的结果存储在列表中,可指定最多的分组数 29 # print(str1.rsplit()) # 从右侧开始划分 30 # print(str1.partition("0")) # 分组,保留划分用的元素 31 32 33 # print(str1.center(20,"*")) # 指定最少占用的空间大小,对象放中间。超过不要紧,不够用指定字符填充 34 # print(str1.ljust(20,'<')) # 内容对象在左边 35 # print(str1.rjust(20,'>')) # 内容对象在右边 36 # print(str1.zfill(30)) # 内容对象在右边,不足的空间用0补充 37 38 # print(str1.capitalize()) # 首字母大写,其他的英文小写 39 # print(str1.upper()) # 所有的英文字母变大写 40 # print(str1.lower()) # 所有的英文字母变小写 41 # print(str1.casefold()) # 把包括英文字母在内的能变小写的字母都变小写,如法语/俄语等 42 # print(str1.swapcase()) # 大写的小写,同时小写的变大写 43 44 # print(str1.count("0")) # 计数,也可以指定起止范围 45 46 # print(str1.encode('utf-8')) # 字符编码,很重要 47 # print(str1.encode('utf-8').decode('utf-8')) # 字符编码后解码 48 49 # print(str3) 50 # print(str3.expandtabs()) # 把字符串中的 tab 符号(' ')转为空格,tab 符号(' ')默认的空格数是 8 51 52 # print(str1.find("z")) # 作用类似于index,但没有的时候返回-1 53 # print(str1.index('z')) # 返回指定字符串的索引,没有的时候,报错 54 55 # print(str4.format(addmsg1='1#',addmsg2='2#',addmsg3='3#')) # 根据锚点高效替换 56 # print(str4.format_map({'addmsg1':'map1#','addmsg2':'map2#','addmsg3':'map3#'})) # 根据锚点高效替换,键值对形式 57 58 # print("*中*间*".join(str1)) # 用指定的字符串,把序列(包括字符串、列表等)的元素,拼接起来 59 60 61 # screat1="abcdefg" # 替换,加密 62 # screat2="1234567" 63 # transtab="".maketrans(screat1,screat2) 64 # print(transtab) 65 # print(str1.translate(transtab)) 66 67 # print(str1.replace('1','!')) #替换 68 69 70 71 list = ['123','试试','zhangsan'] 72 msg = input('>>').strip() 73 print(msg) 74 if msg=='': 75 print('空') 76 for item in list: 77 if msg in item: 78 print(item)
在对字符串中包括的数据进行类型判断时(主要是数字、字母,较为复杂的可考虑正则表达式)。常见的方法有:
str.isalnum() 所有字符都是数字或字母
str.isdigit() 所有字符都是数字
str.isalpha() 所有字符都是字母
str.islower() 所有字符都是小写
str.isupper() 所有字符都是大写
str.istitle() 所有单词都是首字母大写,像标题
str.isspace() 所有字符都是空白字符或 或 或
可以实现存储较大量的信息,并且存储信息之间是相互独立的。
查询速度随数据量增大而变慢,但运行过程节省内存空间,省资源。
步长,取值的间隔长度。常见在循环语句、切片等操作。步长取正值,表示正向。步长取负值表示逆向取值,另外,也可以轻松实现反转。
一些增删改查的例子:
1 # !/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # 定义列表 5 li_1 = ['zhangsan','lisi','wangwu'] 6 7 8 9 # # 增 10 # li_1.append('zhaoliu') 11 # print("追加——》",li_1) 12 # 13 # li_1.insert(2,"insert2") 14 # print("插入——》",li_1) 15 # 16 # 17 # li_2 = ['打酱油2'] 18 # li_3=li_1+li_2 19 # print('+'+'后的效果',li_1,' ',li_3) 20 # 21 # li_1.extend(li_2) 22 # print("extend效果——》",li_1) 23 24 25 # 删 26 # li_1.pop() # 如果不加参数,删除并返回最后一个值,用变量来接收的话,可理解为从管道中取值,当列表为空,报错 27 # print(li_1) 28 # li_1.pop(1) 29 # print("pop上面未指定,这个指定——》",li_1) 30 # li_1.remove(li_1[2]) # remove必须是列表中存在的元素,否则会报错 31 # print("remove打酱油——》",li_1) 32 33 # 34 # 35 # 36 # del li_1[0] 37 # print('del删了第一个',li_1) 38 # del li_2 39 # print(li_2)此时已经将li_2完全删除,再调用会报错 40 # 41 # 42 # 43 # # 改 44 # li_1[1]='改动1' 45 # print(li_1) 46 # 47 # # 查 48 # print("查找例子1",li_3[0]) 49 # print("查找例子2",li_3.index('wangwu')) 50 # print("查找例子3","打酱油2" in li_3 ) 51 # print(li_1.index("zhangsan")) #查取索引,如果没有,报错 52 # print(li_1.count("zhagnsan")) 53 54 55 # #切片 56 # print(li_1[1:2]) 57 # print(li_1[-2: ]) 58 # print(li_1[-2: :-1]) 59 60 # 反转 61 # print(li_1[::-1]) # 只是实现了逆向输出,原列表实际排序不变 62 # print(li_1) 63 # li_1.reverse() # 改变原列表的排序,直接反转 64 # print(li_1) 65 66 # # 排序 67 # li_1.sort() # 默认的是按照ascii码表排序,数字和字符串在python3.x中是不能同时排序的 68 # print(li_1) 69 70 71 # #--------------列表操作小结----------------------- 72 # names=['金角大王','黑姑娘','rain','eva','狗蛋','银角大王','eva'] 73 # print('第2个eva索引:',names.index('eva',names.index('eva')+1)) 74 # re_names=names[::-1] 75 # print("切片反转",re_names) 76 # for i in range(len(names)): 77 # if i%2==1: 78 # print('打印索引为奇数的',names[i]) 79 # names[names.index('eva',names.index('eva')+1)]='EVA' 80 # print('修改第2个eva为EVA',names)
字典的查找速度快尤其是在数据量大的情况下更为明显,但消耗内存大。简单点理解,主要是由于对key值进行了hash,并且存储的时候,对hash值进行了排序存在列表空间中。在查询过程中,对输入值进行hash以后,在存储hash的空间中进行快速查找。
字典的遍历有两种常见方式,
1 #方式一: 2 for i in dic1: 3 print(i) #默认遍历key值 4 print(dic1[i]) 5 6 #方式二: 7 for i indic.items(): 8 print(i) #相对相率低一些,优于先到后台将字典元素取出转化成列表,再遍历。
1 # !/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # --------创建----------- 4 dict1={'zhangsan':[11,'男','1234abc']} 5 dict2=dict(lisi=[12,'男','1234abc'],wangwu=[13,'男','1234abc']) 6 dict3={}.fromkeys([i for i in range(10)],'0000') 7 8 #print(dict1,' ',dict2,' ',dict3) 9 10 # #-----------------增--------------------------- 11 # dict1['add01']="我是新来的" 12 # print(dict1) 13 # dict1.setdefault('add02','new02') 14 # print(dict1) 15 # dict1.setdefault("lisi",'try') 16 # print(dict1) 17 18 19 20 # #-----------------删--------------------------- 21 # del dict3[0] 22 # print(dict3) 23 # dict3.pop(1) 24 # print(dict3) 25 # dict3.popitem() 26 # print(dict3) 27 # dict3.clear() 28 # print(dict3) 29 # del dict3 30 # print(dict3) 31 32 33 ##-----------------改--------------------------- 34 # dict1.update(dict2) 35 # print(dict1," ",dict2) 36 # dict3[1]='3#新来的' 37 # print(dict3) 38 39 #-----------------查--------------------------- 40 # print(dict3[4]) 41 # print(dict3.get(5)) 42 # print(dict3.get(100)) 43 # print(type(dict2.keys())) 44 # print(dict2.values()) 45 # print(dict2.items()) 46 47 #-----------------遍历--------------------------- 48 for i in dict2: 49 print(i) 50 for i in dict2.keys(): 51 print(i) 52 for i in dict2.values(): 53 print(i) 54 for i in dict2.items(): 55 print(i) 56 for k,v in dict2.items(): 57 print(k,v)
set的元素必须是可以hash的数据类型,因为在set存储过程中会经过hash处理。
元素必须是不可变的,列表、字典等不行 ,无序,并且不存在完全相同的元素(自动去重)
remove,pop和discard的区别:
discard删除指定元素,当指定元素不存在时,不报错;
remove删除指定元素,但当指定元素不存在时,报错:KeyError。
pop删除任意元素,并可将移除的元素赋值给一个变量,不能指定元素移除。
1 # !/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # -------------创建--------------------- 4 set1=set([1,2,2,3,2,5,6]) 5 set2={1,3,2,3,7,9,11,12} # 实际上生成的集合,已经将重复的删除了 6 # -------------增--------------------- 7 # set1.add('add01') 8 # print(set1) 9 10 11 # -------------删--------------------- 12 # set1.discard(1) # 删除指定的元素,如果没有当前元素,不作操作 13 # print(set1) 14 # set1.pop() 15 # print(set1) 16 # set1.remove(5) 17 # print(set1) 18 19 20 21 22 # -------------改--------------------- 23 24 # -------------查--------------------- 25 # print('a' in set1) 26 27 # -------------关系运算------------- 28 #---交差并补对称差集----- 29 # print(set1 & set2) 30 # print(set1 - set2) 31 # print(set1 | set2) 32 # print(set1 ^ set2)
- 字节类型(bytes)
- 是单独的数据类型
- frozenset,冻结集合。
- 通过方法frozenset()返回的冻结集合对象,为不可变数据类型
- 切片
- [起始索引:结束索引:步长 ]
- 顾头不顾尾
- 步长为负数表示逆向
- 字典不能哈希,所以不能进行切片操作
深浅拷贝现象的出现,主要源于存储的可变数据类型。
首先了解下,
A:可变数据类型,即在对变量内容进行操作时(增加、改动),a - 变量指向的内存地址不会发生变化,b - 变量指向的内存地址所存储的内容会相应更新。但是,在进行重新赋值时,即使是内容与之前存储ID地址所指向的内容一致,也会重新开辟新的id并存储响应的赋值。
B:不可变,在变量的赋值被改变(增加、改动)时,实际上是发生了对变量的重新定义,具体的,a - 变量指向的内存地址会发生变化,b - 变量指向的内存地址存储的内容是新定义的内容。(注意,此时原来的内存地址如未被释放的话,会仍旧存放着之前的内容)。
- Python中的变量的存储,