一、集合

set(集合)的特点:无序、去重、元素必须是不可变类型。

python中的set空集 python set集合的特点_指定位置

python中的set空集 python set集合的特点_进制_02

'''******集合******'''
# 集合无序{}
# set(list)               # 常用于列表去重

# 补充:
L1 = ['name','age','sex','男','25','男']
L2 = ['渣渣辉','25','男',]
print(zip(L1,L2))
print(dict(zip(L1, L2)))
print(tuple(zip(L1, L2)))
print(list(zip(L1, L2)))
print(set(L1+L2))

set

 

python中的set空集 python set集合的特点_指定位置

python中的set空集 python set集合的特点_进制_02

1 s=set('hello')
 2 print(s)
 3 用set函数生成集合时相当于把['alex','alex','sb']里面的元素for循环放在{}里面
 4 s=set(['alex','alex','sb'])
 5 print(s)
 6 
 7 s={1,2,3,4,5,6}
 8 
 9 # 添加
10 s.add('s')     #只能添加1个元素
11 s.add('3')
12 s.add(3)
13 print(s)
14 
15 # 清空
16 s.clear()
17 print(s)
18 
19 # 复制
20 s1=s.copy()
21 s={'sb',1,2,3,4,5,6}
22 
23 # 随机删
24  s.pop()
25 
26 #指定删除
27 s.remove('sb')
28 s.remove('hellol') #删除元素不存在会报错
29 s.discard('sbbbb')#删除元素不存在不会报错
30 print(s)
31 
32 # 列表转化为集合
33 python_l=['lcg','szw','zjw','lcg']
34 linux_l=['lcg','szw','sb']
35 p_s=set(python_l)
36 l_s=set(linux_l)
37 
38 # #求交集
39 print(p_s,l_s)
40 print(p_s.intersection(l_s))
41 print(p_s&l_s)
42 
43 # #求并集
44 print(p_s.union(l_s))
45 print(p_s|l_s)
46 
47 # #差集
48 print('差集',p_s-l_s)
49 print(p_s.difference(l_s))
50 print('差集',l_s-p_s)
51 print(l_s.difference(p_s))
52 
53 #交叉补集
54 print('交叉补集',p_s.symmetric_difference(l_s))
55 print('交叉补集',p_s^l_s)
56 
57 python_l=['lcg','szw','zjw','lcg']
58 linux_l=['lcg','szw','sb']
59 p_s=set(python_l)
60 l_s=set(linux_l)
61 print(p_s,l_s)
62 # print('差集',p_s-l_s)
63 # p_s=p_s-l_s
64 p_s.difference_update(l_s)
65 print(p_s)
66 
67 # 判断两个集合有没有交集
68 s1={1,2}
69 s2={2,3,5}
70 print(s1.isdisjoint(s2))
71 
72 # 判断S1是不是S2的子集
73 s1={1,2}
74 s2={1,2,3}
75 print(s1.issubset(s2))#s1 是s2 的子集
76 print(s2.issubset(s1))#False
77 print(s2.issuperset(s1))#s1 是s2 的父集
78 
79 #更新(update)注意与add的区别
80 s1={1,2}
81 s2={1,2,3}
82 s1.update(s2) #更新多个值
83 print(s1)此时s1就变为s2
84 s1.add(1,2,3,4) #更新一个值
85 s1.union(s2) #不更新
86 
87 ##补充
88 s=frozenset('hello')    定义不可变集合
89 print(s)
90 names=['alex','alex','wupeiqi']
91 
92 names=list(set(names))    集合转化为列表
93 print(names)

笔记

 

练习:寻找差异

 

1

2

3

4

5

6

7

8

9

10

11

12

13


# 数据库中原有

old_dict = {

"#1":{ 'hostname':c1, 'cpu_count'2'mem_capicity'80 },

"#2":{ 'hostname':c1, 'cpu_count'2'mem_capicity'80 }

"#3":{ 'hostname':c1, 'cpu_count'2'mem_capicity'80 }

}

 

# cmdb 新汇报的数据

