引言

本周初步认识了库,并学习了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','')#设置替换密文
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 = {
'':'随便',
'':'呵呵',
'':'不知'
}
print(info[''])

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

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

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

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

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

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

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

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

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

info = {
'':'随便',
'':'呵呵',
'':'不知'
}
info_new = {
'':'王凯',
'':'彭浩',
}
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 = {
'':'随便',
'':'呵呵',
'':'不知'
}
info.items()

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

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

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

info = {
'':'随便',
'':'呵呵',
'':'不知'
}
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] == '':
#普通用户
if info_user[user_number][4] == '':
#初次登陆
balance = input('您是第一次登陆,请输入充值金额:')
if balance.isdigit():
balance = int(balance)
info_user[user_number][4] = ''
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] == '':
#商家用户
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

NO.2:自学python之路------变量类型、列表、字典的更多相关文章

  1. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  2. NO.3:自学python之路------集合、文件操作、函数

    引言 本来计划每周完成一篇Python的自学博客,由于上一篇到这一篇遇到了过年.开学等杂事,导致托更到现在.现在又是一个新的学期,春天也越来越近了(冷到感冒).好了,闲话就说这么多.开始本周的自学Py ...

  3. 自学Python之路

    自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的搭建:Pycharm及python安装详细教程    1.3  ...

  4. 自学Python之路-Python核心编程

    自学Python之路-Python核心编程 自学Python之路[第六回]:Python模块       6.1 自学Python6.1-模块简介    6.2 自学Python6.2-类.模块.包  ...

  5. 自学Python之路-django

    自学Python之路-django 自学Python之路[第一回]:1.11.2 1.3

  6. 自学Python之路-Python并发编程+数据库+前端

    自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3

  7. 自学Python之路-Python网络编程

    自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3

  8. GPU编程自学6 —— 函数与变量类型限定符

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  9. Python学习--03变量类型

    变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创 ...

随机推荐

  1. ASP.NET Core 如何设置发布环境

    在ASP.NET Core中自带了一些内置对象,可以读取到当前程序处于什么样的环境当中,比如在ASP.NET Core的Startup类的Configure方法中,我们就会看到这么一段代码: publ ...

  2. Oracle 统计信息

    Oracle数据库中的统计信息是这样一组数据:它存储在数据字典中,且从多个维度描述了Oracle数据库里对象的详细信息. CBO会利用这些统计信息来计算目标SQL各种可能的,不同的执行路径的成本,从中 ...

  3. iOS 隐私政策

    我们深知个人信息对您的重要性,您的信任对我们非常重要.本应用尊重并保护所有使用服务用户的个人隐私权.您在使用我们的产品与/或服务时,我们可能会收集和使用您的相关信息.我们将按法律法规要求,采取相应安全 ...

  4. css 中的 initial inherit unset 意思

    写css时,在对属性进行选值,经常遇到unset , initial,inherit三个值.这几个值的含义. 1.inherit 可继承性 继承的意思. 每一个 CSS 属性都有一个特性就是,这个属性 ...

  5. Scala相关笔记

    一.Scala概述以及安装 1.   什么是Scala Scala 是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行于 Java 平台(Java 虚拟机 ...

  6. echarts通过ajax动态获取数据的方法

    echarts表格的数据一般都需要动态获取,所以总结了一下通过ajax动态获取数据的操作: 插入的方法应该不止一种,我也是接触不久,所以刚学会了一种插入方法: 灵感和经验来自:https://www. ...

  7. Hbase(2)-HBase简介

    一. HBase的特点 1. 海量存储 Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据.这与Hbase的极易扩展性息息相关.正式因为Hb ...

  8. Altiun designer问题汇总(不断更新)

    (1)元件库-引脚名称被矩形方框遮住 该问题可能是因为设置中文版而产生的错误,可以尝试在旁边再摆一个矩形,并且摆上引脚观察是否会被隐藏.如果还存在该现象,先将版本语言改为原版(英文版),再重新绘制即可

  9. 希尔伯特曲线——第八届蓝桥杯C语言B组(国赛)第三题

    原创 标题:希尔伯特曲线 希尔伯特曲线是以下一系列分形曲线 Hn 的极限.我们可以把 Hn 看作一条覆盖 2^n × 2^n 方格矩阵的曲线,曲线上一共有 2^n × 2^n 个顶点(包括左下角起点和 ...

  10. golang 后台服务设计精要

    原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...