004 Python数据类型

  • l = [1, 2, 3, 4, 5, 6]
    # 正向步长
    print(l[0:3:1])
    # 反向步长
    print(l[2::-1])

    # 通过索引取值实现列表翻转
    print(l[::-1])
    int
 1 # int可以将纯整数构成的字符串转换成整型,若包含其它非整数符号则会报错
 2 s = '123'
 3 res = int(s)
 4 print(res, type(res))
 5 
 6 # s = '12.3'
 7 # res = int(s)
 8 # print(res, type(s))
 9 
10 # 十进制与其它进制之间的相互转换
11 # 十进制转其它进制
12 print(bin(3))  # 0b11
13 print(oct(9))  # 0o11
14 print(hex(17))  # 0x11
15 
16 # 其它进制转十进制
17 print(int('0b11', 2))
18 print(int('0o11', 8))
19 print(int('0x11', 16))
20 
21 # float同样可以用来做数据类型转换
22 s = '12.3'
23 res = float(s)
24 print(res, type(res))
  • str
  1 # 字符串的定义:用单引号'',双引号"",三引号""""""引起来的内容
  2 name1 = 'jack'
  3 name2 = "Bob"
  4 name3 = """我们是一家人"""
  5 
  6 name4 = '''我们都有一个家,名字叫中国'''
  7 
  8 print(name1, name2, name3, name4)
  9 
 10 # 字符串的数据类型转换:任何类型都可以转成字符串,格式:str(任意类型数据)
 11 # 字典和集合都是用{}大括号括起来的
 12 # 列表
 13 print(str([1, 2, 3]))
 14 # 字典
 15 print(str({'name': 'egon', 'age': 18}))
 16 # 元组
 17 print(str((1, 2, 3)))
 18 # 集合
 19 print(str({1, 2, 3, 4}))
 20 
 21 # 字符串的使用:
 22 # 字符串按索引取值
 23 
 24 str1 = 'hello Python hello Java'
 25 # 正向取值
 26 print(str1[6])  # P
 27 
 28 # 反向取值
 29 print(str1[-2])  # 0
 30 
 31 # 字符串不支持按照索引去修改
 32 # str1[5] = 'X'  # 报错'str' object does not support item assignment
 33 
 34 # 字符串切片(顾头不顾尾,步长)
 35 
 36 # 正向切
 37 print(str1[0:9])
 38 # 正向切+步长
 39 print(str1[0:9:2])
 40 # 反向切
 41 print(str1[-4:-1])  # 顾头不顾尾,所以娶不到第四个
 42 # 反向切+步长
 43 print(str1[::-1])  # avaJ olleh nohtyP olleh
 44 print(str1[:5:-1])  # avaJ olleh nohtyP
 45 print(str1[:6:-1])  # avaJ olleh nohty
 46 print(str1[5::-1])  # olleh
 47 print(str1[6::-1])  # P olleh
 48 
 49 # 获取字符串长度即字符的个数(但凡存在于引号内的都算作字符)
 50 print(len(str1))  # 23
 51 
 52 # 成员运算
 53 print('hello' in str1)
 54 print('hi' not in str1)
 55 
 56 # 移除字符串内首尾制定的字符(默认移除空格)
 57 str2 = '  Life is short  '
 58 print(str2.strip())  # Life is short
 59 str3 = '***Life is short ***'
 60 print(str3.strip('*'))
 61 
 62 # 切分split(默认切分是按照空格来切分),切割完是一个列表list
 63 print('hello world'.split())
 64 print('127.0.0.1'.split('.'))
 65 'hello world'.split()
 66 
 67 # 循环取出字符串中的字符
 68 str4 = '今天你要嫁给我吗?今天你要嫁给我吗?'
 69 
 70 for x in str4:
 71     print(x)
 72 
 73 # strip(),lstrip(),rstrip()
 74 # strip():移除字符串左右两边的字符,默认移除空格,可加参数,左右两边有多少移除多少
 75 # lstrip():移除字符串左边的字符,默认移除空格
 76 # rstrip():移除字符串右边的字符,默认移除空格
 77 str5 = '&&&hello world&&&'
 78 print(str5.strip('&'))
 79 print(str5.rstrip('&'))
 80 print(str5.lstrip('&'))
 81 
 82 # lower(),upper()
 83 # lower():将字符串中的所有字符转换成小写
 84 # upper():将字符串中的所有字符转换成大写
 85 str6 = 'My name is Bob'
 86 print(str6.upper())
 87 print(str6.lower())
 88 
 89 # stratwith():判断字符串是否以括号内的字符串开始
 90 # endwith():判断字符串是否以括号内的字符串结束
 91 str7 = 'hello world'
 92 print(str7.startswith('h'))
 93 print(str7.startswith('hello'))
 94 print(str7.startswith('world'))
 95 
 96 print(str7.endswith('d'))
 97 print(str7.endswith('world'))
 98 print(str7.endswith('hello'))
 99 
