#元组类型
#一:基本使用
# 1 用途:元组是不可变的列表,能存多个值,但多个值只有取的需求,而没有改的需求,那么用元组最合理
#
# 2 定义方式:在()内用逗号分割开,可以存放任意类型的值
# names=('alex','egon','wxx') #names=tuple(('alex','egon','wxx'))
# print(type(names))
# 强调: 当元组内只有一个元素时,务必记住加一个逗号
# x=('egon',)
# print(type(x))
# 3 常用操作+内置的方法
#1、按索引取值(正向取+反向取):只能取
# names=('alex','egon','wxx')
# names[0]='sb'
#2、切片(顾头不顾尾,步长)
# names=('alex','egon','wxx','lxx','cxxx')
# print(names[1:3]
# )
#3、长度
# names=('alex','egon','wxx','lxx','cxxx')
# print(len(names))
#4、成员运算in和not in
# names=('alex','egon','wxx','lxx','cxxx')
# print('alex' in names)
#5、循环
# names=('alex','egon','wxx','lxx','cxxx')
# for item in names:
# print(item)
# #二:该类型总结
# 1 存一个值or存多个值
# 可以存多个值,值都可以是任意数据类型
#
# 2 有序or无序
#有序
# 3 可变or不可变
#不可变
names=('alex','egon','wxx','lxx','cxxx','lxx')
# del names[0] #会报错,原因是元组不能被修改 :TypeError: 'tuple' object doesn't support item deletion
# names[0]='sb'
# print(names.count('lxx')) #count统计元组中指定元素的个数
# print(names.index('wxx',0,3)) #index统计指定切片内,指定元素的索引
# names=('alex','egon','wxx','lxx','cxxx','lxx')
# names=1 #这不叫改元组值,只是对一个元组重新赋值
# l=[1,243,3] #
# # l=3333
# l=['a','b','c']
# print(id(l))
# print(id(l[0])) #改变列表中元素的值,列表的id不会改变,但是列表中元素的id会改变
# l[0]='A'
# print(id(l))
# print(id(l[0])) #列表可变是指内存地址是
# names=('a','b','c')
# 列表可变的底层原理:
#指的是索引所对应的值的内存地址是可以改变的
# 元组不可变的底层原理:
#指的是索引所对应的值的内存地址是不可以改变的
#或者反过来说,只要索引对应值的内存地址没有改变,那么元组始终是没有改变的
# t1=(['a','b','c'],'wc','office')
#
# print(id(t1[0])) #元组中三个元素对应的id是不同的,id=2135396392648
# print(id(t1[1]))
# print(id(t1[2]))
# #
# t1[0][0]='AAAA' #本质修改的是元组中列表中元素的值,并不是整体修改元组中一个元素的值
# print(t1)
# #
# print(id(t1[0])) #id=2135396392648 修改了元组中第一个列表中的值所以id是不变的
#练习
#队列:先进先出
# l=[]
# # 入队
# # l.append('王苗鲁')
# # l.append('王成龙')
# # l.append('大脑门')
# #出队
# print(l.pop(0))
# print(l.pop(0))
# print(l.pop(0))
#堆栈:先进后出
# l=[]
# #入栈
# l.append('王苗鲁')
# l.append('王成龙')
# l.append('大脑门')
# #出栈
#
# print(l.pop())
# print(l.pop())
# print(l.pop())
msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}
shopping_cart=[]
while True:
for k in msg_dic:
info='商品名:%s 价钱:%s' % (k, msg_dic[k])
print(info.center(50,' '))
name=input('请输入商品名>>: ').strip()
if name not in msg_dic:
# 输入的商品名不合法,打印提示信息并且直接进入下一次循环
print('输了些什么玩儿。。。重输')
continue
# else:
# #输入的商品品合法,结束循环
# break
while True:
count=input('请输入购买个数:').strip()
if count.isdigit():
#输入个数合法
count=int(count)
break
else:
print('商品的个数必须为整数')
# continue # 不加continue也会跳入下一次
# name,count
for item in shopping_cart:
# print(item)
if name == item['name']:
item['count']+=count
break
else:
price=msg_dic[name]
info={'name':name,'count':count,'price':price}
shopping_cart.append(info)
print(shopping_cart)
字典类型
#一:基本使用
# 1 用途:用来存多个值,但每一个值都有一个key与之对应,key对值有描述性的功能
# 当存储多个值表示的不同的状态时,
#
# 2 定义方式:{}内用逗号分隔开多个元素,每一个元素都是key:value的形式
#value可以是任意数据类型,但是key必须为不可变类型,key通常应该是字符串类型,
# d={'x':1,'y':2} #d=dict({'x':1,'y':2})
# d=dict(a=1,b=2,c=3) #通过dict可以创建字典
# print(d)
dic={1:'a',0:'b',1.1:'c',(1,2,3):'d'}
# print(dic[1]) #数字也可以当做key值,但是这样会与索引产生误解,不能明确是通过key取value
# print(dic[0])
# print(dic[1.1]) #不可变类型都可以作为key值,但是通常我们使用字符串作为key值
# print(dic[(1,2,3)])
# dic={[1,2,3]:'a'} #可变类型不可以作为key
# dic={{'x':1}:'a'}
#
# 3 常用操作+内置的方法
#优先掌握的操作:
#1、按key存取值:可存可取
# d={'y':2}
# d['x']=100 #通过key来向字典中加入key:value,如果已经存在key:value,则会在原来的基础上对key对应的value值做替换
# print(d) #{'y': 2, 'x': 100}
# d['z']=3
# print(d)
# d={'x':1,'y':2}
# d['x']=100 #通过key来向字典中加入key:value,如果已经存在key:value,则会在原来的基础上对key对应的value值做替换
# print(d) #{'x': 100, 'y': 2}
# l=['a','b']
# l[2]='c' #而列表不能通过索引添加值,报错是因为索引超出范围,IndexError: list assignment index out of range
# l[1]='c' #通过索引改变列表中指定位置的值
# print(l)
#2、长度len
# d={'x':1,'y':2}
# print(len(d)) #len也可以统计字典中元素的个数
#3、成员运算in和not in
# d={'x':1,'y':2}
# print('x' in d) #in判断一个字符是否在字典中的key值
#4、删除
# d={'x':1,'y':2}
# del d['x'] #del通过key值来删除字典中的key:value
# # print(d)
# res=d.pop('y') #pop通过key删除字典中的key:value,但会拿到删除'y':2中value的值2
# print(d)
# print(res)
# res=d.popitem() #popitem()默认会删除右边的key:value,也会拿到一个返回值,以key,value元组的形式返回('y', 2)
# print(d)
# print(res)
# d={'a':1,'b':2,'c':3,'d':4}
# for k in d: #通过for循环取出字典中所有的key值
# print(k)
# l=[1,2,3] # del通过索引删除列表中的元素
# del l[1]
# print(l)
#5、键keys(),值values(),键值对items()
msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}
# names=[]
# for k in msg_dic: #通过for循环把字典中的key值取出来,在通过append把取出的key值添加到空列表中
# names.append(k)
# print(names) #['apple', 'tesla', 'mac', 'lenovo', 'chicken']
# values=[]
# for k in msg_dic: #通过for循环取出key值,在通过append将value加入到空列表中
# values.append(msg_dic[k])
# print(values)
# keys=msg_dic.keys() #通过keys取出一只老母鸡dict_keys(['apple', 'tesla', 'mac', 'lenovo', 'chicken'])
# print(keys)
# for k in keys: #在循环老母鸡就可以取出字典中的key值
# print(k)
# l=list(keys) #通过list可以将老母鸡转换成一个列表['apple', 'tesla', 'mac', 'lenovo', 'chicken']
# print(l)
#
# vals=msg_dic.values() #通过values取出一只老母鸡dict_values([10, 100000, 3000, 30000, 10])
# print(vals)
# print(list(vals)) #同过list将老母鸡的value转换成一个列表[10, 100000, 3000, 30000, 10]
# print(msg_dic.items()) #通过items取出一只老母鸡dict_items([('apple', 10), ('tesla', 100000), ('mac', 3000), ('lenovo', 30000), ('chicken', 10)])
# print(list(msg_dic.items())) #通过list将老母鸡转换成一个列表,列表中的元素以小元组的形式存在[('apple', 10), ('tesla', 100000), ('mac', 3000), ('lenovo', 30000), ('chicken', 10)]
#6、循环
msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}
# 只取key
# for k in msg_dic: #循环字典本质就是循环字典中的key值
# print(k,msg_dic[k])
# for k in msg_dic.keys():
# print(k,msg_dic[k])
# 只取value
# for v in msg_dic.values(): #通过点values循环出字典中的所有value值
# print(v)
#取key和value
# for k,v in msg_dic.items(): #k,v=('apple', 10) 变量的解压
# print(k,v) #通过点items取出加for循环取出字典中的key和value值
# 需要掌握的内置方法(****)
# d={'x':1,'y':2,'z':3}
# v=d.get('xxxx') #点get的方法和通过key取value值得功能一样,只是get通过key取值是如果key不存在,不会报错
# print(v)
# print(d['xxxxxxx']) #key值不存在,取不到value就会报错KeyError: 'xxxxxxx'
# d={'x':1,'y':2,'z':3}
# d1={'a':1,'x':1111111}
# d.update(d1) #update会更新原有字典中的key:value,存在则更新,不存在加入到原字典中
# print(d) #{'x': 1111111, 'y': 2, 'z': 3, 'a': 1}
# l=['name','age','sex']
# d={}
# for k in l:
# d[k]=None
# print(d) #打印结果{'name': None, 'age': None, 'sex': None}
# d=dict.fromkeys(l,None) #不使用for循环,使用dict.fromkey也可以实现将一个列表转换成字典,并给不同的key加上默认的value值
# d=dict.fromkeys(l,18) #{'name': 18, 'age': 18, 'sex': 18}
# print(d)
# info.setdefault
# info={'name':'egon','age':18,'sex':'male'}
# 如果字典中有setdefault指定的key,那么不改该key对应的值,返回原的value
# res=info.setdefault('name','EGON_NB')
# print(info)
# print(res)
# 如果字典中没有setdefault指定的key,那么增加一个key:value,返回新的value
# info.setdefault('height',1.80)
# print(info)
#
# info={'age':18,'sex':'male'}
# v=info.setdefault('name','浩哥') #因为字典中没有('name','浩哥'),setdefault就会将其放入字典中,并将新的value值返回
# print(v) #浩哥
# print(info) #{'age': 18, 'sex': 'male', 'name': '浩哥'}
# 统计串中各个单词的个数
# s='hello alex alex say hello sb sb'
# l=s.split() #split将字符串切分成列表
# print(l) #['hello', 'alex', 'alex', 'say', 'hello', 'sb', 'sb']
# d={}
# for word in l: #word= 'hello' #循环列表拿到每一个单词
# if word not in d: #判断单词是否在字典中
# d[word]=1 #{'hello':2, 'alex':2,'say':1} #不在则说明是一个新的单词,将其以key:value的形式刚入到字典中去
# else:
# d[word]+=1 #字典中已经存在的单词,对其value加一操作,即单词的个数
# print(d) #{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}
# s='hello alex alex say hello sb sb'
# l=s.split()
# print(l)
# d={}
# d={'hello':2,'alex':2}
# for word in l: #word='alex' #循环取出列表中的单词
# # d[word]=l.count(word) #d['alex']=2 #通过count统计列表中某个单词的个数,将写进到字典中单词对应的value值(方法一)
# d.setdefault(word,l.count(word)) #将key,value放到字典中(方法二)
# print(d)
# #二:该类型总结
# 1 存一个值or存多个值
# 可以存多个值,值都可以是任意类型,而key必须是不可变类型,通常应该是不可变类型中字符串类型
#
# 2 有序or无序
# 无序
#
# 3 可变or不可变
# d={'x':1,'y':2}
# print(id(d))
# d['x']=1111
# print(id(d))
# d=123