python编程买东西的题_python开发学习笔记之二(购物车练习)

names = ['zhangsan','lisi','wangwu','zhaoliu','shanshan','alex',3,45,24,6,2,546,2]

names2= names[names.index(2)+1:] #获取第一个2的索引值后加一

print(names2.index(2)+names.index(2)+1) #打印第二个2的索引值

最后一个是购物车程序:

写一个循环,不断的问用户想买什么,用户选择一个商品编号,就把对应的商品添加到购物车里, 最终用户输入q退出时,打印购物车里的商品列表

1 #author:wilbur0402

2 products = [['Iphone8', 6888], ['MacPro', 14800], ['小米6', 2499], ['Coffee', 31], ['Book', 80], ['Nike Shoes', 799]]3

4 shopping_cart =[]5 whileTrue:6 print('------products list------')7 for index,i inenumerate(products):8 print('%s.%s %s'%(index,i[0],i[1]))9 chioce = input('请输入你需要购买的序号:(0-5)')10 ifchioce.isdigit():11 chioce =int(chioce)12 if chioce >= 0 and chioce

22 else:23 print('输入有误!')

之前做这种题完全没有思路,各种需求混为一谈。在此我介绍一下我的方法:

1.先做出最基本的功能

这个练习最基本的功能就是:打印商品列表——用户输入——打印输入购买的商品

2.增加循环功能:

增加死循环,使其能不断询问用户

3.增加判断功能:

当用户输入为q时,退出并打印已购列表,或者当用户输入不正确时,返回信息

总结一句话就是:

基本功能——增加功能——完善功能

字符串操作:

#author:wilbur0402

name = 'my name is \t{nm} and im {yr}year old'

print(name.capitalize())#首字母大写

print(name.count('a'))#统计字符中a的个数

print(name.center(50,'-'))#字符居中填充,,输出50个字符,字符不够用-补上

print(name.endswith('an'))#判断字符串是否以an结尾

print(name.expandtabs(tabsize=30))#将\t转为30个空格

print(name.find('name'))#查找字符位置 用来切片

print(name.format(nm='zhangsan',yr=21))print('wilbur0402'.isalnum())#判断是否只包含数字和字母

print(name.isalpha())#判断是否为纯英文字母

print(name.isdigit())print('1a'.isidentifier())#判断是否为合法的标识符(变量名称)

print('My Name Is'.istitle())#判断是否为标题

print('My Name Is'.isupper())#判断全为小写

print('My Name Is'.islower())print('My Name Is'.upper())#将小写修改为大写

print('My Name Is'.lower())print(','.join(['zhangsan','lisi','wangwu']))#列表转进字符串中

print(name.ljust(50,'*'))#字符居左填充,输出50个字符,字符不够右侧用*补上

print(name.rjust(50,'*'))#字符居右填充,输出50个字符,字符不够右侧用*补上

print('\nMy Name Is\n'.lstrip())#去掉左侧换行或空格

print('\nMy Name Is\n'.rstrip())print('\nMy Name Is\n'.strip())#去掉两侧换行或空格

p = str.maketrans('abcdef','123456')#对应

print('zhangsan'.translate(p))#传入

print("zhangsan".replace('a','A',1))#替换

print('zhangsan'.rfind('n'))#返回n最右边的那个的下标

print('zhang san'.split('a'))#将字符串按a分成列表

print('zhang\nsan'.splitlines())print('ZhangSan'.swapcase())#反向大小写

print('zhangsan'.title())#标题化

print('zhangsan'.zfill(50))

以上为字符串的基本方法,不必全部记忆,强调几个常用的方法:

'zhangsan'.isdigit() #判断是否为数字

'zhangsan'.replace('a','A',1) #替换

'zhangsan'.find('a') #查找字符并返回下标,无则返回-1

'zhangsan'.count('a') #对字符计数

'\n My Name Is \n'.strip() #去掉两侧换行或空格

'zhangsan'.center(50,'-') #字符居中以“-”填充,输出50个字符

'zhang san'.split('a') #将字符串按a分成列表,a不再显示

'my name is \t{nm} and im {yr}year old'.format(nm='zhangsan',yr=21) #格式化

'-'.join(['zhangsan','lisi','wangwu'])#列表转字符串,用-连接元素

元组:

类似于列表的数据类型,可以计数,切片,查找索引,但是不能修改内容

