NO.2:自学python之路
Posted 猛男落泪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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以上是关于NO.2:自学python之路的主要内容,如果未能解决你的问题,请参考以下文章