第三章 数据类型
3.1 int
# None 无操作
# bytes 类
# 只有str 可以强转
s = '99'
print(type(int(s)))
3.2 bool
# bool 布尔,主要用于条件判断。
# None, 0 , '', [], {}, set()
# 以上都是False
3.3 str " "
1. 常用操作
str操作常用的 14 (9+5) 种
1.upper/lower 2.isdigit/isdecimal 3.strip 4.replace 5.split 6.startswith/endswith 7.encode 8.format 9.join
1. s.upper() / s.lower()
# 大小写转换
s = 'Henry'
print(s.upper(), s.lower())
2. s.isdigit() / s.isdecimal()
# 判断是否是数字
s1 = '123'
s2 = '12.3'
print(s1.isdigit(), s2.isdigit()) # True Flase
# isdecimal只判断是否是整数
3. s.strip()
# 默认去除两边空格+ \n + \t
s = ' asdfgh, '
print('-->', s.strip(), '<--')
print('-->', s.strip().strip(','), '<--')
4. s.replace('a', 'b', n)
# repalce 中的 a 和 b 必须是str类型, n 必须是int类型
s = 'adsafga'
print(s.replace('a', '666'))
print(s.replace('a', '666', 1))
5. s.split('_')
# str的分割
s = 'henry_echo_elaine_'
li = s.split('_')
print(li) # 分割后的元素永远比分隔符号多一个
6. s.startswith() / s.endswith()
# 判断开始/结束位置是否是指定元素
s = 'abghjkdc'
print(s.startswith('ab'), s.endswith('cd'))
# True Flase
7. str 的格式化输出(2种)
# 如果使用格式化输入,打印%需要使用 %%
# %s,%d :表示占位符
# way1 通常用于函数
"***{0}***{1}**".format(a, b)
# % (a, ) :这里表示tuple,建议加逗号
# way2
"***%s, ***%s***" % (a, b,)
# 示例
# way1 '{0} ***{1}'.format(a, b)
a = 'abcd'
b = '666'
s = '{0} ***{1}'.format(a, b)
print(s)
# way2
s1 = '%s***%s' % (a, b,)
print(s1)
扩展使用示例:
# %s ,只能是tuple
msg = '我是%s, 年龄%s' % ('alex', 19)
msg = '我是%(name)s, 年龄%(age)s' % {'name': 'alex', 'age': 19}
# format格式化
v1 = '我是{name}, 年龄{age}'.format(name = 'alex', age = 18)
v1 = '我是{name}, 年龄{age}'.format(** {'name': 'alex', 'age': 19})
v2 = '我是{0}, 年龄{1}'.format('alex', 18)
v2 = '我是{0}, 年龄{1}'.format(*('alex', 18) )
8. encode
# 指定编码类型
s = '你好'
print(s.encode('utf-8')) # 6个字节
print( s.encode('gbk')) # 4个字节
9. '_'.join(s)
# 用于循环加入指定字符
# s 必须是iterable
# s 可是str,list,tuple,dict,set(str + 容器类)
# s 中元素值必须是str类型
'_'.join(s)
# 示例
# 指定元素循环连接str中的元素
s = 'henry'
print('_'.join(s)) # 下划线连接个字符
2. 其他操作
- s.find('a') / s.rfind()
- 返回第一个 a 的索引值,没有则返回 -1
- s.index('a') / s.rindex() /s.lindex()
- 返回第一个 a 的索引值,没有报错
- s.isupper() / s.islower()
- s.capitalize()
- s.casefold()
- s.center(20, "*")
- 可以为空
- s.ljust(20, "*")/s.rjust()
- s.zfill()
- 用0填充
- s.count('a', [start], [end])
- 查找'a' 的个数
- s.isalnum()
- s.isalpha()
- s.isnumeric()
- s.isprintable()
- s.istitle()
- s.partition('a') / s.rpartition()
- 分成三部分,a左边,a右边
- s.swapcase()
3. 公共方法
1. len(s)
# 返回s长度
s = '1234567890'
print(len(s)) # 10
2. s[index]
# 索引取值
s = '123456789'
print(s[3]) # 4
3. 切片
s = '123456789'
print(s[3:5]) # 45
4. setp
# 根据step进行切片
s = '123456789'
print(s[3::2]) # 468
5. for循环
s = '123456789'
for i in s:
print(i)
3.4 list []
1. 常用操作
list操作目前一共有15(8+7)种, 1.append 2.insert 3.remove 4.pop 5.clear 6.reverse 7.sort 8.extend
1. li.append('666')
# 任意类型数据,li操作不能直接放在print()中
li = [1, 2, 3, 4, 5, 6]
li.append('666')
print(li)
li.append(['henry'])
print(li)
2. li.insert(2, 'henry')
# 按照index位置插入指定内容
li = [1, 2, 3, 4, 5, 6]
li.insert(3, 'henry')
print(li)
3. li.remove('aa')
# 删除指定list中的元素
li = ['aa', 'a', 'aacde']
li.remove('aa')
print(li)
li.remove('bb')
print(li) # 会报错
4. li.pop(index)
# 按index删除list中的元素
li = [1, 2, 3, 4, 5, 6]
li.pop()
print(li)
li.pop(3)
print(li)
5. li.clear()
# 清空list中的所有元素
li = [1, 2, 3, 4, 5, 6]
li.clear()
print(li)
6. li.reverse()
# 反转list中的元素
li = [1, 2, 3, 4, 5, 6]
li.reverse()
print(li)
7. li.sort(reveres = True)
# reverse = True 从大到小
# 只能是同一类型的元素
# dict,tuple不支持排序
li = [6, 2, 3, 1, 5, 4]
li.sort()
print(li)
li = ['ba', 'ab', 'c', 'd']
li.sort(reverse=True)
print(li)
li = [[6], [2, 3], [1, 5, 4]]
li.sort()
print(li)
li = [(6, 2, 3, 1, 5, 4)]
li.sort()
print(li)
8. li.extend(s)
# 把s中的元素,循环取出,逐个追加到list中
# s可以是str, list, tuple, dict, set
# dict只取keys 追加到list中
s = 'henry'
li = [1, 2, 3, 4, 5, 6]
li.extend(s)
print(li)
s = ['a', 'b', 'c', 'd']
li.extend(s)
print(li)
2. 其他
- li.count('a')
- li.copy()
- 浅拷贝
- li.count()
- 只计算第一层,不考虑嵌套
- li.index('val')
3. 公共方法
1. len(s)
li = [1, 2, 3, 4, 5, 6]
print(len(li))
2. index 取值
li = [1, 2, 3, 4, 5, 6]
print(li[2])
3. 切片
li = [1, 2, 3, 4, 5, 6]
print(li[2:5])
4. step
li = [1, 2, 3, 4, 5, 6]
print(li[2::2])
5. for循环
li = [1, 2, 3, 4, 5, 6]
for i in li:
print(i)
6. 修改
# 使用index修改,如果只是一个值,则正常修改
li = [1, 2, 3, 4, 5, 6]
li[2] = 'henry'
print(li)
# 使用index修改,如果是多个值,认为是一个tuple
li[2] = 'a', 'b', 'c'
print(li)
# 使用切片[]修改,则循环取值加入
li[2:3] = 'a', 'b', 'c'
print(li)
7. 删除del li[]
# del 也不能放在print()里面
li = [1, 2, 3, 4, 5, 6]
del li[2]
print(li)
del li[2:]
print(li
3.5 tuple ()
# 没有独有操作,目前只有5种
# tuple里,最后一个值最好加一个 逗号 ,以区别于运算符
1. 常用操作
1. len()
t = (1, 2, 3,)
print(len(t))
2. index
t = (1, 2, 3,)
print(t[2])
3. 切片
t = (1, 2, 3,)
print(t[1:])
4. step
t = (1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
print(t[1::2])
5. for 循环
t = (1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
for i int t:
print(i)
2. 内置函数
- max(tup). # 返回最大值
- min(tup). # 返回最小值
- tuple(li). # list 转tuple
3.6 dict {}
1. 常用操作
dict 目前一共有 14(9 + 5) 种操作, 1.keys 2.values 3.items 4.get 5.pop 6.update 7.setdefault 8.popitem 9.clear
# {key1: value1, k2:value2}
# key不能重复
1. info/ info.keys()
- 类似 list ,但不是list,例如:dict_keys(['name', 'age', 'gender'])
# 取所有key
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
for key i info:
print(key)
2. Info.values()
# 取所有value
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
for v in info.values():
print(v)
3. info.items()
# 取所有key值对
# 取出的是 tuple 类型
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
for pair in info.items():
print(pair)
4. Info.get(key, 666)
# 有key则取出, 没有则返回指定 值
# 如果没有指定值,则返回 None
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
print(info.get(1, 666))
print(info.get(4, 666))
5. info.pop(key)
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
print(info.pop(1))
print(info.pop(4))
6. info.update(info1)
# 只能用dict类型更新
info = {}
info1 = {1: 'henry', 2: 'echo', 3: 'eliane'}
info.update(info1)
print(info)
7. info.setdefalut(key, value)
# 查询key,有则取出,没有则添加
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
info.setdefault(4, 'hello')
print(info)
# 取出需要赋值给其他变量
val = info.setdefault(4, 'i hate you')
print(val)
8. info.popitem()
# 不能加参数,删除最后一个key值对
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
v = info.popitem()
print(v,info) # v是tuple
9. info.clear()
# 清空所有元素
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
info.clear()
print(info)
2. 其他
- info.copy() # 浅拷贝
- info.fromkeys()
li = [1, 2, 3, 4, 5]
info = {'a': 1, 'b': 2}
v = info.fromkeys(li, 'hello')
print(v, info)
3. 公共方法
1. len(info)
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
print(len(info))
2. Index 取值
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
print(info[1])
3. for 循环
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
for i in info:
print(i)
for v in info.values():
print(v)
for pair in info.items():
print(pair)
4. 修改
# key一样则修改,不一样则追加
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
info[1] = 'hello'
print(info)
info[4] = 'you are smart'
print(info)
5. 删除
info = {1: 'henry', 2: 'echo', 3: 'eliane'}
del info[1]
print(info)
4. 有序字典
# __getitem__ set, del
from collections import OrderdDict
info = OrderedDict()
info['k1'] = 123
info['k2'] = 456
3.7 set() /{}
1. 常用操作
set 目前一共有11(10 + 2)种操作,空集合用set()表示。
1.add 2.update 3.pop 4.discard 5.remove 6. clear 7.intersection 8.union 9.difference 10.symmetric_difference
# 无序,不重复
1. s.add('a')
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s.add(5)
print(s)
2. s.update(s1)
# 可以用str, list, tuple, dict, set, 也可以混合多种类型放入update中
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s1 = {5, 6, 7, 8, 1, 2, 3}
s2 = [5, 6, 7, 8, 1, 2, 3]
s3 = (5, 6, 7, 8, 1, 2, 3)
s4 = {5: 6, 7: 8, 1: 2}
s.update(s1)
print(s)
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s.update(s2)
print(s)
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s.update(s3)
print(s)
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s.update(s4)
print(s)
3. s.pop()
# 随机删除,此时pop中不能有任何参数
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s.pop() # 默认删除第一个元素/随机
print(s)
4. s.discard()
# 必须有一个参数,没有不报错, 不会返回值
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
val = s.discard(3)
print(s)
print(val)
5. s.remove('a')
# 必须有一个参数,没有会报错
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s.remove(3)
print(s)
6. s.clear()
s = {1, 'henry', 2, 'echo', 3, 'eliane'}
s.clear()
print(s)
7. s.intersection(s1)
# 取v1 和v2 的交集
v1 = {1, 'henry', 2, 'echo', 3, 'eliane'}
v2 = {1, 3, 5, 7}
v = v1.intersection(v2)
print(v)
8. v.union(v1)
# 取并集
v1 = {1, 'henry', 2, 'echo', 3, 'eliane'}
v2 = {1, 3, 5, 7}
v = v1.union(v2)
print(v)
9. v.difference(v1)
v1 = {1, 'henry', 2, 'echo', 3, 'eliane'}
v2 = {1, 3, 5, 7}
v = v1.difference(v2)
print(v)
10. v.symmetric_difference(v1)
v1 = {1, 'henry', 2, 'echo', 3, 'eliane'}
v2 = {1, 3, 5, 7}
v = v1.symmetric_difference(v2)
print(v)
# 集合的运算
方法
运算法
2. 其他
- v.copy()
- v.difference_update(v2)
- v.symmetric_difference_update(v2)
- v.intersection.update(v2)
- v.isdisjoint(v2) # 返回 bool值
- v.issubset(v2)/ v.issuperset(v2)
3. 公共方法
1. len(v)
v = {1, 'henry', 2, 'echo', 3, 'eliane'}
print(len(v))
2. for 循环
# 无序输出
v = {1, 'henry', 2, 'echo', 3, 'eliane'}
for i in v:
print(i)
3.8 公共方法
int | bool | str | list | tuple | dict | set | |
---|---|---|---|---|---|---|---|
len | — | — | ✓ | ✓ | ✓ | ✓ | ✓ |
index | — | — | ✓ | ✓ | ✓ | ✓ | — |
切片 | — | — | ✓ | ✓ | ✓ | — | — |
step | — | — | ✓ | ✓ | ✓ | — | — |
for循环/ iterable | — | — | ✓ | ✓ | ✓ | ✓ | ✓ |
修改 | — | — | — | ✓ | — | ✓ | ✓ |
删除 | — | — | — | ✓ | — | ✓ | ✓ |
3.9 内存相关&深浅拷贝
0. 可嵌套的数据类型
- 所有的容器类例如:list,tuple, dict,set 都可以嵌套,但set(), 只能嵌套可hash(int, bool, str, tuple 4种)的数据类型。
1. 内存相关
小数据池
- ==判断值
- is判断内存地址
- python中默认会对int,str,bool进行缓存
缓存规则:
- int型-5 — 256之间会被缓存
- str:空和单个字符默认缓存;只包含字母、数字、下划线,也缓存; 乘数>1时,str只包含Num、ALp、_时缓存(最终长度不能超过20)
- str:手动指定缓存
- bool
2. 深浅拷贝
- 使用格式import copy(模块)
- 4 个结论
- 浅拷贝只是拷贝第一层可变类型
- 深拷贝拷贝所有可变类型的数据
- 只要 copy ,一定会为数据开辟新的内存空间
- tuple 浅copy地址一样, 有嵌套的可变类型,deepcopy也会拷贝tuple数据
☞☞☞ 古人学问无遗力,少壮工夫老始成。纸上得来终觉浅,绝知此事要躬行。 ☜ ☜ ☜