字典:

字典是一种key-value格式的数据类型

字典的特征:key-value格式;key可hash,且唯一的不可变数据类型;可存放多个不唯一的可修改的数据;字典是无序的;查找速度快

字典操作:

1 #字典为key-value类型,无序

2 info ={3 'stu1101' : "zhangsan",4 'stu1102' : "lisi",5 'stu1103' : "wangwu",6 }7 print(info)8 print(info['stu1101'])9 info['stu1101']='张三'#修改

10

11

12 info['stu1104']='zhaoliu'#增加

13 print(info)14 del info['stu1101']#删除

15 info.pop('stu1102')16 print(info)17 info.popitem()#随机删除

18 print(info)19 info ={20 'stu1101' : "zhangsan",21 'stu1102' : "lisi",22 'stu1103' : "wangwu",23 }24 print(info.get('stu1104'))#尝试获取(安全地获取)

25 print('stu1103' in info)#查找是否存在

26 info.items()#返回k-v的列表形式

27 info.update()28 info.formkey()

字典练习题:

1372926-20180723145708497-1658599741.png

1 >>> dict = {'k1':'v1','k2':'v2','k3':'v3'}2 >>> for k indict:3 ... print(k)4 ...5 k16 k27 k38 #遍历所有的key

9 >>> for k indict:10 ... print(dict[k])11 ...12 v113 v214 v315 #遍历所有的value

16 >>> for k indict:17 ... print(k,dict[k])18 ...19 k1 v120 k2 v221 k3 v322 #遍历所有的key与value

23 >>> dict['k4'] = 'v4'

24 >>>dict25 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}26 #添加键值对'k4':'v4',并输出添加后的字典

27 >>> dict.pop('k1')28 'v1'