100 # 字符串的格式化输出:format
101 print('my name is {name}, my age is {age}'.format(name='lijipeng', age=18))
102 print('my name is {name}, my age is {name}'.format(name='lijipeng', age=18))
103 # print('my name is {name}, my age is {age}'.format(name='lijipeng')) #字符串中的age没有被赋值,报错
104 
105 # format的其它用法1类似于%s,按位置给值
106 print('my name is {},my age is {}'.format('lijipeng', 18))
107 
108 # format的其它用法2:将format中的参照看成一个列表,然后按照{索引取值}
109 print('my name is {0}, my age is {1}'.format('lijipeng', 18))
110 print('my name is {0}, my age is {0}'.format('lijipeng', 18))
111 print('my name is {1}, my age is {0}'.format('lijipeng', 18))
112 
113 # split,rsplit(默认是从左边切)
114 print('127.0.0.1'.split('.', 1))
115 print('127.0.0.1'.rsplit('.', 3))
116 print('127.0.0.1'.rsplit('.', 4))  # 只能切三次,但是切了四次也不会报错
117 
118 # join 从可迭代的对象中取出多个字符串,然后按照指定的分隔符进行拼接
119 # join前是拼接符号 '%' '|' '&&&'是一个字符串
120 # join后是字符串列表 'hello world' ['1','2','3'] ['a','b','c']
121 print('%'.join('hello world'))
122 print('|'.join(['1', '2', '3']))
123 print('&&&'.join(['a', 'b', 'c']))
124 
125 # replace(可以部分也可以全部替换) 用新的字符串替换旧的字符串从而形成一个新的字符串
126 # 替换的是字符串里面的某些字符,old和new都应该是字符串
127 str8 = 'my name is jack, my age is 18!'
128 print(str8.replace('18', '73'))
129 print(str8.replace('my', 'MY', 1))
130 print(str8.replace('my', 'MY', 2))
131 
132 # isdigit:判断字符串中是否由纯数字组成
133 str9 = '123456789'
134 str10 = '12345g678910'
135 print(str9.isdigit())
136 print(str10.isdigit())
137 
138 # 了解操作
139 # find rfind index rindex count
140 # find 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到返回-1
141 
142 print('hello world'.find('he', 0, 10))
143 print('hello world'.find('he', 1, 10))
144 print('hello world'.find('o', 1, 10))
145 
146 # rfind 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到返回-1
147 print('hello world'.rfind('he'))
148 print('hello world'.rfind('l'))
149 print('hello world'.rfind('ll'))
150 print('hello world'.rfind('lll'))
151 
152 # index 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到报错
153 print('hello world'.index('he'))
154 # print('hello world'.index('he', 1, 10)) #会报错
155 # print('hello world'.index('ll', 1, 3))  # 会报错,因为取不到3索引
156 print('hello world'.index('ll', 1, 4))  # 不会报错,可以取到4索引
157 
158 # rindex 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到报错
159 print('hello world'.rindex('l'))
160 # print('hello world'.rindex('l',10,11)) #
161 
162 # count:统计字符串在大字符串中出现的次数
163 print('hello world'.count('l'))  # 3
164 print('hello world'.count('l', 1, 5))  # 2
165 print('hello world'.count('ll'))  # 1
166 print('hello world'.count('lll'))  # 0
167 
168 # center,ljust,rjust,zfill
169 
170 # center:字符串居中操作
171 # __width第一个参数为返回字符串的总长度
172 # __filechar第二个参数为不够用什么字符来填充
173 # 本身字符串的长度已经超过了__width,则直接展示本身即可
174 print('lijipeng'.center(30, '-'))  # -----------lijipeng-----------
175 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.center(30, '-'))
176 
177 # ljust:字符串左对齐展示,不够的用__filechar填充,本身字符串的长度已经超过了__width,则直接展示本身即可
178 print('lijipeng'.ljust(30, '-'))
179 # rjust:字符串右对齐展示,不够的用__filechar填充,本身字符串的长度已经超过了__width,则直接展示本身即可
180 print('lijipeng'.rjust(30, '-'))
181 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.ljust(30, '-'))
182 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.rjust(30, '-'))
183 
184 # zfill:字符串右对齐展示,不够的用0补充,本身字符串的长度已经超过了__width,则直接展示本身即可
185 print('lijipeng'.zfill(50))
186 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.zfill(30))
187 
188 # expandtabs:修改制表符代表的空格数
189 str11 = 'lijipeng\tworld'
190 print(str11)
191 print('lijipeng\tworld'.expandtabs(1))
192 print('lijipeng\tworld'.expandtabs(2))
193 print('lijipeng\tworld'.expandtabs(4))
194 print('lijipeng\tworld'.expandtabs(5))
195 print('lijipeng\tworld'.expandtabs(6))
196 
197 # expitalize,swapcase,title
198 # expitalize:首字母大写,本身字符串就是大写的话返回原来的字符串
199 print('hello world'.capitalize())
200 print('Hello world'.capitalize())
201 
202 # swapcase:大小写翻转
203 print('My name is lijipeng, My age is 18'.swapcase())
204 
205 # title:单词首字母大写
206 print('My name is lijipeng,My age is 18'.title())
207 
208 # is数字系列
209 # 数字的四种格式:bytes,unicode,中文数字,罗马数字
210 num1 = b'1'
211 num2 = u'1'
212 num3 = ''
213 num4 = 'I'
214 # isdigit:
215 # 用法1:判断单个字符是否为数字
216 # 用法2:判断字符串是否全部由数字组成
217 print(num1.isdigit())  # True
218 print(num2.isdigit())  # True
219 print(num3.isdigit())  # False
220 print(num4.isdigit())  # False
221 
222 # isdecimal
223 # 用法:用来检查字符串中的所有字符是否都是十进制数字字符
224 print(num1.isdigit())  # bytes类型的数字没有isdecimal方法
225 print(num2.isdecimal())  # True
226 print(num3.isdecimal())  # False
227 print(num4.isdecimal())  # False
228 
229 # isnumeric:用来检查字符串是否只包含数字字符
230 print(num1.isdigit())
231 print(num2.isnumeric())  # True
232 print(num3.isnumeric())  # True
233 print(num4.isnumeric())  # False
234 
235 # 总结:最常用的就是isdigit,可以判断bytes和unicode类型,如果要判断中文数字或罗马数字则需要使用isnumeric
236 
237 # is其它
238 name = 'tony123'
239 # isalnum:字符串中既可以包含数字也可以包含字母
240 print(name.isalnum())
241 # isalpha:字符串中只包含字母
242 print(name.isalpha())
243 # isidentifier:用来判断字符串中是否是合法的标识符
244 name1 = 'tony123_'
245 name2 = 'tony123_$'
246 name3 = 'print'
247 name4 = '123tony'
248 print(name1.isidentifier())
249 print(name2.isidentifier())
250 print(name3.isidentifier())
251 print(name4.isidentifier())
252 
253 # islower:判断字符串中是否都是纯小写
254 # isupper:判断字符串中是否都是纯大写
255 print('my name is lijipeng'.islower())
256 print('my name is lijipeng'.isupper())
257 print('my name is LIJIPENG'.isupper())
258 print('my name is LIJIPENG'.isupper())
259 print('MY NMAE IS LIJIPENG'.isupper())
260 
261 # isspace:判断字符串中是否全是空格
262 print('     '.isspace())  # True
263 print('  womenshi   '.isspace())  # False
264 print('\t'.isspace())  # True
265 
266 # istitle:判断字符串中单词首字母是否是大写
267 print('My Name Is Ljipeng'.istitle())
268 print('my Name Is hhaha'.istitle())

 

 1 # 列表定义:在[]内,用逗号分隔开多个任意数据类型的值
 2 
 3 l1 = [1, 'test', [2, 3]]  # 本质就是l1 = list([1, 'test', [2, 3]])
 4 
 5 # 列表类型转换
 6 # 但凡能被for循环遍历的数据类型都可以传给list()转换成列表类型
 7 # list()会跟for循环一样,遍历出数据类型中包含的每一个元素,然后放到列表中
 8 
 9 print(list('hello world'))  # 字符串类型数据'hello world'可以被for循环遍历,所以可以传给list()转换成列表类型,print打印列表则会展示一个字符列表