new_dict = {

"#1":{ 'hostname':c1, 'cpu_count'2'mem_capicity'800 },

"#3":{ 'hostname':c1, 'cpu_count'2'mem_capicity'80 }

"#4":{ 'hostname':c2, 'cpu_count'2'mem_capicity'80 }

}


需要删除:?
需要新建:?
需要更新:? 
注意:无需考虑内部元素是否改变,只要原来存在,新汇报也存在,就是需要更新

二、深浅拷贝

一、数字和字符串

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


import copy

# ######### 数字、字符串 #########

n1 = 123

# n1 = "i am alex age 10"

print(id(n1))

# ## 赋值 ##

n2 = n1

print(id(n2))

# ## 浅拷贝 ##

n2 = copy.copy(n1)

print(id(n2))

 

# ## 深拷贝 ##

n3 = copy.deepcopy(n1)

print(id(n3))


 

python中的set空集 python set集合的特点_指定位置

python中的set空集 python set集合的特点_进制_02

import copy
list1 = [1,5,[2,3,4,]]
list2=list1
list3 = list1.copy()
list4 = copy.deepcopy(list1)
print('2:',list2)
print('3:',list3)
print('4:',list4)
list1[1] = 8
print('分隔符'.center(50,'*'))
print('2:',list2)
print('3:',list3)
print('4:',list4)
list1[2].append(5)
print('分隔符'.center(50,'-'))
print('2:',list2)
print('3:',list3)
print('4:',list4)
list1[2][2] = 30
print('分隔符'.center(50,'*'))
print('2:',list2)
print('3:',list3)
print('4:',list4)

深浅copy

python中的set空集 python set集合的特点_python中的set空集_07

二、其他基本数据类型

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

1、赋值

赋值,只是创建一个变量,该变量指向原来内存地址,如:

1

2

3


n1 = {"k1""wu""k2"123"k3": ["alex"456]}

 

n2 = n1


  

python中的set空集 python set集合的特点_指定位置_08

2、浅拷贝

浅拷贝,在内存中只额外创建第一层数据

1

2

3

4

5


import copy

 

n1 = {"k1""wu""k2"123"k3": ["alex"456]}

 

n3 = copy.copy(n1)


python中的set空集 python set集合的特点_进制_09

3、深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

1

2

3

4

5


import copy

 

n1 = {"k1""wu""k2"123"k3": ["alex"456]}

 

n4 = copy.deepcopy(n1)


python中的set空集 python set集合的特点_指定位置_10

 

三、补充(基础杂货铺)

字符串格式化

Python的字符串格式化有两种方式: 百分号方式、format方式

百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。[PEP-3101]

This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing '%' string formatting operator.

1、百分号方式

%[(name)][flags][width].[precision]typecode

  • (name)      可选,用于选择指定的key
  • flags          可选,可供选择的值有:
  • +       右对齐;正数前加正好,负数前加负号;
  • -        左对齐;正数前无符号,负数前加负号;
  • 空格    右对齐;正数前加空格,负数前加负号;
  • 0        右对齐;正数前无符号,负数前加负号;用0填充空白处
  • width         可选,占有宽度
  • .precision   可选,小数点后保留的位数
  • typecode    必选
  • s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
  • r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
  • c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
  • o,将整数转换成 八  进制表示,并将其格式化到指定位置
  • x,将整数转换成十六进制表示,并将其格式化到指定位置
  • d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
  • e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
  • E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
  • f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
  • F,同上
  • g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
  • G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
  • %,当字符串中存在格式化标志时,需要用 %%表示一个百分号

注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式

常用格式化:

1

2

3

4

5

6

7

8

9

10

11


tpl = "i am %s" % "alex"   #将字符串 "alex"传给%s

 

tpl = "i am %s age %d" % ("alex"18)   #传多个值用(),%d只能接收数字,%s可以是str/list/int等

 

tpl = "i am %(name)s age %(age)d" % {"name""alex""age"18}

#打印浮点数 

tpl = "percent %f" % 99.97623      #默认保留6位 

 

tpl = "percent %.2f" % 99.97623     #保留2位

 

tpl = "i am %(pp).2f" % {"pp"123.425556, }

 

