返回顶部

set集合, 小数据池

1.is == id

  • is 判断的是内存地址是否相同

  • == 判断值

  • id是获取ip地址

# id 身份证号(获取ip地址)
​
# i = 100
# s = 'alex'
# print(id(i))
​
# print(id(s))
# == 比较的是两边的值是否相等
# l1 = [1, 2, 3]
# l2 = [1, 2, 3]
# print(l1 == l2)
# s1 = 'alex'
# s2 = 'alex '
# print(s1 == s2)
​
# is 判断的是内存地址是否相同
# l1 = [1, 2, 3]
# l2 = [1, 2, 3]
# print(id(l1))
# print(id(l2))
# print(l1 is l2)
​
s1 = 'alex'
s2 = 'alex'
print(id(s1))
print(id(s2))
print(s1 is s2)
​
# id 相同,值一定相同
# 值相同,id不一定相同

2.代码块

  • 代码块: 我们所有的代码都需要依赖代码块来执行

  • 一个文件就是代码块

  • 在交互式命令下一行就是一个代码块

3.两个机制: 同一代码块下, 有一个机制, 不同的代码块下,遵循另外一个机制

4.同一个代码块下的缓存机制

  • 前提条件: 用一个代码块内

  • 机制内容: python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象, 满足缓存机制则他们在内存中只存在一个,即:id相同。

  • 适用机制: int str bool

  • 具体细则: 所有的数字, bool, 几乎所有的字符串

  • 优点: 提升性能, 节省内存

5.不同代码块下的缓存机制: 小数据池

  • 小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等
  • 前提条件: 不同代码块内

  • 机制内容: Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。

    python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。

      其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个

  • 适用的对象: int bool str

  • 具体细则: -5~256数字, bool, 满足规则的字符串

  • 优点提升性能, 节省内存

6.python基础数据类型之: 集合set, 容器型的数据类型,它要求里面是不可变(可哈希)的数据类型, 但它本身是可变的数据类型.集合是无序的 {}

  • 集合的作用:

    • 列表的去重

    • 关系测试: 交集, 并集, 差集,...

 

# 集合的创建  字典是无序的
​
# set1 = set({1, 2, '哈哈'})
# set1 = {1, 2, 3, 'alex', '悟空'}
# print(set1)
​
​
# 空集合
# print({}, type({}))  # 这是空字典
# set1 = set()  # set() 就表示一个空的集合
# print(type(set1))
​
​
# 集合的增加
# set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
# set1.add('悟空')
# print(set1)
​
​
# 集合的迭代增加update
# set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
# set1.update('123')
# print(set1)
​
​
# 集合的删除
# set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
# set1.remove('alex')  # 指定删除
# print(set1)
​
​
# set1.pop()  # 随机删除一个
# print(set1)
​
​
# set1.clear()  # 清空集合
# print(set1)
​
​
# del set1  # 直接删除集合
# print(set1)
​
​
# 集合的其他操作:
# 4.1 交集  &  或者 intersection
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 & set2)
# print(set1.intersection(set2))
​
​
# 4.2 并集。(| 或者 union)
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 | set2)
# print(set1.union(set2))
​
​
# 4.3 差集。(- 或者 difference)
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 - set2)
# print(set1.difference(set2))
​
​
# 4.4反交集。 (^ 或者 symmetric_difference)
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 ^ set2)
# print(set1.symmetric_difference(set2))
​
​
#  4.5子集与超集 < > issubset, issuperset
# set1 = {1, 2, 3}
# set2 = {1, 2, 3, 7, 8}
# print(set1 < set2)  # 结果为true, 表示set1是set2的子集
# print(set1.issubset(set2))  # 和上面是相同的
​
​
# print(set1 > set2)  # 结果为false 表示set2是set1的超集
# print(set1.issuperset(set2))  # 和上面的是一样的
​
​
# frozenset不可变集合,让集合变成不可变类型。
# s = frozenset('barry')
# print(s, type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
​
​
# enumerate:枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串)
# enumerate 将其组成一个索引序列,利用它可以同时获得索引和值。
# li = [1, 2, 3, 4, 'alex']
# for i in enumerate(li):
#     print(i)
​

 

 

posted @ 2022-07-20 16:09  fuju  阅读(26)  评论(0)    收藏  举报