首页 > 技术文章 > Python 3 学习——字典以及字符串与购物车实践

jinzejun 2018-02-12 08:57 原文

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循环一直卡住了,发现了一些很小的问题,但如果不亲自动手去写的话恐怕也就发现不了了,
其余的学习还在一步一步踏踏实实的进行着,有时候在学习的过程中会分心,会干别的,这是接下来的学习要
避免的东西。



 

推荐阅读