zoukankan      html  css  js  c++  java
  • NO.2:自学python之路变量类型、列表、字典

    引言

    本周初步认识了库,并学习了Python中各种类型的变量和常用操作。并完成了较为完善的用户与商家购物界面设计。

    正文

    模块:

      Python有标准库和第三方库。第三方库需要安装才能使用。大量的库可以帮助我们更容易的完成复杂的操作。一般情况下,标准库被保存在了‘lib/’目录下,第三方库被保存在了‘lib/site-packages’目录下。导入一个库非常简单,例子:

    import os

      每种模块都有很多操作,一般情况是用模块名.操作名完成某些操作,例子:

    os.system('dir')#读取目录下的文件列表,但不保存

    变量类型:

      整型(int),Python 3.X中整型只有int型,而在Python 2.X中整型分为int,和long,变量的类型不需定义,与Matlab中类似,但类型不可随意更改。查看变量类型,例子:

    x = 3
    type(x)

      其他类型与C++中类似,所以不再赘述。

      虚数型,在Python中j表示虚数。

      比特型(bytes),Python 2.X中比特型与字符型没有区别,而在Python 3.X中存在不同,它们可以互相转换,例子:

    x = '我爱中国'
    y = x.encode()#转换为比特型
    print(y)
    z = y.decode())#转换为字符型
    print(z)

      在日常使用Python中,字典与列表是最常使用的变量。下面将详细介绍字典与列表的使用方法。

    列表:

      列表的定义,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']

      列表的切片与Matlab有相似之处,但有着巨大不同,Python的:后的数字是切片位置的后一位。所以,在Python中[1:2]=[1],例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    print(province[0:2])#切片(顾头不顾尾)

      Python还可以从右数来完成切片,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    print(province[-1])#从右数
    print(province[-2:])#最后的值省略

       列表的增加有两种方式,一种是最后追加,还有一种是某处插入。例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    province.append('Shannxi')#最后追加
    province.insert(1,'Xinjiang')#某处插入

      列表的修改十分简单,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    province[1] = 'Beijing'#改变某处

      列表的删除有很多方法,del是Python中通用的删除方法,此外还有删除某个与删除某处参数的方法,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    del province[2]#删除某处
    province.remove('Beijing')#删除某个
    province.pop()#删除最后一个(默认),或括号中的位置

      此外,Python还为列表提供了许多功能。Python中可以轻松查询某个参数的位置和个数,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    province.index('Shanghai')#寻找位置
    province.count('Shanghai')#寻找个数

      改变列表的顺序也十分简单,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    province.reverse()#反转序列
    province.sort()#排序序列(符号,数字,大写,小写(ASCII))

      Python中列表的复制与Matlab不同,设计相对合理一些,但是有一点难以理解,学过C++中指针的可以相对容易理解一些。普通的赋值操作,只是将列表的地址复制,一旦其中列表中的值发生改变,两者中的值都会改变,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    province_copy = province#复制地址,改变后一起变化
    province.append('Xinjiang')
    print(province)
    print(province_copy)

      要想复制一个列表,有浅copy和深copy两种方法。浅copy只复制列表的第一层,第二层将只复制地址。深copy则是完全在内存中建立一个一样的区域。例子:

    province = ['Beijin',['Hebei','Shijiazhuang'],'Shanghai','Henan']
    province_copy = province.copy()#浅copy
    import copy
    province_copy = copy.copy(province)#浅copy
    province_copy = list(province)#浅copy
    province_copy = copy.deepcopy(province)#深copy

      Python中也提供了列表的合并方法,例子:

    province = ['Beijin','Hebei','Shanghai','Henan']
    province_new = ['Xinjiang','Dongbei']
    province.extend(province_new)#并入后面

      列表的高效循环方法是用以下格式,[::x]切片中x为步距,例子如下:

    province = ['Beijin','Hebei','Shanghai','Henan']
    for i in province[::2]:#切片
        循环体

      当列表中存储的信息不想被改变时,就可以用元组,元组的定义与列表几乎相同,只是用‘()’代替了[]。元组不能修改,只能切片。例子:

    province = ('Beijin','Hebei','Shanghai','Henan')

    字符:

      字符中对字母大小写变化的操作很多,可以有以下几种方法,例子:

    x = 'l love china'
    x.capitalize()#首字母大写
    x.upper()#全变大写
    x.lower()#全变小写
    x.title()#变为标题形式
    x.swapcase()#大小写互换

      在Python中还可以轻松的对字符进行修改,例子:

    names = 'Xiaohong Xiaohuang'
    names.replace('o','O',1)#旧字符,新字符,替换个数
    tran = str.maketrans('aox','123')#设置替换密文
    names.translate(tran)#替换加密
    names.center(50,'-')#50个字符,将name居中,不的够用-填充
    names.ljust(50,'*')#50个字符,将name居左,不的够用*填充
    names.rjust(50,'*')#50个字符,将name居右,不的够用*填充
    names.zfill(50)#50个字符,将name居右,不的够用0填充
    names = '  Xiaohong'
    names.lstrip()#去掉左边空格,然后回车
    names = '  Xiaohong   '
    names.strip()#去掉左右空格,然后回车
    names = 'Xiaohong\tXiaohuang'#\t与下面结合,控制空格的数量
    names.expandtabs(tabsize=30)#空格数

      除此之外,还提供了查询功能,例子:

    names = 'xiaohei'
    names.find('i')#从左找某个字符第一次出现的位置
    names.rfind('i')#从右找某个字符第一次出现的位置

      字符和列表之间还可以相互转换,例子:

    names = 'Xiaohong Xiaohuang Xiaozhang Xiaoli'
    names.split()#按空格分成列表
    names = 'Xiaohong
    Xiaohuang
    Xiaozhang
    Xiaoli'
    names.splitlines()#按回车分成列表
    names = ['Xiaohong','Xiaohuang','Xiaozhang','Xiaoli']
    '+'.join(names)#用+连接列表成字符

      Python还为字符提供了很多判断,这些功能大多以is开头,例子:

    names = ('xiaohong hei')
    names.endswith('hei')#判断以什么结尾
    names.isalnum()#判断为阿拉伯数字
    names.isalpha()#判断为纯英文
    names.isdigit()#判断为整数
    names.isidentifier()#判断为合法标识符(变量名)
    names.islower()#判断为小写
    names.istitle()#判断为标题形式

    字典:

      字典也是常用的一种工具,字典是使用‘{}’定义的,字典中的数据是无序的,字典可以与序列与字典嵌套。

      索引字典时使用KEY,例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    print(info['2012020202'])

      字典的增加和修改都是通过复制操作,程序会首先查询字典中是否有该KEY值,没有,则新建一条。有,则修改该条的值。例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    info['2012020201'] = '蛤蛤'#修改
    info['2012020204'] = '拉拉'#增加

      字典的删除可以使用Python中通用的删除方法,或者字典中提供的方法,例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    del info['2012020203']#删除
    info.pop('2012020203')#删除
    info.popitem()#随便删除一个,不常用

      查找是,可以用之前的方法来查找,但是还有一种安全的查找方法,例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    info.get('2012020202')

      判断某个KEY是否在字典中,例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    '2012020202' in info

      字典也可以合并,合并时,将会用新的字典中覆盖旧的字典,例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    info_new = {
        '2012020202':'王凯',
        '2012020206':'彭浩',
        }
    info.update(info_new)#合并更新

      Python也提供了新建一个字典的方法,但是存在很大的问题,所以一般不会使用,例子:

    info_new = dict.fromkeys([1,2,3],[1,{'name':'X',2}])#初始化字典
    info_new[3][1][‘name’] = Y

      当修改Python新建的字典时,例子中只改了[3][1]中的‘name’为‘Y’但是可以发现字典中的所有‘name’都变为了‘Y’。所以,正常情况下很难使用。

      字典可以转为列表,例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    info.items()

      多级字典的操作与单级字典差别不大,修改略有不同。例子:

    province = {
        '华北':{
            '北京':['直辖市','很大'],
            '河北':['石家庄','漂亮'],
            },
        '东北':{
            '黑龙江':['哈尔滨','很棒'],
            '辽宁':['沈阳','厉害'],
            },
        }
    province['华北']['北京'][1] = '首都'#修改
    province.setdefault('西北',{'陕西':['西安','省会']})#取西北如果有,返回,没有新建

      字典的循环格式与列表类似,格式如下,例子:

    info = {
        '2012020201':'随便',
        '2012020202':'呵呵',
        '2012020203':'不知'
        }
    for i in info:#高效循环
        print(i,info[i])
        循环体

    作业

    编写一个购物车程序,要求将商品信息存在文件里。打开程序后需要用户登陆,用户入口需要实现,已购商品,余额记录,启动程序,输入工资,根据编号,购买商品,检测余额,够用扣款,不够提醒,随时退出,打印已经购买的商品和余额。商家入口需要实现,添加商品,修改价格。

    流程图:

    主程序:

    #购物车程序
    '''
    商品信息存在文件里
    1.打印商品列表
    用户入口
    已购商品,余额记录
    启动程序,输入工资
    根据编号,购买商品
    检测余额,够用扣款,不够提醒
    随时退出,打印已经购买的商品和余额
    商家入口
    添加商品,修改价格
    '''
    import getpass
    
    title = '''
    ---------------------------
    -     欢迎光临本超市      -
    ---------------------------
    '''
    print(title)
    
    #读取商品数据
    goods = open('商品.txt')
    read_flag = True
    goods_list = []
    while read_flag:#按行处理
        goods_line = goods.readline()
        if goods_line == '':
            read_flag = False
        else:
            goods_list.append(goods_line.split())
    goods.close()
    
    #读取用户信息
    info = open('用户信息.txt')
    read_flag = True
    info_user = []
    while read_flag:
        info_line = info.readline()
        if info_line == '':
            read_flag = False
        else:
            info_user.append(info_line.split())
    info.close()
    
    #用户登陆
    success_flag = False
    for count in range(0,6):
        account = input('请输入用户名:')
        password = getpass.getpass('请输入密码:')
        for i in range(0,len(info_user)):
            if account == info_user[i][0] and password == info_user[i][1]:
                success_flag = True
                user_number = i
                break
        if success_flag:
            print('尊敬的%s登陆成功!'%info_user[user_number][2])
            break
        else:
            print('用户名或密码错误!')
    else:
        print('输入密码次数超过6次,请重新开启软件尝试!')
        exit()
    
    #进入入口
    info_write = []
    if info_user[user_number][3] == '0':
        #普通用户
        if info_user[user_number][4] == '0':
            #初次登陆
            balance = input('您是第一次登陆,请输入充值金额:')
            if balance.isdigit():
                balance = int(balance)
                info_user[user_number][4] = '1'
                info_user[user_number][5] = str(balance)
            else:
                print('充值错误,退出系统!')
                exit()
        #非初次登陆
        for i in range(0,len(goods_list)):
            goods = '{number}.物品名:{name} 价格:{price}'.format(number = i + 1,
                                                                   name = goods_list[i][0],
                                                                   price = goods_list[i][1])
            print(goods)
        print('%s.充值'%(len(goods_list)+1))
        buy_list = []
        balance = int(info_user[user_number][5])
        while True:
            buy_number = input('请输入你所需要的商品序号[按q退出购买]:')
            if buy_number == 'q':
                buy_list = ' '.join(buy_list)
                print('本次购物购买了:{list}'.format(list = buy_list))
                #更新信息
                info_user[user_number][5] = str(balance)
                info = open('用户信息.txt','w')
                for i in range(0,len(info_user)):
                    info.write(' '.join(info_user[i])+'\n')
                info.close()
                exit()
            elif buy_number.isdigit():
                buy_number = int(buy_number)-1
                if buy_number > len(goods_list) or buy_number < 0:
                    print('请输入正确的商品码!')
                elif buy_number == len(goods_list):
                    money = input('请输入充值金额:')
                    if money.isdigit():
                        balance += int(money)
                        info_user[user_number][5] = str(balance)
                    else:
                        print('充值金额错误')
                else:
                    if balance < int(goods_list[buy_number][1]):
                        print('你的余额不够购买这件商品!')
                    else:
                        balance = balance - int(goods_list[buy_number][1])
                        buy_list.append(goods_list[buy_number][0])
                        print('购买成功!还剩%s圆'%balance)#
            else:
                print('输入错误')
    elif info_user[user_number][3] == '1':
        #商家用户
        for i in range(0,len(goods_list)):
            goods = '{number}.物品名:{name} 价格:{price}'.format(number = i + 1,
                                                                   name = goods_list[i][0],
                                                                   price = goods_list[i][1])
            print(goods)
        print('%s.添加物品'%(len(goods_list)+1))
        add_list = []
        while True:
            buy_number = input('请输入你需要修改商品价格的序号[按q退出购买]:')
            if buy_number == 'q':
                add_list = ' '.join(add_list)
                print('本次共添加了:{list}'.format(list = add_list))
                #更新信息
                info = open('商品.txt','w')
                for i in range(0,len(goods_list)):
                    info.write(' '.join(goods_list[i])+'\n')
                info.close()
                exit()
            elif buy_number.isdigit():
                buy_number = int(buy_number)-1
                if buy_number > len(goods_list) or buy_number < 0:
                    print('请输入正确的商品码!')
                elif buy_number == len(goods_list):
                    goods_name = input('请输入商品名称:')
                    goods_price = input('请输入商品价格:')
                    if goods_price.isdigit():
                        add_list.append(goods_name)
                        goods_list.append([goods_name,goods_price])
                    else:
                        print('商品价格信息错误!')
                else:
                    goods_price = input('请输入商品价格:')
                    if goods_price.isdigit():
                        goods_list[buy_number][1] = goods_price
                    else:
                        print('商品价格信息错误!')
            else:
                print('输入错误')
    else:
        print('用户数据错误!请管理员维护!!')

    信息记录文件:

    商品.txt

    手机 1000
    电脑 8000
    耳机 500
    泡面 3
    娃娃 10000

    用户信息.txt

    customer 123456 凯凯王 0 0 0
    business 123456 卖力头 1 0 0
  • 相关阅读:
    JS匿名函数及调用及闭包
    js的变量提升和函数提升
    JS调用模式以及bind()方法
    转载:JS call()方法和apply()方法
    创建一个用于上传文件的表单
    POST 异步请求 url没有明文显示
    转载:nodejs res.end和res.send 区别
    HTTP中get和post区别
    通读cheerio API
    转载:JS数组reduce()和reduceRight()方法
  • 原文地址:https://www.cnblogs.com/zk71124720/p/8453371.html
Copyright © 2011-2022 走看看