一、列表LIST
列表的下标是从0开始的,最后一个元素的下标可以用 -1,取元素的时候”顾头不顾尾“。定义如下列表:
names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
1、切片:
1 >>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] 2 >>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4 3 ['Tenglan', 'Eric', 'Rain'] 4 >>> names[1:-1] #取下标1至-1的值,不包括-1 5 ['Tenglan', 'Eric', 'Rain', 'Tom'] 6 >>> names[0:3] 7 ['Alex', 'Tenglan', 'Eric'] 8 >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 9 ['Alex', 'Tenglan', 'Eric'] 10 >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写 11 ['Rain', 'Tom', 'Amy'] 12 >>> names[3:-1] #这样-1就不会被包含了 13 ['Rain', 'Tom'] 14 >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个 15 ['Alex', 'Eric', 'Tom'] 16 >>> names[::2] #和上句效果一样 17 ['Alex', 'Eric', 'Tom']
2、追加append:
1 >>> names 2 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 3 >>> names.append("我是新来的") 4 >>> names 5 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
3、插入insert:
1 >>> names 2 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 3 >>> names.insert(2,"强行从Eric前面插入") 4 >>> names 5 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 6 7 >>> names.insert(5,"从eric后面插入试试新姿势") 8 >>> names 9 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
4、修改:
1 >>> names 2 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] 3 >>> names[2] = "该换人了" 4 >>> names 5 ['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
5、删除:
三种方式:
a、del 列表[下标索引]
b、列表.remove("元素名称")
c、列表.pop[下标索引],pop和del的区别在于pop会返回删除的元素,但是del无返回值
1 >>> names 2 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] 3 >>> del names[2] 4 >>> names 5 ['Alex', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] 6 >>> del names[4] 7 >>> names 8 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 9 >>> 10 >>> names.remove("Eric") #删除指定元素 11 >>> names 12 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的'] 13 >>> names.pop() #删除列表最后一个值 14 '我是新来的' 15 >>> names 16 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy'] 17 >>> names.pop(1) #删除指定位置的元素 18 Tenglan 19 >>> names 20 ['Alex', 'Rain', 'Tom', 'Amy']
6、扩展extend:
1 >>> names 2 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy'] 3 >>> b = [1,2,3] 4 >>> names.extend(b) 5 >>> names 6 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
7、拷贝:
1 >>> import copy 2 >>> names = ["Alex","Tenglan",["Eric",1000],"Rain","Tom","Amy"] 3 >>> name1=names.copy() 4 >>> name1 5 ['Alex', 'Tenglan', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 6 >>> name2 = copy.copy(names) 7 >>> name2 8 ['Alex', 'Tenglan', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 9 >>> name3=names[:] 10 >>> name3 11 ['Alex', 'Tenglan', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 12 >>> name4=list(names) 13 >>> name4 14 ['Alex', 'Tenglan', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 15 16 上面采取了4种方式对names列表进行了copy操作。 17 现在,我们来继续往下看: 18 >>> names 19 ['Alex', 'Tenglan', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 20 >>> name_copy=list(names) 21 >>> name_copy 22 ['Alex', 'Tenglan', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 23 >>> names[1]='张三' 24 >>> names 25 ['Alex', '张三', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 26 >>> name_copy 27 ['Alex', 'Tenglan', ['Eric', 1000], 'Rain', 'Tom', 'Amy'] 28 注意:这里我们把names列表copy了一个新的列表name_copy,然后我们更改了names表的第2个元素,从结果可以看出新列表name_copy的第2个元素并没有发生改变。 29 30 接着往下看: 31 >>> names[2][1]=7777 32 >>> names 33 ['Alex', '张三', ['Eric', 7777], 'Rain', 'Tom', 'Amy'] 34 >>> name_copy 35 ['Alex', 'Tenglan', ['Eric', 7777], 'Rain', 'Tom', 'Amy'] 36 注意:names列表的第3个元素也是一个列表,这里我们执行names[2][1]=7777后发现,names和name_copy两个列表的相应元素同时发生了改变。 37 38 这就是深度copy和浅度copy,上面的4中copy方式都是浅度copy,浅度copy只能copy第一层的元素,对于列表中含有的列表的元素,只是copy了这个子列表的一个内存地址而已。 39 40 如果要实现我们在改变names列表中列表的元素时,copy过来的列表的对应元素不发生变化,必须显示的进行深度copy,往下看: 41 >>>name_copy2=copy.deepcopy(names) --深度copy
42 >>>names[2][1]=1521 43 >>> names 44 ['Alex', '张三', ['Eric', 1521], 'Rain', 'Tom', 'Amy'] 45 >>> name_copy2 46 ['Alex', '张三', ['Eric', 7777], 'Rain', 'Tom', 'Amy']
8、统计count:
统计某个元素在列表中出现的次数。
1 >>> names=(1,2,3,2,4,5,3,2,7,2,3) 2 >>> names.count(3) 3 3 4 >>> names.count(2) 5 4
9、排序sort、反转reverse:
1 >>> names = ["Alex","Tenglan",["Eric",1000],"Rain","Tom","Amy"] 2 >>> names.sort() #排序 3 Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5 TypeError: '<' not supported between instances of 'list' and 'str' 6 >>> names.pop(2) 7 ['Eric', 1000] 8 >>> names 9 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy'] 10 >>> names.sort() #排序 11 >>> names 12 ['Alex', 'Amy', 'Rain', 'Tenglan', 'Tom'] 13 14 >>> names.reverse() #反转 15 >>> names 16 ['Tom', 'Tenglan', 'Rain', 'Amy', 'Alex']
列表的排序和反转对中文没有效果:
1 >>> names=['zhangsan','张三','章邯'] 2 >>> names.sort() 3 >>> names 4 ['zhangsan', '张三', '章邯'] 5 >>> names=['张三','zhangsan','章邯'] 6 >>> names.sort() 7 >>> names 8 ['zhangsan', '张三', '章邯'] 9 >>> names.append('阿三') 10 >>> names 11 ['zhangsan', '张三', '章邯', '阿三'] 12 >>> names.sort() 13 >>> names 14 ['zhangsan', '张三', '章邯', '阿三'] 15 >>> names.append('asan') 16 >>> names.sort() 17 >>> names 18 ['asan', 'zhangsan', '张三', '章邯', '阿三']
10、获取下标index:
注意:只返回找到指定元素的第一个下标
1 >>> names 2 ['asan', 'zhangsan', '张三', '章邯', '张三', '阿三'] 3 >>> names.index('zhangsan') 4 1 5 >>> names.index('张三') 6 2
二、元组TUPLE
元组和列表其实差不多,只是元组一旦创建就不允许再修改,所以元组又叫做只读列表。
元组的定义:
names = ("Alex","Tenglan","Eric","Rain","Tom","Amy")
元组只有两个方法:count、index、len
1 tu1 = ("Alex","Tenglan","Eric","Rain","Tom","Amy","Eric","Eric") 2 print(len(tu1)) # 8 计算元组中元素的个数 3 print(tu1.count('Eric')) # 3 计算元组中有多少个指定的元素 4 print(tu1.index('Eric')) # 2 查找第一次出现指定元素的位置,如果找不到则报异常 5 print(tu1.index('Eric', 3)) # 6 查找第一次出现指定元素的位置,如果找不到则报异常 6 7 print(tu1.index('Tenglan', 3)) # Error 查找第一次出现指定元素的位置,如果找不到则报异常 8 Traceback (most recent call last): 9 File "D:/python/study/day01.py", line 14, in <module> 10 print(tu1.index('Tenglan', 3)) # Error 查找第一次出现指定元素的位置,如果找不到则报异常 11 ValueError: tuple.index(x): x not in tuple
元组也可以切片:
1 tu1 = ("Alex","Tenglan","Eric","Rain","Tom","Amy") 2 print(tu1[0]) # Alex 3 print(tu1[-1]) # Amy 4 print(tu1[1:3]) # ('Tenglan', 'Eric') 5 print(tu1[:-1]) # ('Alex', 'Tenglan', 'Eric', 'Rain', 'Tom') 6 print(tu1[::]) # ('Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy') 7 print(tu1[::2]) # ('Alex', 'Eric', 'Tom') 8 print(tu1[::-1]) # ('Amy', 'Tom', 'Rain', 'Eric', 'Tenglan', 'Alex')
三、字典DICT
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
字典的特性:
1、键必须是唯一的,但值则不必。
2、Key必须是不可变数据类型(int,str,bool,tuple),但Value可以是任意数据类型(int,str,bool,tuple,list,dict,set)等
创建字典的几种方式:
1 # 方式1: 2 dic = dict((('one', 1),('two', 2),('three', 3))) 3 print(dic) # {'one': 1, 'two': 2, 'three': 3} 4 dic = dict([('one', 1),('two', 2),('three', 3)]) 5 print(dic) # {'one': 1, 'two': 2, 'three': 3} 6 7 # 方式2: 8 dic = dict(one=1,two=2,three=3) 9 print(dic) # {'one': 1, 'two': 2, 'three': 3} 10 11 # 方式3: 12 dic = dict({'one': 1, 'two': 2, 'three': 3}) 13 print(dic) # {'one': 1, 'two': 2, 'three': 3} 14 15 # 方式4: 16 dic = dict(zip(['one', 'two', 'three'],[1, 2, 3])) 17 print(dic) 18 19 # 方式5: 字典推导式 20 dic = {k: v for k,v in [('one', 1),('two', 2),('three', 3)]} 21 print(dic) 22 23 # 方式6:利用fromkey 24 dic = dict.fromkeys('abcd','dict') 25 print(dic) # {'a': 'dict', 'b': 'dict', 'c': 'dict', 'd': 'dict'} 26 27 #很蛋疼,方式太多了记不住,直接用下面的方式不好吗? 28 dic = {'one': 1, 'two': 2, 'three': 3} 29 print(dic) #{'one': 1, 'two': 2, 'three': 3}
字典常用的方法:
增
1 # 通过键值对直接增加 2 # 如果key存在,则会修改这个key对应的value,如果key不存在就增加 3 dic = {'name': '张三', 'age': 18} 4 dic['weight'] = 79 # weight键不存在,增直接增加此键值对 5 print(dic) 6 7 dic['name'] = '李四' # name这个键已经存在,则修改值为 李四 8 print(dic) 9 10 # 通过setdefault增加 11 # 如果key存在,则不做任何改变,如果key不存在就增加 12 # setdefault是有返回值的 13 dic.setdefault('height',180) # height 键不存在,则会增加此键值对 14 print(dic) 15 16 dic.setdefault('name','王五') # name键已经存在,则不会发生任何改变 17 print(dic) 18 19 ret = dic.setdefault('name') # setdefault有两个参数,如果只有key,则返回value 20 print(ret)
删
1 dic = {'name': '李四', 'age': 18, 'weight': 79, 'height': 180} 2 3 # pop,通过key来删除字典的键值对,有返回值,返回key对应的value 4 # 可以设置默认的返回值 5 ret = dic.pop('age') 6 print(ret) # 18 7 8 ret = dic.pop('wahaha',None) 9 print(ret,dic) # None {'name': '李四', 'weight': 79, 'height': 180} 10 11 ret = dic.pop('wahaha','QQXing') 12 print(ret,dic) # QQXing {'name': '李四', 'weight': 79, 'height': 180} 13 14 # popitem, 删除最后一个键值对 15 ret = dic.popitem() # 返回值ret是一个元组 16 print(ret,dic) # ('height', 180) {'name': '李四', 'weight': 79} 17 18 # del, 通过key删除,如果没有指定key,则会删除整个字典 19 dic = {'name': '李四', 'age': 18, 'weight': 79, 'height': 180} 20 del dic['weight'] 21 print(dic) 22 23 del dic['wahaha'] # wahaha这个key不存在,会报错 24 Traceback (most recent call last): 25 File "D:/python/study/day01.py", line 23, in <module> 26 del dic['wahaha'] 27 KeyError: 'wahaha' 28 29 del dic # del 删除整个字典,打印会报错 30 print(dic) # NameError: name 'dic' is not defined 31 32 # clear, 清空字典 33 dic.clear() 34 print(dic) # {}
改
1 # 通过设置键值对直接改,存在就改,不存在会增加 2 dic = {'name': '李四', 'age': 18} 3 dic['name'] = '王五' 4 print(dic) # {'name': '王五', 'age': 18} 5 6 # update 7 dic = {'name': '李四', 'age': 18} 8 dic.update(weight = 79, height = 180) 9 print(dic) # {'name': '王五', 'age': 18, 'weight': 79, 'height': 180} 10 11 dic = {'name': '李四', 'age': 18} 12 dic.update([(1,'a'),(2,'B'),(3,'c')]) 13 print(dic) # {'name': '李四', 'age': 18, 1: 'a', 2: 'B', 3: 'c'} 14 15 dic1 = {'name': '李四', 'age': 18} 16 dic2 = {'name': '王五', 'weight': 79, 'height': 180} 17 dic1.update(dic2) # 把dic2合并到dic1,dic1中有的就替换,没有的就新增 18 print(dic1) # {'name': '王五', 'age': 18, 'weight': 79, 'height': 180} 19 print(dic2) # {'name': '王五', 'weight': 79, 'height': 180}
查
1 dic = {'name': '王五', 'age': 18} 2 3 # 通过键查,直接用dic[key]。 4 # 注意:如果key不存在则会报错 5 ret = dic['name'] 6 print(ret) # 王五 7 8 # get,用dic.get(key) 9 # 如果key不存在则默认返回None,也可以指定一个默认的返回值,如“查无此键” 10 # 如果key存就返回对应value 11 ret = dic.get('name') 12 print(ret) # 王五 13 14 ret = dic.get('wahaha') 15 print(ret) # None 16 17 ret = dic.get('wahaha', '查无此键') 18 print(ret) # 查无此键 19 20 # dic.keys(),返回所有的key组成的一个列表,可转换成列表 21 ret = dic.keys() 22 print(ret) # dict_keys(['name', 'age']) 23 ret = list(ret) 24 print(ret) # ['name', 'age'] 25 26 # dic.values(),返回所有的value组成的一个列表 27 ret = dic.values() 28 print(ret) # dict_values(['王五', 18]) 29 ret = list(ret) 30 print(ret) # ['王五', 18] 31 32 # dic.items(),返回整个字典,返回值是一个列表,每个元素是字典的每个键值对形成的一个元组 33 ret = dic.items() 34 print(ret) # dict_items([('name', '王五'), ('age', 18)]) 35 ret = list(ret) 36 print(ret) # [('name', '王五'), ('age', 18)] 37 38 # 判断某个key是否存在 39 if 'name' in dic: 40 print('key:name is exist') 41 42 # 循环打印字典 43 # 下面两种方式结果一样,但是第一种方式比第二种性能高很多。第二种在循环之前会把整个字典的键值对转成list都装入内存,数据量大时千万慎用。 44 for i in dic: 45 print(i,dic[i]) 46 47 # 效率极其低下 48 for k,v in dic.items(): 49 print(k,v) 50 51 # fromkeys,不知道哪里可以用到 52 dic = dict.fromkeys('abcd','小蜗') 53 print(dic) # {'a': '小蜗', 'b': '小蜗', 'c': '小蜗', 'd': '小蜗'} 54 55 dic = dict.fromkeys([1, 2, 3],'小蜗') 56 print(dic) # {1: '小蜗', 2: '小蜗', 3: '小蜗'}
四、集合set
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
创建格式:
set1 = {value01,value02,...}
或者
set(value)
1、创建集合
1 set1 = set() # 定义一个空集合,用set() 2 print(set1,type(set1)) # set() <class 'set'> 3 set1.add('孙悟空') 4 set1.add('如来佛') 5 print(set1) # {'孙悟空', '如来佛'} 6 7 set2 = set('abc') 8 print(set2) # {'b', 'a', 'c'} 9 10 set3 = set(1,2,3) # 报错 11 Traceback (most recent call last): 12 File "D:/python/study/day01.py", line 11, in <module> 13 set3 = set(1,2,3) 14 TypeError: set expected at most 1 arguments, got 3
2、增(add 、update)
1 set4 = set({2,4,6}) 2 3 # 添加一个元素 4 set4.add(999) 5 print(set4) # {2, 4, 6, 999} 6 7 # 添加多个元素,迭代着增加。参数可以是(列表、元组、集合) 8 set4.update([44,55,66]) # 参数是列表 9 print(set4) # {2, 66, 4, 6, 999, 44, 55} 10 11 set4.update(('a','b'),('c','d')) # 参数是元组 12 print(set4) # {'b', 'c', 2, 66, 4, 'd', 6, 999, 44, 'a', 55} 13 14 set4.update({'one','two'},{'three','four'}) # 参数是集合 15 print(set4) # {'b', 'c', 2, 66, 4, 'd', 6, 999, 'four', 44, 'three', 'one', 'a', 55, 'two'}
3、删(pop、remove、discard、clear、del)
1 set4 = {2, 66, 44, 6, 999, 55} 2 3 # pop,随机删除一个元素 4 ret = set4.pop() 5 print(set4) # {66, 6, 999, 44, 55} 6 print(ret) # 2 7 8 # remove,删除指定的元素,无返回值(返回None)。元素存在就删除,不存在会报错 9 ret = set4.remove(44) 10 print(set4) # {66, 4, 6, 999, 55} 11 print(ret) # None 12 13 ret = set4.remove(444) 14 Traceback (most recent call last): 15 File "D:/python/study/day01.py", line 59, in <module> 16 ret = set4.remove(444) # 删除指定的元素,无返回值(返回None) 17 KeyError: 444 18 19 # discard,删除指定的元素,无返回值(返回None)。元素存在就删除,不存在无异常抛出 20 ret = set4.discard(66) 21 print(set4) # {66, 4, 6, 999, 55} 22 print(ret) # None 23 24 ret = set4.discard(666) 25 print(set4) # {66, 4, 6, 999, 55} 26 print(ret) # None 27 28 # clear,清空集合 29 set4.clear() 30 print(set4) 31 32 # del,删除集合 33 del set4 34 print(set4) # del后,set4已经不存在了,print会抛出异常 35 Traceback (most recent call last): 36 File "D:/python/study/day01.py", line 80, in <module> 37 print(set4) 38 NameError: name 'set4' is not defined
4、集合的运算
1 list1 = [1,3,5,3,7,9,1,11] 2 list2 = [2,4,5,4,66,7,8,6,2,10] 3 4 #自动去重,无序 5 set1 = set(list1) 6 set2 = set(list2) 7 print(set1) # {1, 3, 5, 7, 9, 11} 8 print(set2) # {2, 4, 5, 6, 7, 8, 10} 9 10 # 交集 11 print(set1.intersection(set2)) # {5, 7} 12 print(set1 & set2) # {5, 7} 13 14 # 并集 15 print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} 16 print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} 17 18 # 差集, 19 print(set1.difference(set2)) # {11, 1, 3, 9} 20 print(set1 - set2) # {11, 1, 3, 9} 21 22 # 子集,父集 23 set3 = set([1,3,5]) 24 25 print(set3.issubset(set1)) # True 26 print(set3 <= set1) # True 27 28 print(set1.issuperset(set3)) # True 29 print(set1 >= set3) # True 30 31 # 对称差集:去掉两者的共同元素后组成的集合 32 print(set1.symmetric_difference(set2)) # 1, 2, 66, 4, 6, 8, 3, 10, 9, 11} 33 print(set1 ^ set2) # 1, 2, 66, 4, 6, 8, 3, 10, 9, 11} 34 35 # 检查是否有相同的元素,如果两个集合没有任何相同的元素,则返回False 36 set4 = set({2,4,6}) 37 print(set3.isdisjoint(set4)) # True 38 set4 = set({1,4,6}) 39 print(set3.isdisjoint(set4)) # False
5、frozenset
不能被修改
t = frozenset('shop') print(t) # frozenset({'s', 'h', 'p', 'o'})
6、成员关系 (in, not in)
1 >>> 'k' in s 2 False 3 >>> 'k' in t 4 True 5 >>> 'c' not in t 6 True
7、集合等价/不等价
1 >>> s == t 2 False 3 >>> s != t 4 True 5 >>> u = frozenset(s) 6 >>> s == u 7 True 8 >>> set('posh') == set('shop') 9 True
五、购物车作业
需求(列表):
1、启动程序后,让用户输入工资,然后打印商品列表
2、用户选择商品编号购买商品
3、用户选择商品后,检测余额是否够,如果余额够就直接扣款,如果不够就提醒
4、可随时退出,退出时打印已购买的上和余额
1 product_list = [('Iphone',5800), 2 ('Mac Pro',9800), 3 ('Bike',800), 4 ('Watch',10600), 5 ('Coffee',31), 6 ('Alex Python',120)] 7 shopping_cart = [] 8 9 salary = input("Input your salary: ") 10 if salary.isdigit(): 11 salary = int(salary) 12 while 1: 13 for item in product_list: 14 print(product_list.index(item) + 1, item) 15 16 user_choice = input("请选择需要购买的商品:").lower() 17 if user_choice.isdigit(): 18 user_choice = int(user_choice) 19 if user_choice > 0 and user_choice <= len(product_list): 20 p_item = product_list[user_choice - 1] 21 if p_item[1] <= salary: 22 shopping_cart.append(p_item) 23 salary = salary - p_item[1] 24 print("Added %s into shopping cart,your current balance is 33[31;1m%s 33[0m"%(p_item[0], salary)) 25 else: 26 print("