10 print(list([1, 2, 3]))  # 通过list()转化后打印列表 [1, 2, 3]
11 print([1, 2, 3])  # 直接打印列表 [1, 2, 3]
12 print(list({'name': 'egon',
13             'age': 18}))  # 字典{'name':'egon','age':18}可以被for循环遍历,遍历得到的是key值,所以可以传给list()转换成列表类型,print打印列表则会展示一个key的列表
14 print(list((1, 2, 3)))  # 元组(1, 2, 3)也可以被for循环遍历,所以可以传给list()转换成列表类型,print打印列表展示[1, 2, 3]
15 print(list({1, 2, 3, 4}))  # 集合{1, 2, 3, 4}可以被for循环遍历,所以可以传给list()转换成列表类型,print打印列表展示[1, 2, 3, 4]
16 
17 # 列表按索引取值
18 hobbies = ['basketball', 'football', 'sing']
19 print(hobbies[0])  # basketball 正向取值
20 print(hobbies[-1])  # sing 反向取值
21 
22 # 列表按照索引修改指定位置的值,索引不存在则会报错list assignment index out of range
23 hobbies[1] = 'read'
24 print(hobbies)
25 # hobbies[3] = 'test' # 列表有三个值,索引最大到2,所以会报错
26 
27 # 列表切片
28 # 顾头不顾尾:取出索引0-2的元素
29 print(hobbies[0:2])  # 取不到2
30 print(hobbies[0:3])
31 # 步长
32 print(hobbies[0:3:2])  # ['basketball', 'sing'] 这里的2指的是步长,首次取0索引,第二次取2索引
33 
34 # 列表长度len
35 print(len(hobbies))
36 
37 # 成员运算 in not in
38 print('basketball' in hobbies)
39 print('sing' not in hobbies)
40 
41 # 添加元素
42 # 尾部追加元素append
43 hobbies.append('sleep')  # 在列表尾部追加'sleep'元素
44 print(hobbies)
45 
46 # 一次性在尾部添加多个元素extend,括号内应该是一个列表
47 hobbies.extend(['eat', 'movies'])
48 print(hobbies)
49 
50 # 在指定位置插入元素insert,如果输入的索引超过了本身的最大索引,则会默认加在最后面
51 hobbies.insert(0, 'heihei')
52 hobbies.insert(7, 'haha')
53 hobbies.insert(10, 'xixi')
54 hobbies.insert(-2, '666')
55 print(hobbies)
56 
57 # 删除元素
58 # del listname[索引值] 删除指定索引的值,没有返回值,如果该索引值不存在,则会报错list assignment index out of range
59 del hobbies[0]
60 print(hobbies)
61 
62 del hobbies[1]
63 # del hobbies[10] # 报错
64 print(hobbies)
65 
66 # listname.pop()默认删除列表最后一个元素,并将删除的值返回,括号内可以指定索引值来删除对应的元素
67 print(hobbies.pop())
68 print(hobbies)
69 
70 print(hobbies.pop(2))
71 print(hobbies)
72 
73 # remove()括号内指名道姓要删除某个元素,返回值为None
74 print(hobbies.remove('sing'))
75 print(hobbies)
76 
77 # reverse() 颠倒列表内元素顺序,返回值为None
78 print(hobbies.reverse())
79 print(hobbies)
80 # sort() 给列表内所有元素排序,返回值为None,reverse默认值为False,从小到大排序
81 print(hobbies.sort())
82 print(hobbies)
83 print(hobbies.sort(reverse=False))
84 print(hobbies)
85 print(hobbies.sort(reverse=True))
86 print(hobbies)
87 
88 # 数字可以直接比较大小,字符串、列表也可以比较大小,原理相同都是比较相同位置的元素的大小,如果分出大小,则无需比较下一个元素
89 print([1, 2, 3] < [2]) #True
90 print('abc' < 'ABC') #False
91 
92 # for循环遍历列表中的值
93 for x in hobbies:
94     print(x)

 

