Python 3 学习——字典以及字符串与购物车实践
Python 学习的第四小节
写此博客 是为了激励自己,并且将自己的心得以及遇到的问题与人分享
一、笔记
1.元组也被称为——可读列表 元组可以通过切片的方式,把值取出来
对于一些数据如果我们不想去修改它,可以将其建立成为元组。
2.字典
通过一个大括号来创建的 dic1 = {'name':'lfd','age':'22','sex':'man' } key-value 形式存储数据 name 不可以被修改且唯一
①字典是无序存储的 ②键唯一,key必须是可哈希的(不可变类型)数字、字符串、元组③value值也可以是字典
dic = {'name':'liufeiduo','age':'22','sex':'man','loving':'basketball','ishandsome':True}
print(dic['name'])
字典的操作:
增:
① dic1 = {'name':'liufeiduo'}
dic1['age'] = '22' 这样就为字典dic1内部增加了一个键值对,如果键存在的化,那么为修改操作。
② 使用setdefault( ) 方法进行增加,setdefault()是有返回值的。
dic1.setdefault('age',34) 对字典的一个设定,如果存在键age,那么将不修改其值。如果没有,加入进去。
查:
① 通过键去查询。 print(dic1['name']) print(dic1.get('name'))
② 还有一些方法。 list(dic1.items()) dic1.keys() dic1.values() 取出来的值并不是list类型的值,需要进行一次转换
改:
① dic1['age'] = 23 更改的方式同列表修改类似
② update修改方法 dic2 = {‘name':'xiaofeifei','age':'18','hobby':'sing and dance'}
dic1.update(dic2) 之后 dic1与dic2中重复的键都被dic2中的值所覆盖,不存在的键添加上去。
删:
① del dic1['name'] 直接删除某一键下的值 del dic1 删除整个字典
② dic1.clear 就剩下一个空的字典了,和列表的方法也差不多
③ dic1.pop('age') 删除指定键值对并返回该键值对的值 dic1.popitem() 随机删除一组键值对并以元组返回值
某些其它操作:
dic3 = dict.fromkeys(['host1','host2','host3'],'test')
print(dic3) #{'host1':'test','host2':'test','host3':'test'} 用的不多
3.字典的嵌套
# av_catalog = {
# "欧美":{
# "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
# "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
# "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
# "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
# },
# "日韩":{
# "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
# },
# "大陆":{
# "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
# }
# }
4.字典的排序
根据你的键来排序
sorted(dic1) 也可以 sorted(dic1.values()) 进行排序
5.字典的遍历
for i in dic1:
print(i) 默认循环遍历字典的键
for i in dic1:
print(i,dic1[i]) 打印的键,和键值 相比于后者,效率高一点
for i,v in dic1.items()
print( i , v ) 打印值
6.id() 方法 打印内存地址
7.不可变类型:整型 字符串 元组 可变类型: 列表 字典
8.字符串
String 操作
①重复输出字符串 print('woailiufeiduo' * 20)
②通过索引和切片的方式取出字符串中的字符 print('hello world' [2:])
③判断字符在不在字符串当中 print('e21' in 'hello') 返回的是False
④格式字符串 print('%s is a good man'%'liufeiduo')
⑤字符串拼接 a = '123' b = 'abc' c = a+b or c = ' '.join([a,b]) 通过' '内部的字符串将其拼接起来
字符串的内置方法
#摘一些重要的字符串方法
#1 print(st.count('l'))
# print(st.center(50,'#')) # 居中
# print(st.startswith('he')) # 判断是否以某个内容开头 重要
# print(st.find('t'))
# print(st.format(name='alex',age=37)) # 格式化输出的另一种方式 待定:?:{}
# print('My tLtle'.lower())
# print('My tLtle'.upper())
# print('\tMy tLtle\n'.strip())
# print('My title title'.replace('itle','lesson',1))
# print('My title title'.split('i',1))
二、实践学习
购物车需求:
1.首先输入用户的工资。
2.然后弹出购物菜单
购物菜单格式为 1. iphone 5000 这种
有若干商品和价格的列表
3.让用户输入 输入要购买的商品
4.判断用户是否买的起,买不起,提示余额不足但不退出程序,继续显示菜单。
5.买的起的话,把买的东西加到购物车中,并显示当前余额。
6.继续进行购买菜单
7.购物菜单有一个退出选项
8.用户选择了退出选项后,打印已经购买的东西,价格以及余额。
9.欢迎下次光临
思路:
输入用户工资用input,int强转成整数形进行运算。
购物菜单使用列表来进行显示 使用两个列表一个物品,一个价格。
用户输入想要的物品,这里需要一个大循环不断循环输入,然后用判断。
若用户买的起,将买的东西加入一个新的列表中,花费的价格也加入一个新的列表
用户余额大于商品价格的产品才能加入到新的列表中,不然不能加入。
退出选项后,打印新的物品列表,价格列表。并计算余额。
--------------------------------------------------------------------
思路为最初拿到这道题的思路 之后的思路为通过讲解分析这道题的思路
代码实现:
budget_user = input("please enter your budget: ") #budget_user 用户的预算
budget_user = int(budget_user) #将字符串类型转换为整型方便之后的运算
# 下面是购物菜单的搭建
commodity = ["iphone","mac book","kindle","coffee","Python book","computer"] #商品菜单的搭建
price = ["6500","10000","558","35","50","9500"] #价格菜单的搭建
print("---------------购物菜单--------------")
for i in range(0,6):
print(i,commodity[i],price[i])
print("q","退出购物菜单")
print("---------------购物菜单--------------")
#开始进行用户输入部分的代码
bought = [] # 已买清单
new_price = [] # 花费的钱
while True:
select = input("Please enter your select: ")
if select == "q":#设置用户输入q退出购物菜单
print("您已经购买了",bought)
print("您所购买的商品价格为",new_price)
print("您的余额为",budget_user)
print("------------欢迎您下次光临------------")
break
else:
select = int(select)
if budget_user > int(price[select]):#判断用户余额是否大于商品价格
bought.append(commodity[select])#将已经购买的商品存入已买清单
new_price.append(price[select])#将已买商品的价格存起来
budget_user = budget_user - int(price[select])#将余额计算出来
print("购买成功",budget_user)
else:
print("余额不足")
以上代码为初代代码,仅仅能实现功能,但还有不少的漏洞,例如对输入select选择数字的类型判断等
思路:
在进行购物菜单的搭建时,不使用两个列表来进行构建,使用列表嵌套的形式来进行搭建。
例如[["mac book",5000],["kindle",558],...]
对用户输入的预算进行一个字符判断,防止输入了非法字符 saving.isdigit()。
然后要对字符串类型的预算进行一个强制转换成int类型,方便运算。int()
在商品序号的时候使用了enumerate()方法。
代码实现:
product_list=[
('Mac',9000),
('kindle',800),
('tesla',900000),
('python book',105),
('bike',2000),
]
saving=input('please input your money:')
shopping_car=[]
if saving.isdigit():
saving=int(saving)
while True:
#打印商品内容
for i,v in enumerate(product_list,1):
print(i,'>>>>',v)
#引导用户选择商品
choice=input('选择购买商品编号[退出:q]:')
#验证输入是否合法
if choice.isdigit():
choice=int(choice)
if choice>0 and choice<=len(product_list):
#将用户选择商品通过choice取出来
p_item=product_list[choice-1]
#如果钱够,用本金saving减去该商品价格,并将该商品加入购物车
if p_item[1]<saving:
saving-=p_item[1]
shopping_car.append(p_item)
else:
print('余额不足,还剩%s'%saving)
print(p_item)
else:
print('编码不存在')
elif choice=='q':
print('------------您已经购买如下商品----------------')
#循环遍历购物车里的商品,购物车存放的是已买商品
for i in shopping_car:
print(i)
print('您还剩%s元钱'%saving)
break
else:
print('invalid input')
以上为改进后的代码。
三、心得
发现代码还是要自己写,自己亲手去写一段程序,哪怕你看起来逻辑很简单的程序,在写上面那段程序时,
最初还因为while循环一直卡住了,发现了一些很小的问题,但如果不亲自动手去写的话恐怕也就发现不了了,
其余的学习还在一步一步踏踏实实的进行着,有时候在学习的过程中会分心,会干别的,这是接下来的学习要
避免的东西。