29 >>>dict30 {'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}31 #删除键值对 k1 ,并输入删除后的字典32>>> print(dict.pop('k5',None))

33None

#尝试删除K5,K5存在则删除,不存在则返回None

一行实现修改value和添加k-v:

>>> dict = {'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}>>> dict.update({'k1':'v1','k2':'v22222'})>>>dict

{'k2': 'v22222', 'k3': 'v3', 'k4': 'v4', 'k1': 'v1'}

下面的不再赘述,小写变大写可以用swapcase,upper更改,替换可以使用replace和 = 赋值来完成替换。

集合:

无序,不重复的数据总和

作用:去重,关系测试

集合的方法:

list_1 = [1,3,53,21,64]#此为列表

list_1 = set(list_1)#列表转换为集合

print(list_1,type(list_1))

list_2= [34,3,76,1,98]print(list_1,list_2)

交集print(list_1.intersection(list_2))

并集print(list_1.union(list_2))

差集print(list_1.difference(list_2))#在集合1中与集合2不同的元素

对称差集print(list_1.symmetric_difference(list_2))#集合1与集合2中都不相同的元素

判断子集

list_3= set([1,3])print(list_3.issubset(list_1))

判断父集print(list_1.issuperset(list_3))

判断是否有交集print(list_1.isdisjoint(list_2))#Return True if two sets have a null intersection.

添加一项

list_1.add(999)print(list_1)

添加多项

list_1.update([999,888,777])print(list_1)

删除一项

list_1.remove(999)print(list_1)

长度print(len(list_1))

判断是否是集合的元素print(888 inlist_1)

判断是否不是集合的元素print(888 not inlist_1)

任意删除一项print(list_1.pop())print(list_1.pop())

尝试删除一项print(list_1.discard(1))

附上这次的大作业,花费1天半写出来的。。。

#author:wilbur0402

# 带用户登录的购物车程序

goods= [['电脑', 9999], ['大保健', 998], ['iPhone X', 8688], ['煎饼果子多加个蛋', 5]]

user={'zhangsan': 'aaa111','lisi': 'bbb222','wangwu': 'ccc333','alex': 'abc123'}while True: #用户登录死循环

username = input('please input your username:')

password= input('please input your password:')if username in user and password == user[username]: #判断账号密码正确性

print('\033[35;1m welcome %s back! \033[0m' %username)while True: #判断输入的工资的循环

with open('%s_balance' % username, 'a+', encoding='utf-8') as user_balance: #打开文件,第一次创建文件

user_balance.seek(0) #重置指针位置

users_balance = user_balance.read() #读取文件内容赋值给变量users_balance

if len(users_balance) == 0: #如果读不到内容,让用户自己输入变量salary

salary = input('please input your salary:')else: #读到内容,把读到的数据赋值给变量salary

salary =users_balanceprint('your balance is \033[31;1m %s \033[0m yuan' %users_balance)if salary.isdigit(): #判断输入的工资是否为数字

salary =int(salary)

shopping_cart= [] #创建购物车

while True: #判断输入的选择循环

print('product list'.center(30, '-'))for index, i inenumerate(goods):print('%s.%s %s' % (index, i[0], i[1]))

choice= input('\033[35;1m please input number (0-3) or quit(q) or display list(l): \033[0m')#让用户输入序号、退出或查看已购列表

balance = salary #初始余额等于工资

if choice.isdigit(): #判断choice是否为数字

choice =int(choice)if 0 <= choice < 4: #过滤(0-4)的输入

if salary > goods[choice][1]: #如果当前金钱大于商品价格,进行循环购买操作

balance = salary - goods[choice][1] #余额等于工资减去商品价格

print('\033[32;1m added %s to cart, balance is %s \033[0m' %(goods[choice][0], balance))

shopping_cart.append(goods[choice])#把商品加入购物车

salary = balance #将余额赋值给工资,以便进行下一次循环操作

else: #否则返回信息

print('\033[31;1m your balance no enough to buy it! \033[0m')else:print('\033[31;1m invalid input! \033[0m')elif choice == 'q': #如果输入为q,进行退出工作

if bool(shopping_cart): #如果购物车不为空,打印购物车内容

print('bought list'.center(30, '*'))for index, i inenumerate(shopping_cart):print('%s.%s %s' % (index, i[0], i[1]))print('your balance is \033[31;1m %s \033[0m yuan' % balance) #打印余额

with open('%s_balance' % username, 'w+', encoding='utf-8') as user_balance:

user_balance.write('%s' % balance) #打开文件,将余额写入文件

with open('%s_goods_list' % username, 'w+', encoding='utf-8') as goods_list:

goods_list.write('%s' % shopping_cart) #打开文件,将购物车内容写入文件

break #结束购物循环

elif choice == 'l': #如果输入为l,打开文件

with open('%s_goods_list' % username, 'a+', encoding='utf-8') as goods_list:

goods_list.seek(0)print('goods_list'.center(30, '-'))

last_list= goods_list.read() #读取上次购物内容

if len(last_list) != 0: #判断读取的文件是否为空文件,非空文件再进行去字符串格式的操作

last_list =eval(last_list)for index, i in last_list: #打印文件中列表内容

print(index, i)else:print('\033[31;1m invalid input! \033[0m') #输入时不合法时返回信息,并继续循环

break #当输入工资是数字就跳出循环

else: #当不是数字,返回信息,继续循环

print('\033[31;1m invalid input salary! \033[0m')break #用户认证成功,跳出循环

#author:wilbur0402

# 三级菜单

menu ={'北京': {'海淀': {'五道口': {'soho': {},'网易': {},'google': {}

},'中关村': {'爱奇艺': {},'汽车之家': {},'youku': {},

},'上地': {'百度': {},

},

},'昌平': {'沙河': {'老男孩': {},'北航': {},

},'天通苑': {},'回龙观': {},

},'朝阳': {},'东城': {},

},'上海': {'闵行': {"人民广场": {'炸鸡店': {}

}

},'闸北': {'火车站': {'携程': {}

}

},'浦东': {},

},'山东': {},

}

var= menu #中间变量,用来存储当前位置,初始值为menu

var_list = [] #用来记录进入的位置和先后次序

while True: #循环体

for i in var: #遍历打印var所指向的字典

print(i)

choice= input('请输入内容(返回b,退出q):') #用户输入内容,返回或退出

if choice in var: #判断输入内容是否在var所指的字典中

var_list.append(var) #将当前的位置的字典追加到列表中

var = var[choice] #将下一级字典赋值给var

elif choice == 'b': #判断输入是否为b

if len(var_list) != 0: #当列表不为空时,将上一次保存的字典从列表中弹出(最后一项)赋值给var

var =var_list.pop()else: #当列表为空时返回信息

print('到达顶层!')elif choice == 'q': #当输入为q时,结束循环,程序终止

break

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值