1 l = [1, 2, 3, 4, 5, 6]
2 # 正向步长
3 print(l[0:3:1])
4 # 反向步长
5 print(l[2::-1])
6 
7 # 通过索引取值实现列表翻转
8 print(l[::-1])

 

 1 # 元组作用:元组和列表相似,也可以存多个任意类型的数据,不同之处在于元组的元素不能修改,即元组相当于不可变的列表,用来记录多个固定不允许修改的值,单纯只是为了取
 2 # 元组其实就是一个元素不可变的列表,只能用来取,元素不可更改。
 3 
 4 # 元组定义,如果元组内只有一个值,则必须得有一个逗号,否则()就只是包含的意思,而非定义元组
 5 countries = ('中国', '美国', '英国')  # 本质就是tuple('中国','美国','英国')
 6 tests = ('数学')  # 元组中只有一个值,必须得有逗号,不然就是包含的意思
 7 tests1 = (1,)
 8 print(countries, type(countries))
 9 print(tests, type(tests))  # 数学 <class 'str'>
10 print(tests1, type(tests1))  # (1,) <class 'tuple'>
11 
12 # 类型转换:但凡能被for循环遍历的数据类型都可以传给tuple()转换成元组类型
13 
14 print(tuple('hello world'))  # 字符串
15 print(tuple([1, 2, 3]))  # 列表
16 print(tuple({'name': 'egon', 'age': 18}))  # 字典('name', 'age')
17 print(tuple((1, 2, 3)))  # 元组
18 print(tuple({1, 2, 3, 4}))  # 集合
19 
20 # tuple()会跟for循环一样,遍历出数据类型中包含的每一个元素,然后放在元组中
21 
22 # 元组使用
23 
24 tuple1 = (1, 2, 3, 'hello', 23.4, [1, 2], {'name': 'egon', 'age': 18})
25 # 按索引取值,只能取,不能改,改的话会报错
26 print(tuple1[0])
27 print(tuple1[1])
28 print(tuple1[2])
29 print(tuple1[3])
30 print(tuple1[4])
31 print(tuple1[5])
32 print(tuple1[6])
33 
34 print(tuple1[-1])
35 # tuple1[2] = '' #报错
36 # 切片
37 print(tuple1[0:3:1])
38 # 长度
39 print(len(tuple1))
40 # 成员运算
41 print(1 in tuple1)
42 print('helloworld' in tuple1)
43 # 循环
44 for tup in tuple1:
45     print(tup)
  •  dict
  1 # 字典的定义方式
  2 # 在{}内用逗号分隔开的多个元素,每个元素都是key:value的形式,value可以是任意数据类型,而key则必须是不可变类型,通常key是str类型,因为str类型对value有描述性功能。
  3 # 字典定义格式1
  4 info = {'name': 'jack', 'age': 18, 'salary': 20000.4}  # 本质是dict({'name':'jack','age':18,'salary':20000.4})
  5 # 字典定义格式2:就是将{}换成了(),前面加了dict转换,()内格式为key=value中间用逗号隔开
  6 # 前面需要用dict强转在()内用逗号分隔开的多个元素,每个元素都是key=value的形式,value可以是任意数据类型,而key则必须是不可变类型,通常key是str类型,因为str类型可以对value有描述性功能。
  7 info = dict(name='jack', age=18, salary=20000.4)
  8 # 字典类型转换
  9 # 转换1:通过dict()的形式强制类型转换,()内是一个列表,列表内每个元素都是一个列表,格式为key,value
 10 info1 = dict([['name', 'tony'], ['age', 18]])
 11 print(info1)
 12 
 13 # 转换2:通过调用空字典{}的frromkeys方法,相当于是初始化了字典的key,value的初始化还得通过赋值操作
 14 # 参数1是一个key的元组
 15 # 参数2是一个value值,
 16 info2 = {}.fromkeys(('name', 'age', 'sex'), None)
 17 info['name'] = 'jack'
 18 info['age'] = 18
 19 info['sex'] = 'male'
 20 print(info2)
 21 # 字典使用
 22 
 23 # 按key取值
 24 dict1 = {'name': 'jack',
 25          'age': 19,
 26          'hobbies': ['basketball', 'football']}
 27 
 28 print(dict1['name'])
 29 print(dict1['hobbies'][0])
 30 
 31 # 赋值操作
 32 # 如果key不存在于字典中,则会新加key:value
 33 dict1['height'] = 181.5  # key不存在就新加一个key:value
 34 dict1['name'] = 'Bob'  # key存在就修改原来的值
 35 print(dict1)
 36 
 37 # 统计字典长度,这里统计的是key的个数
 38 print(len(dict1))
 39 
 40 # 成员运算in not in
 41 # 判断某个值是否是该字典的key
 42 print('name' in dict1)
 43 print('gender' in dict1)
 44 print('name' not in dict1)
 45 print('gender' not in dict1)
 46 
 47 # 字典的删除pop
 48 # 通过指定字典的key来删除key对应的键值对
 49 # 返回值为所删除key对应的value值
 50 print(dict1.pop('height'))
 51 print(dict1)
 52 
 53 # 获取字典所有的key,所有的value,所有的键值对
 54 # 获取所有的key,方式字典名.keys
 55 # 返回值是一个被dict_keys强制转换的列表
 56 print(dict1.keys())  # dict_keys(['name', 'age', 'hobbies'])
 57 
 58 # for 循环遍历所有的key
 59 for key in dict1.keys():
 60     print(key)
 61 
 62 # 获取字典所有的value,方式:字典名.values
 63 # 返回值是一个被dict_values强制转换的列表
 64 print(dict1.values())  # dict_values(['Bob', 19, ['basketball', 'football']])
 65 
 66 # for 循环遍历所有的value
 67 for value in dict1.values():
 68     print(value)
 69 
 70 # 获取字典所有的键值对,方式:字典名.items
 71 # 返回值是一个被dict_items强制转换的列表,列表中每个元素都是一个元组,元组内一个是key,一个是value
 72 print(dict1.items())  # dict_items([('name', 'Bob'), ('age', 19), ('hobbies', ['basketball', 'football'])])
 73 
 74 for item in dict1.items():
 75     print(item[0])
 76     print(item[1])
 77 
 78 # get()
 79 # 通过key来取值
 80 # key存在则获取key对应的value值
 81 # 字典取值建议使用get方法
 82 print(dict1.get('name'))
 83 print(dict1.get('age'))
 84 print(dict1.get('hobbies'))
 85 # key不存在则返回None
 86 print(dict1.get('gender'))
 87 # key不存在也可以返回默认值
 88 print(dict1.get('gender', 'male'))
 89 
 90 # pop删除元素上面已经演示过了
 91 # popitem(),只要执行一次就会随机删除一次
 92 # 随机删除一个键值对,并将删除的键值放在元组中返回
 93 print(dict1)
 94 # print(dict1.popitem()[0],dict1.popitem()[1]) # 首次删除删除的是hobbies对应的键值对,第二次删除删除的是age对应的键值对hobbies 19
 95 # print(dict1.popitem()[1])
 96 
 97 for item in dict1.popitem():
 98     print(item)
 99     print(item[0])
