1、介绍
(1)弱数据
python是一门解释型语言,其数据类型为弱数据类型,即不通过直接声明,而是由赋值来确定变量的数据类型
(2)python的数据类型声明
通过一个:符号,可以对一个已经赋值的或者未赋值的变量名声明其数据类型,该操作不影响程序的执行,没有声明、赋值的作用,只是为后续的代码起一个代码提示的功能。可以出现在:主要用在方法或者函数传递参数时,对形参进行类型强调
class xx():
a:str
def fun(b:int=15):pass
c:list
d:student
e='xx'
e:int
(2)变量名与字面量
=左边的为变量名,注意其最好不要与关键字以及函数名重名,避免可能的执行异常或者代码提示异常,可以在变量名末尾追加一个下划线符号做区分
=右边的为字面量,常见的有数字、字符串和其它数据结构
None是一个特殊字母量,表示为空,即不指向任何地址或者值
(3)重要函数
- len:确定字符串、字典、列表等数组类对象的长度
- id:确定对象的地址
- type:确定对象的类型
- isinstance(x, class)函数用于查询变量x的类型是否是class或者其子类型
2、Number数字
(1)定义
支持int、float、bool和complex(复数)四种子类型
a = 0x11 # 十六进制
b = 0o11 # 八进制
c = 0b11 # 二进制
- 所有的整数的类型为int,可以通过二进制、八进制、十进制数、十六进制为int类型赋值,涉及的字母大小写均可
print(1e1) # 10.0
print(1e0) # 1.0
print(0e1) # 0.0
print(2.e1) # 20.0
print(2.2e1) # 22.0
- 所有的小数的类型为float,可以通过十进制数或者科学计数法(必为浮点数数)赋值
- bool的值为True或者False,大小写敏感。bool类型参与数值运算时,True和False分别可以替换为0和1。非空对象、非''字符串、非0数值、非空集合通过bool函数强转,或者在if等条件表达的位置可以自动转换为True,否者转为False。
print(5+3j) # (5+3j)
print(3.2j) # 3.2j
print(0.j) # 0j
# 5+j形式会报错
- complex的形式为aj+b,a必须存在
(2)运算符
算术运算符
比较运算符
逻辑运算符
赋值运算符
位运算符和位移运算符
注意:
- 没有++和--,也没有?:运算
- a**b表示a的b次方
- /表示返回浮点数、//表示向下取整,也就是向比它小的整数取整
- 逻辑运算符采用and、or和not三个关键字,而非&&、||和!
if 4>3 or list(a)[2]:
print('ok')
- and和or遵循短路
3、Str字符串
(1)定义
s1 = 'c'
s2 = 'abc'
s3 = '''张三,
来了,
又走了'''
s5 = '新世纪,\n你好\u6666,你好'
s5 = r'新世纪,\n你好\u6666,你好'
-
在python中没有直接的字符类型,单字符可以视为长度为1的字符串
-
单行字符串由一对单引号或者一对双引号包围表示,多行字符串由一对三单引号或者一对三双引号包围表示
-
转义字符,由\进行转义提示,用于表示某些无法或者不方便直接表示的字符。在整个字符串前面加r,字符串将不发生转义
-
unicode字符,实际是一种特殊的转义字符,由\uxxxx进行转义引起。也遵循加r不转义
(2)索引和索引操作
python中的包括字符串在内的所有集合类型都支持两种索引:
- 正向索引,从左往右,从0递增
- 反向索引,从右往左,从-1递减
截取(一个参数):
s[n]
- n可以为一个正向的或者反向的索引,表示获取单个字符
- n超出取值范围会抛出“IndexError: string index out of range”异常
截取(两个参数):
s[m:n]
s[m:]
s[:n]
s[:]
- m和n分别表示开始索引和结束索引,遵循左开右闭取值
- m和n可以都为正向索引,或者都为反向索引,也可以一个为正向另一个为反向索引。
- m索引表示的字符必须在n索引表示的左边,否则返回''
- 如果开始索引超出取值范围或者未定义,则截取结束索引左边的字符串。如果结束索引超出取值范围或者未定义,则截取开始索引及左边的字符串。如果开始索引和结束索引都超出或者未定义,则表示截取整个的字符串
截取(三个参数)
s[m:n:t]
- t表示递增取值,默认为1,表示连续取值
拼接:
通过+运算符可以实现字符串之间的拼接,但是字符串不能与非字符串的类型直接拼接,必须对其它类型使用str()函数转换
复制:
通过*运算符可以实现字符的复制,其后的数字指定复制的次数
s1 = 'abc'
s2 = ',def'
print(s1+s2) # abc,def
print(s1*2+s2*2) # abcabc,def,def
print((s1*2+s2)*2) # abcabc,defabcabc,def
是否包含:
'a' in s
'a' not in s
- 通过关键字in判断元素是否在集合中,返回bool类型值
(3)方法
由于过多,详情见下方的附表1
(4)格式化
s = '%s,123'%('张三')
print(s)
- %格式化,如果只有一个参数,参数可以不用()包围
s2 = f'hello,{123}'
# s3 = f'{1+2=}'
print(s2)
- 参数可以是字面量、变量或者运算式
(5)\n和\r
\n:换行符,跳到下一行
\r:回车,跳到当前行的首部
- \r会占据一个字符长度
f = open('ccc', mode='w', encoding='utf-8')
f.write('abc\r\ncde\r\n')
f.close()
f = open('ccc',mode='r',encoding='utf-8')
s = f.read()
print(s, s.encode('utf-8'), len(s))
f.close()
- \r被写入文件时,会被替换为\n
s = 'abc\r\ncde\n123'
print(s, s.encode('utf-8'))
- 在控制台输出时,\r\n和\n的效果一致
s = 'abc5\rcde\n123'
print(s, s.encode('utf-8'))
- 在控制台输出时,\r的效果是对此行在其之前的内容清除,然后输出在其之后的内容
4、Tuple元组
(1)定义
元组是一种集合类型,用一对()包围,其内元素用,分割
tuple = tuple()
tuple = ()
- 可以通过以上两种方法创建一个空的元组
tuple = (12,22)
tuple = (12,False,'abc')
tuple = (12,)
tuple = (12,23,)
元素的类型与list一致:
- 列表中的元素类型可以相同,也可以是不同的
- 列表中的元素可以是任意类型
- 需要注意如果元组只有一个元素,为了与()的归纳表示区分,需要在元素之和加,符号
- 如果元素不止一个,可以在最后一个元素后面加,符号,不影响
(2)索引和索引操作
元组的索引和截取与字符串、列表的使用一致
通过+和*操作符可以实现列表的拼接和复制
关键字in判断包含关系
但元组和字符串一样不支持del关键字
(3)方法
(12,22).count(__value=22)
(12,22,22).index(__value='100a',__start=0,__stop=100)
- 元组本身只有这两个方法,即返回匹配次数和寻找索引
5、List列表
(1)定义
列表是一种集合类型,用一对[]包围,其内元素用,分割
li = list()
li = []
- 可以通过以上两种方法创建一个空的列表
li = [123,22]
li = [False, 123, '世界']
li = [10,]
- 列表中的元素类型可以相同,也可以是不同的
- 列表中的元素可以是任意类型
- 如果列表中的元素不为空,可以在最后一个元素后加,符号,不影响
(2)索引和索引操作
列表的索引和截取与字符串的一致,也支持in关键字
li_1 = [1,2,3,4]
li_2 = ['a','b','c']
print(li_1*2+li_2*2) # [1, 2, 3, 4, 1, 2, 3, 4, 'a', 'b', 'c', 'a', 'b', 'c']
- 通过+和*操作符可以实现列表的拼接和复制
li = [1,2,3,4,5,6,7,8,9]
del li[0]
del li[-2:]
- 通过del关键字可以快速删除集合元素
(3)方法
1 | list.append(obj) 在列表末尾添加新的对象 |
---|---|
2 | list.count(obj) 统计某个元素在列表中出现的次数 |
3 | list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
4 | list.index(obj) 从列表中找出某个值第一个匹配项的索引位置 |
5 | list.insert(index, obj) 将对象插入列表 |
6 | [list.pop(index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
7 | list.remove(obj) 移除列表中某个值的第一个匹配项 |
8 | list.reverse() 反向列表中元素 |
9 | list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序 |
6、Set集合
(1)定义
集合是一种集合类型,用一对{}包围,其内元素用,分割
set = set()
- 创建一个空集合必须使用方法创建,因为{}用于创建空的字典
set = set('abcdefg') # set方法里的参数只能是字符串,将对其按字符进行拆分,{'b', 'e', 'c', 'd', 'f', 'g', 'a'}
set = (12,22)
set = (12,False,'abc')
set = (12,)
元素的类型与list一致:
- 列表中的元素类型可以相同,也可以是不同的
- 列表中的元素可以是任意类型
- 如果元素不止一个,可以在最后一个元素后面加,符号,不影响
- 集合中的元素会进行排序去重
- set对数值的排序是从大到小
set不支持[]索引,也不支持*和+运算符,对del关键字也不支持
(2)集合运算
这是set集合与其它集合进行区分的核心功能,支持差集、并集、交集和异或运算
a = set('abracadabra')
b = set('alacazam')
print(a - b) # a 和 b 的差集
print(a | b) # a 和 b 的并集
print(a & b) # a 和 b 的交集
print(a ^ b) # a 和 b 中不同时存在的元素
(3)方法
7、Dictionary字典
(1)定义
字典是一种集合类型,用一对{}包围,其内元素用,分割
其元素是键值对形式,键与值用:符号分割,键:值。键必须是数字\字符串\元组类型,而值可以是任意类型。
dict = dict()
dict = {}
- 可以通过以上两种方法创建一个空的字典
dict = {1:'abc','abc':False,(12,22):110}
dict = {1:'abc',}
- 如果元素不止一个,可以在最后一个元素后面加,符号,不影响
dict不支持[]索引,也不支持*和+运算符,对del关键字也不支持
(2)索引和索引操作
d = {'123':12,'123':24}
- 字典会自动去重,键相同的元素只保留最后一个
d['123']
d[12]
- 匹配键,返回值。如果没有对应键,会抛出KeyError异常
d # 输出字典本身
d.keys() # 获得所有的键
d.values() # 获得所有的值
d.update({111:222})
- 如果字典中存在键,则更新,如果不存在,则直接新增
d.get('123')
- 如果字典中存在键,则返回值,如果不存在,则返回None值
(3)方法
1 | dict.clear() 删除字典内所有元素 |
---|---|
2 | dict.copy() 返回一个字典的浅复制 |
3 | [dict.fromkeys(seq, val]) 创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值 |
4 | dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值 |
5 | dict.has_key(key) 如果键在字典dict里返回true,否则返回false |
6 | dict.items() 以列表返回可遍历的(键, 值) 元组数组 |
7 | dict.keys() 以列表返回一个字典所有的键 |
8 | dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default |
9 | dict.update(dict2) 把字典dict2的键/值对更新到dict里 |
10 | dict.values() 以列表返回字典中的所有值 |
11 | [pop(key,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。 |
12 | popitem() 返回并删除字典中的最后一对键和值。 |
8、使用注意
number、str、tuple这三种类型为不可变类型,也就是说不可直接对其元素进行增删改操作,如果值发生改变,实际是重新赋值。
list、dict和set这三种类型为可变类型,也就是说可以对其进行元素的增删改操作,不影响对象的地址。
list、dict和set的元素各自具有地址空间,元素的可变性由元素的自身类型决定。注意是先有元素对象自身的地址空间,再有可变对象的元素的索引指向值。
在方法或者函数中的参数都是传递地址,对于不可变对象赋值或者修改,不影响实参的值。对于可变参数对象的赋值或者修改,会影响实参的值。
9、bytes字节
详情查看内建函数bytes
(1)定义
b_1 = b'\xe5\a1'
- 直接声明
b_2 = '世界,你好'.encode('utf-8')
- 字符串编码
b_3 = bytearray([12,22,10])
b_4 = bytes([22,15])
- 由整数数组转换
(2)输出
调用其decode进行解码