• python开发学习笔记之二(购物车练习)


      

    第二章 

    二进制、字符编码、数据类型 :
    二进制:省略
     字符编码:
     中文 GB2312  GBK   GB18030  
               BIG5(繁体)         
    统一字符编码:unicode   utf-8
    在python2中默认不支持中文,需要在开头声明编码格式为UTF-8
     
    数据类型:
    列表:
    语法 [  ]
     列表是一个数据集合,集合内可以放各种数据类型
    可以进行创建/查询/切片/增加/删除/修改/循环/排序
    创建:
    name = ['zhangsan','lisi','wangwu',1,2,3,4,5,2,2]
    查询:
    name[0] #取列表第一个
    name[-1] #取列表最后一个
    name.index('wangwu') #元素的索引值,当有重复的元素时只会返回第一个元素的索引值
    name.count(2) #对同一元素计数
    切片:
    name[0:2]
    name[-5:-1]
    
    #切片只能从左往右切
    增加:
      追加:
    name.append(2333)
      插入:
    name.insert(2,'wilbur')
      #在name[2]前插入元素‘wilbur’
    替换(修改):
     name[3] = 'zzz'
    删除:
    name.pop()  #删除末尾
    name.remove('zhangsan')    #删除指定元素
    del name[2]   #全局删除
    del name[2:6] #切片删除
    循环:
    for i in name:
        print(i)
    排序:
    name.sort()   不同数据类型不能混排
    排序规则为ASCII码顺序
    倒序:
    name.reverse()
    扩展:
    name+n2
    name.expend(n2)
    清空:
    name.clear()
    copy(文本复制):
    n2 = name.copy()

    列表练习:
    循环列表names,打印每个元素的索引值和元素,当索引值为偶数时,把对应的元素改为-1
    names = ['zhangsan','lisi','wangwu','zhaoliu','shanshan','alex']
    for index,i in enumerate(names):
    
        if index%2 == 0:
            names[index] = -1
        print(index, i)
    
    print(names)
    列表中包含多个2,返回第二个2的索引值
    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 while True:
     6     print('------products list------')
     7     for index,i in enumerate(products):
     8         print('%s.%s    %s'%(index,i[0],i[1]))
     9     chioce = input('请输入你需要购买的序号:(0-5)')
    10     if chioce.isdigit():
    11         chioce = int(chioce)
    12         if chioce >= 0 and chioce < len(products):
    13             shopping_cart.append(products[chioce])
    14             print('added %s to shopping cart!'%products[chioce][0])
    15         else:
    16             print('商品不存在!')
    17     elif chioce == 'q':
    18         print('------你已购买以下商品------')
    19         for index, i in enumerate(shopping_cart):
    20             print('%s.%s    %s' % (index, i[0], i[1]))
    21         break
    22     else:
    23         print('输入有误!')

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

    1.先做出最基本的功能

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

    2.增加循环功能:

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

    3.增加判断功能:

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

    总结一句话就是:

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


    字符串操作:

    # author:wilbur0402
    name = 'my name is 	{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))#将	转为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('
    My Name Is
    '.lstrip())#去掉左侧换行或空格
    print('
    My Name Is
    '.rstrip())
    print('
    My Name Is
    '.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
    san'.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') #对字符计数
    ' 
     My Name Is 
     '.strip() #去掉两侧换行或空格
    'zhangsan'.center(50,'-') #字符居中以“-”填充,输出50个字符
    'zhang san'.split('a') #将字符串按a分成列表,a不再显示
    'my name is 	{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()

     字典练习题:

     1 >>> dict = {'k1':'v1','k2':'v2','k3':'v3'}
     2 >>> for k in dict:
     3 ...     print(k)
     4 ...
     5 k1
     6 k2
     7 k3
     8     #遍历所有的key
     9 >>> for k in dict:
    10 ...     print(dict[k])
    11 ...
    12 v1
    13 v2
    14 v3
    15     #遍历所有的value
    16 >>> for k in dict:
    17 ...     print(k,dict[k])
    18 ...
    19 k1 v1
    20 k2 v2
    21 k3 v3
    22     #遍历所有的key与value
    23 >>> dict['k4'] = 'v4'
    24 >>> dict
    25 {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'k4': 'v4'}
    26     #添加键值对'k4':'v4',并输出添加后的字典
    27 >>> dict.pop('k1')
    28 'v1'
    29 >>> dict
    30 {'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 in list_1)
    判断是否不是集合的元素
    print(888  not in list_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('33[35;1m welcome %s back! 33[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_balance print('your balance is 33[31;1m %s 33[0m yuan' % users_balance) if salary.isdigit(): # 判断输入的工资是否为数字 salary = int(salary) shopping_cart = [] # 创建购物车 while True: # 判断输入的选择循环 print('product list'.center(30, '-')) for index, i in enumerate(goods): print('%s.%s %s' % (index, i[0], i[1])) choice = input('33[35;1m please input number (0-3) or quit(q) or display list(l): 33[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('33[32;1m added %s to cart, balance is %s 33[0m' % (goods[choice][0], balance)) shopping_cart.append(goods[choice]) # 把商品加入购物车 salary = balance # 将余额赋值给工资,以便进行下一次循环操作 else: # 否则返回信息 print('33[31;1m your balance no enough to buy it! 33[0m') else: print('33[31;1m invalid input! 33[0m') elif choice == 'q': # 如果输入为q,进行退出工作 if bool(shopping_cart): # 如果购物车不为空,打印购物车内容 print('bought list'.center(30, '*')) for index, i in enumerate(shopping_cart): print('%s.%s %s' % (index, i[0], i[1])) print('your balance is 33[31;1m %s 33[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('33[31;1m invalid input! 33[0m') # 输入时不合法时返回信息,并继续循环 break # 当输入工资是数字就跳出循环 else: # 当不是数字,返回信息,继续循环 print('33[31;1m invalid input salary! 33[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
  • 相关阅读:
    SQL联合更新
    Service Oriented Architecture and WCF
    ubuntu10.4 中安装中文输入法
    QT WINDOWS QTCreator
    QImage,QPixmap,QBitmap,QPicture
    一、Qt Creator的安装和hello world程序的编写
    解决ubuntu打开windows下保存的txt文件中文乱码问题
    Windows+QT+Eclipse+MinGW搭建QT开发环境详细教程
    虚拟机VMware Workstation v6.5官方正式版+汉化补丁+算号器(附安装及使用图解教程)(转)
    决定你是穷人还是富人的12条
  • 原文地址:https://www.cnblogs.com/wilbur0402/p/9351074.html
Copyright © 2020-2023  润新知