100     print(item[1])
101 
102 # update
103 # 用新字典更新旧字典,有则改之,无则添加。定义方式:原字典名.update()()内是一个字典
104 
105 print(dict1)
106 dict1.update({'name': 'jack', 'gender': 'male', 'hobbies': ['basketball', 'football']})
107 print(dict1)
108 
109 # fromkeys
110 # 必须得有一个键的列表集合,不然报错
111 dic = dict1.fromkeys(['key'])
112 print(dic)
113 
114 # setdefault
115 # 格式:
116 # 当key不存在时,则新增键值对,默认加在最后,并将键值对的value值返回
117 print(dict1.setdefault('salary', 10000.3))  # 10000.3
118 print(dict1)
119 
120 # 当key存在时,则原字典不改变,返回值为键对应的value值
121 print(dict1.setdefault('name', 'NIUPI'))  # jack
  •  list
  1 # 集合作用: list tuple dict 都可以存放多个值,但是集合主要是用来去重和关系运算
  2 
  3 # 集合定义:在{}内用逗号分隔开的多个元素
  4 
  5 # 集合特点:
  6 # 1、集合内的每个元素都是不可变类型
  7 # 2、集合内的元素是不可以重复的
  8 # 3、集合内的元素是无序的,也就是不可以通过索引取值
  9 
 10 s1 = {1, 2, 3, 4}  # 本质是s1 = set({1,2,3,4})
 11 print(s1)
 12 s1 = set({1, 2, 3, 4})
 13 print(s1)
 14 # print(s1[0]) # 是不可以通过下标访问的,会报错TypeError: 'set' object is not subscriptable
 15 
 16 # 对于列表、元组类型来说是索引对应值,对于字典来说是key对应值,都可以取到对应的单个值。而集合类型没有索引也没有key与值对应,所以无法取到单个值
 17 
 18 # 集合主要是用来去重和关系运算,没有取出单个值的需求。
 19 
 20 # {}既可以用来定义字典也可以用来定义集合,字典{}内是key:value的格式,如果定义一个空字典和空集合
 21 s2 = {}  # 定义空字典
 22 s3 = set()  # 定义空集合
 23 print(s2, type(s2))
 24 print(s3, type(s3))
 25 
 26 # 列表类型转换
 27 # 但凡能被for循环遍历的数据类型都可以传给set()转换成集合类型
 28 # 强调:for循环遍历出的每个元素必须是不可变类型
 29 
 30 s1 = set([1, 2, 3, 4])  # 列表
 31 s2 = set((1, 2, 3, 4))  # 元组
 32 s3 = set('hello world')  # 字符串
 33 s4 = set({'name': 'egon', 'age': 18})  # 字典
 34 
 35 print(s1, type(s1))
 36 print(s2, type(s2))
 37 print(s3, type(s3))
 38 print(s4, type(s4))
 39 
 40 # 关系运算
 41 
 42 num1 = {1, 2, 3, 4}
 43 num2 = {5, 6, 3, 4}
 44 
 45 # 一个集合包含num1和num2的所有数字(合集/并集)
 46 num3 = num1 | num2
 47 print(num3)
 48 
 49 # 求两个数字集合的共同数字(交集)
 50 num4 = num1 & num2
 51 print(num4)
 52 
 53 # 求num1独有的数字(差集)
 54 num5 = num1 - num2
 55 print(num5)
 56 
 57 # 求num2独有的数字(差集)
 58 num6 = num2 - num1
 59 print(num6)
 60 
 61 # 求两个用户独有的好友们(对称差集)
 62 num7 = num1 ^ num2
 63 print(num7)
 64 num7 = num1 - num2 | num2 - num1
 65 print(num7)
 66 
 67 # 判断两个集合是否相同
 68 print(num1 == num2)
 69 print({1, 2, 3} == {1, 2, 3})
 70 
 71 # 一个集合是否包含另外一个集合(父集)
 72 print({1, 2, 3} > {2, 3})  # True
 73 print({1, 2, 3, 4} > {1, 2, 3, 4, 5})  # False
 74 print({1, 2, 3} >= {1, 2, 3})
 75 
 76 # 一个集合是否是另一个集合的子集(子集)
 77 print({1, 2, 3} <= {1, 2, 3})
 78 print({1, 2, 3} < {1, 2, 3})
 79 print({1, 2, 3} <= {1, 2})
 80 
 81 # 去重
 82 # 集合去重有局限性
 83 # 只能针对不可变类型
 84 # 集合本身是无序的,去重之后无法保留原来的顺序
 85 
 86 l = ['a', 'b', 1, 'a', 'a']
 87 # s = set(l)
 88 # # 集合本身是无序的
 89 # print(s)
 90 # l = list(s)
 91 # print(l)  # 返回给列表时无法保证原来的顺序
 92 
 93 # 通过代码实现列表去重后保证了原来的顺序
 94 new_l = []
 95 for temp in l:
 96     if temp not in new_l:
 97         new_l.append(temp)
 98 
 99 print(new_l)