tpl = "i am %.2f %%" % {"pp"123.425556, }      #打印百分比


 

python_控制台输出带颜色的文字方法

 

#格式:
  设置颜色开始 :\033[显示方式;前景色;背景色m

#说明:
前景色            背景色           颜色
---------------------------------------
               40              黑色
               41              红色
               42              绿色
               43              黃色
               44              蓝色
               45              紫红色
               46              青蓝色
               47              白色
显示方式           意义
-------------------------
               终端默认设置
               高亮显示
               使用下划线
               闪烁
               反白显示
               不可见
 
#例子:
\033[1;31;40m    <!--1-高亮显示 31-前景色红色  40-背景色黑色-->
\033[0m          <!--采用终端默认设置,即取消颜色设置-->

 

for example:

print('\033[0;32;40m欢迎使用学生选课系统\033[0m')
try:
    num = int(input('请输入数字选择功能 :'))
except Exception as e:
    print('\033[31m对不起!您输入的内容有误~\033[0m')

运行结果:

python中的set空集 python set集合的特点_浮点数_11

for example:

print('\033[0;36m爆竹声中一岁除,')
print('春风送暖入屠苏。')
print('千门万户曈曈日,')
print('总把新桃换旧符。\033[0m')

运行结果:

python中的set空集 python set集合的特点_指定位置_12

-------------------------------------------------------------------------------------------------------------

补充:分隔符字符串拼接

print('root' , ' x ', ' 0 ', ' i ', sep= ' : ' )

>>>root : x : o : i 

 

2、Format方式

[[fill]align][sign][#][0][width][,][.precision][type]

  • fill           【可选】空白处填充的字符
  • align        【可选】对齐方式(需配合width使用)
  • <,内容左对齐
  • >,内容右对齐(默认)
  • =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
  • ^,内容居中
  • sign         【可选】有无符号数字
  • +,正号加正,负号加负;
  •  -,正号不变,负号加负;
  • 空格 ,正号空格,负号加负;
  • #            【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
  • ,            【可选】为数字添加分隔符,如:1,000,000
  • width       【可选】格式化位所占宽度
  • .precision 【可选】小数位保留精度
  • type         【可选】格式化类型
  • 传入” 字符串类型 “的参数
  • s,格式化字符串类型数据
  • 空白,未指定类型,则默认是None,同s
  • 传入“ 整数类型 ”的参数
  • b,将10进制整数自动转换成2进制表示然后格式化
  • c,将10进制整数自动转换为其对应的unicode字符
  • d,十进制整数
  • o,将10进制整数自动转换成8进制表示然后格式化;
  • x,将10进制整数自动转换成16进制表示然后格式化(小写x)
  • X,将10进制整数自动转换成16进制表示然后格式化(大写X)
  • 传入“ 浮点型或小数类型 ”的参数
  • e, 转换为科学计数法(小写e)表示,然后格式化;
  • E, 转换为科学计数法(大写E)表示,然后格式化;
  • f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
  • F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
  • g, 自动在e和f中切换
  • G, 自动在E和F中切换
  • %,显示百分比(默认显示小数点后6位)

 常用格式化:

tpl = "i am {}, age {}, {}".format("seven", 18, 'alex')   {}内无内容默认从左到右取不能多
 
tpl = "i am {}, age {}, {}".format(*["seven", 18, 'alex'])   *传列表
 
tpl = "i am {0}, age {1}, really {0}".format("seven", 18)     按索引取
 
tpl = "i am {0}, age {1}, really {0}".format(*["seven", 18])    按索引取 
 
tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18)     按k指定取
 
tpl = "i am {name}, age {age}, really {name}".format(**{"name": "seven", "age": 18})    传字典**,按字典中的k取
 
tpl = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])        format格式化相当于把(  ) 内容变成元组 
 
tpl = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 88888.1)      
 
tpl = "i am {:s}, age {:d}".format(*["seven", 18])
 
tpl = "i am {name:s}, age {age:d}".format(name="seven", age=18)
 
tpl = "i am {name:s}, age {age:d}".format(**{"name": "seven", "age": 18})
 
tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
 
tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
 
tpl = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)
 
tpl = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)