100 
101 # 不可以通过代码实现元组去重,因为本身元组内的元素值就是不可改变的
102 tup = (1, 2, 3, 1, 2, 4)
103 s = set(tup)
104 new_tup = list(s)
105 print(new_tup)
106 
107 # 通过代码实现字符串内字符去重
108 str1 = 'hello world'
109 new_str1 = ''
110 
111 for s in str1:
112     if s not in new_str1:
113         new_str1 += s
114 
115 print(new_str1)
116 
117 # 通过代码实现字典内重复数据去重
118 dict1 = [{'name': 'egon', 'age': 18, 'gender': 'male'},
119          {'name': 'alex', 'age': 73, 'gender': 'fmale'},
120          {'name': 'Bob', 'age': 57, 'gender': 'male'},
121          {'name': 'egon', 'age': 18, 'gender': 'male'},
122          {'name': 'egon', 'age': 18, 'gender': 'male'}]
123 
124 # new_dict1 = set(dict1) # 列表中的每个元素是字典,是可变类型,是不可哈希的,所以会报错,只能通过代码形式去重
125 new_dict1 = []
126 for d in dict1:
127     if d not in new_dict1:
128         new_dict1.append(d)
129 print(
130     new_dict1)  # [{'name': 'egon', 'age': 18, 'gender': 'male'}, {'name': 'alex', 'age': 73, 'gender': 'fmale'},
131 # {'name': 'Bob', 'age': 57, 'gender': 'male'}]
132 
133 # 既去除了重复又保证了顺序
134 
135 # 集合长度
136 print(len(new_dict1))
137 
138 # 关系运算,判断一个元素是否在该集合中
139 print({'name': 'egon', 'age': 18, 'gender': 'male'} in new_dict1)
140 print({'name': 'egon1', 'age': 18, 'gender': 'male'} in new_dict1)
141 
142 # 集合的循环
143 for i in new_dict1:
144     print(i)
145 
146 """
147 一.关系运算
148   有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
149   pythons={'jason','egon','kevin','ricky','gangdan','biubiu'}
150   linuxs={'kermit','tony','gangdan'}
151   1. 求出即报名python又报名linux课程的学员名字集合
152   2. 求出所有报名的学生名字集合
153   3. 求出只报名python课程的学员名字
154   4. 求出没有同时这两门课程的学员名字集合
155 """
156 pythons = {'jason', 'egon', 'kevin', 'ricky', 'gangdan', 'biubiu'}
157 linuxs = {'kermit', 'tony', 'gangdan'}
158 # 求出即报名python又报名linux课程的学员名字集合
159 print(pythons & linuxs)
160 # 求出所有报名的学生名字集合
161 print(pythons | linuxs)
162 # 求出只报名python课程的学员名字
163 print(pythons - linuxs)
164 # 求出没有同时报这两门课程的学员名字集合
165 print(pythons ^ linuxs)
166 
167 # 可变类型与不可变类型
168 # 可变类型:值发生改变时,内存地址没变,即id没变,证明了就是在改原值
169 # 不可变类型:值发生改变时,内存地址也变了,即id也变了,证明了不是在改原值,而是重新创建了一个值
170 
171 # 数字类型是不可变类型
172 x = 10
173 print(id(x))  # 1470562435600
174 x = 20
175 print(id(x))  # 1470562435920
176 
177 # 上述现象表明值发生改变了,x的值从10变成20,但是id也变了,也就是用的不是同一块内存空间,即产生了新的值,所以数字类型是不可变类型
178 
179 str1 = 'hello'
180 print(id(str1))  # 2291141388272
181 str1 = 'world'
182 print(id(str1))  # 2291141388400
183 
184 # st1的值从'hello'变成了'world',但是id也变了,也就是用的不是同一块内存空间,即产生了新值,所以字符串类型也是不可变类型
185 
186 list1 = ['tom', 'jack', 'anne']
187 print(id(list1))  # 3091933207936
188 list1 = ['tom1', 'jack1', 'anne1']  # 这相当于是重新创建了一个集合
189 print(id(list1))  # 3091933452736
190 
191 # list1的值从['tom', 'jack', 'anne']变成了['tom1', 'jack1', 'anne1'],但是id也变了,也就是用的不是同一块内存空间,即产生了新值,
192 # 所以针对列表本身它其实是不可变类型
193 
194 # 列表内元素'haha'变成了'niubi',但是list2的id没变,也就是用的还是用一块内存空间,即没有产生新值,也就是列表是可变类型
195 # 但是反过来再看列表内的字符串就是不可变类型
196 list2 = ['haha', 'xixi', 'hehe']
197 print(id(list2))
198 print(id(list2[0]))  # 2596136168048
199 list2[0] = 'niubi'
200 print(id(list2))
201 print(id(list2[0]))  # 2596136168240
202 
203 # 元组
204 t1 = ('tom', 'jack', [1, 2])
205 # t1[0] = 'TOM'  # 元组类型只能取不能改
206 # 元组内的元素无法修改,指的是元组内索引指向的内存地址不能被修改
207 print(t1)
208 # 1532888623280
209 # 1532888623344
210 # 1532888573568
211 print(id(t1[0]))
212 print(id(t1[1]))
213 print(id(t1[2]))
214 print(id(t1[2][0]))
215 t1[2][0] = 111  # 如果元组内的某个元素是可变类型,它的值是可以修改的,但是修改后还是不影响元组内索引指向的内存地址不变,变的只是元组内可变元素的内存地址。
216 # 1532888623280
217 # 1532888623344
218 # 1532888573568
219 print(id(t1[0]))
220 print(id(t1[1]))
221 print(id(t1[2]))
222 print(id(t1[2][0]))
223 
224 # 字典类型
225 dict1 = {'name': 'egon',
226          'age': 10,
227          'gender': 'male'}
228 
229 print(id(dict1))  # 2082429610688
230 dict1['name'] = 'lijipeng'
231 print(id(dict1))  # 2082429610688
232 
233 # 字典内值改变后,字典本身的内存地址没变,也就是字典是可变类型
  •  test1
 1 name = " aleegonxX"
 2 # 1)    移除 name 变量对应的值两边的空格,并输出处理结果
 3 print(name.strip(' '))
 4 # 2)    判断 name 变量对应的值是否以 "al" 开头,并输出结果
 5 print(name.startswith('al'))
 6 # 3)    判断 name 变量对应的值是否以 "X" 结尾,并输出结果
 7 print(name.endswith('X'))
 8 # 4)    将 name 变量对应的值中的 “l” 替换为 “p”,并输出结果
 9 print(name.replace('l', 'p'))
10 # 5)    将 name 变量对应的值根据 “l” 分割,并输出结果。
11 print(name.split('l'))
12 # 6)    将 name 变量对应的值变大写,并输出结果
13 print(name.upper())
14 # 7)    将 name 变量对应的值变小写,并输出结果
15 print(name.lower())
16 # 8)    请输出 name 变量对应的值的第 2 个字符?
17 print(name[1])
18 # 9)    请输出 name 变量对应的值的前 3 个字符?
19 print(name[0:3])
20 # 10)    请输出 name 变量对应的值的后 2 个字符?
21 print(name[-2:])
22 # 11)    请输出 name 变量对应的值中 “e” 所在索引位置?
23 print(name.index('e'))
24 print(name.find('e')) # 推荐使用find
25 # 12)    获取子序列,去掉最后一个字符。如: egonlin 则获取egonli
26 # print(name.split(name[-1])[0])
27 print(name[:-1])
  • test2
 1 # 简单购物车,要求如下:
 2 # 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入  
 3 
 4 msg_dic = {
 5     'apple': 10,
 6     'tesla': 10000,
 7     'mac': 3000,
 8     'lenovo': 30000,
 9     'chicken': 10
10 }
11 
12 goods_l = []
13 
14 while True:
15     # 打印商品列表
16     for key, item in msg_dic.items():
17         print('name = {name},price = {price}'.format(name=key, price=item))
18     choice = input('商品>>:').strip()
19     if not choice or choice not in msg_dic: continue
20     if choice == 'exit': break
21     count = input('商品个数>>:').strip()
22     if not count.isdigit(): continue
23 
24     good_l = [choice, msg_dic[choice], count]
25     goods_l.append(good_l)
26     print(goods_l)
  • test3
 1 # 有如下值集合[11, 22, 33, 44, 55, 66, 77, 88, 99, 90...],将所有大于
 2 # 66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中
 3 #
 4 # 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
 5 '''
 6 有如下值集合[11, 22, 33, 44, 55, 66, 77, 88, 99, 90...],
 7 将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
 8 '''
 9 
10 list1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
11 l1 = []
12 l2 = []
13 a = {'k1': l1, 'k2': l2}
14 for i in list1:
15     if i > 66:
16         l1.append(i)
17     elif i < 66:
18         l2.append(i)
19 
20 print(a)
  • test4
 1 '''
 2 统计s="hello egon egon say hello xxx xxx"中每个单词的个数
 3 # 结果如:{"hello":2,"egon":2,"say":1,"xxx":2}
 4 '''
 5 
 6 # 我自己想出来的方式1:
 7 s = 'hello egon egon say hello xxx xxx'
 8 msg_keywords = {}
 9 msg_l = s.split(' ')
10 
11 for keyword in msg_l:
12     if keyword not in msg_keywords:
13         msg_keywords.setdefault(keyword, 1)
14     else:
15         msg_keywords.update({keyword: msg_keywords[keyword] + 1})
16 
17 print(msg_keywords)
18 
19 # 方式2:使用列表中的count()方法来统计单词的个数
20 s = 'hello egon egon say hello xxx xxx'
21 words = s.split(' ')
22 dic = {}
23 for word in words:
24     dic[word] = words.count(word)
25 print(dic)
26 
27 # 方式3:利用setdefault去掉重复值
28 s = 'hello egon egon say hello xxx xxx'
29 words = s.split(' ')
30 dic = {}
31 for word in words:
32     dic.setdefault(word,words.count(word))
33 
34 print(dic)
35 
36 # 方式4:利用集合去重
37 s = 'hello egon egon say hello xxx xxx'
38 words = s.split(' ')
39 l = list(words)
40 dic = {}
41 
42 for word in l:
43     dic[word] = words.count(word)
44 
45 print(dic)
  • test5
 1 '''
 2 关系运算
 3   有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
 4   pythons={'xiaohua','egon','mimi','gangdan','biubiu'}
 5   linuxs={'mimi','xiaohei','gangdan'}
 6   1. 求出即报名python又报名linux课程的学员名字集合
 7   2. 求出所有报名的学生名字集合
 8   3. 求出只报名python课程的学员名字
 9   4. 求出没有同时这两门课程的学员名字集合
10 '''
11 pythons={'xiaohua','egon','mimi','gangdan','biubiu'}
12 linuxs={'mimi','xiaohei','gangdan'}
13 
14 print(pythons & linuxs)
15 print(pythons | linuxs)
16 print(pythons - linuxs)
17 print(pythons ^ linuxs)

 

posted @ 2024-10-22 18:01  lzp123456  阅读(5)  评论(0编辑  收藏  举报