首页 > 代码库 > python学习第二周(数据类型、字符串、列表、元祖、字典)

python学习第二周(数据类型、字符串、列表、元祖、字典)

一、模块、库

Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相应的Python库支持。

模块初始化:模块就是库,库可以是标准库或者是第三方库。 

sys模块

os模块 

Sys.path

导入模块的时候,先从当前目录下面查找。

我们起名字时候不能和导入的模块名字相同。

Python的第三方库 

E:\\python_path\\base\\lib\\site-packages

Python的标准库位置

 E:\\python_path\\base 

Sys.argv 功能:sys.argv 将你从命令行执行脚本时的 脚本名称、参数保存到列表中。

os模块:

os.system("") 调用后,直接输出屏幕

print (os.system("dir")) 结果是0,表示执行命令

 

第三方库

就是.py文件 

使用import 文件名(不需要.py) 

注意些的模块的路径。可以放在Python第三方库的目录下

 

二、pyc是什么?

1. Python是一门解释型语言? 

我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊! 

2. 解释型语言和编译型语言 

计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。 

编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。 

解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。 

解释型语言和编译型语言的优缺点:因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。 

此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。 

3. Python到底是什么 

其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下Python程序的运行过程吧。 

当我们在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。

其实当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。 

4. 简述Python的运行过程 

在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。 

我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。 

当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。 

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。 

所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。

三、数据类型

3.1、数字 type()查看数据类型

  2 是一个整数的例子。

  长整数不过是大一些的整数。

  3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。

  (-5+4j)和(2.3-4.6j)是复数的例子,其中-5,4为实数,j为虚数。 

int(整型) 

  在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647

  在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807

long(长整型)(Python3中没有长整形)

  跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。

  注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。

float(浮点型)

      先扫盲 http://www.cnblogs.com/alex3714/articles/5895848.html

  浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。

complex(复数)  Python中虚数用j

  复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。

注:Python中存在小数字池:-5 ~ 257

3.2、布尔值 (布尔值中真为1(TRUE),假为0(False))

  真或假

  1 或 0

3.3三元运算符

  result = 值1 if 条件 else 值2

  如果条件为真,result=值1,

  如果条件为假,result=值2

3.4字符串

  字符串  hello world
  万恶的字符串拼接:python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。  

  name = "ajun"

  print "i am %s " % name 

  #输出: i am ajun

  PS: 字符串是 %s;整数 %d;浮点数%f

3.5进制

二进制:01

八进制:01234567

十进制:0123456789

十六进制:0123456789abcdef

3.6、字节类型(byte)

  Python3中最重要的新特性是对文本和二进制数据做了更加清晰的区分,文本采用unicode编码,用str表示。二进制用bytes字节表示。Python3中不会任意的混用二进制和字节方式。我们不能任意的拼接字节包和字符串,也无法再字节包中搜索字符串,反之一样。

  视频音频文件,必须是二进制。Python3中数据在网络上传输必须是二进制,而Python2中不需要。

  字节包和字符串之间需要编码转换。

  b开头的是二进制,Python3中字符串默认编码是utf-8。  

  print(‘¥20‘.encode(‘utf-8‘))
  结果:b‘\xef\xbf\xa520‘
  print(b‘\xef\xbf\xa520‘.decode(‘utf-8‘))
  结果:¥20

四、列表

列表基础知识

列表用[]表示,打印列表,print()。列表的序数也是从0开始的。

列表的创建:

name_list[]=[‘ajun‘,‘daxiong‘,‘kangfu‘]

  或者

name_list=list([‘ajun‘,‘daxiong‘,‘kangfu‘])

列表的切片

技术分享
 1 >>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
 2 >>> names[1:4]  #取下标1至下标4之间的数字,包括1,不包括4
 3 [Tenglan, Eric, Rain]
 4 >>> names[1:-1] #取下标1至-1的值,不包括-1
 5 [Tenglan, Eric, Rain, Tom]
 6 >>> names[0:3] 
 7 [Alex, Tenglan, Eric]
 8 >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样
 9 [Alex, Tenglan, Eric]
10 >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写
11 [Rain, Tom, Amy] 
12 >>> names[3:-1] #这样-1就不会被包含了
13 [Rain, Tom]
14 >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个
15 [Alex, Eric, Tom] 
16 >>> names[::2] #和上句效果一样
17 [Alex, Eric, Tom]
alex的代码
技术分享
 1 names = ["4ZhangYang", "#!Guyun","xXiangPeng","ChenRonghua","XuLiangchen"]
 2 print(names)
 3 print(names[0],names[2])
 4 print(names[1:3])
 5 print(names[:3])
 6 print(names[2:])
 7 print([1:-1])
 8 print(names[0:-1:2])
 9 print(names[::2])
10 print(names[:])
11 print([-1:-2])
12 
13 结果:
14 [4ZhangYang, #!Guyun, xXiangPeng, ChenRonghua, XuLiangchen]
15 4ZhangYang xXiangPeng
16 [#!Guyun, xXiangPeng] #分片包含前面不包含后面
17 [4ZhangYang, #!Guyun, xXiangPeng]#分片前面省略默认从0开始
18 [xXiangPeng, ChenRonghua, XuLiangchen]#分片后面省略,默认到最后一个
19 [#!Guyun, xXiangPeng, ChenRonghua]#分片,-1表示最后一个
20 [4ZhangYang, xXiangPeng]#分片可以添加步长
21 [4ZhangYang, xXiangPeng, XuLiangchen]
22 [4ZhangYang, #!Guyun, xXiangPeng, ChenRonghua, XuLiangchen]
23 []#分片默认前面的小于后面
列表打印的分片例子

 列表的增加

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu]
2 name_list.append(kangfu是新来的)
3 print(name_list)
4 
5 [ajun, daxiong, leipi, kangfu, kangfu是新来的]
增加,append()方法

列表的插入

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu]
2 name_list.insert(2,"张三是插入的")
3 print(name_list)
4 
5 [ajun, daxiong, 张三是插入的, leipi, kangfu]
insert()方法,插入

列表的修改

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu]
2 name_list[2]="李四是修改的"
3 print(name_list)
4 
5 [ajun, daxiong, 李四是修改的, kangfu]
列表的修改,直接修改

列表的删除

技术分享
name_list=[ajun,daxiong,leipi,kangfu]
name_list.pop()#删除最后一个
print(name_list)

[ajun, daxiong, leipi]

name_list=[ajun,daxiong,leipi,kangfu]
name_list.remove(kangfu)#删除指定元素
print(name_list)

[ajun, daxiong, leipi]

name_list=[ajun,daxiong,leipi,kangfu]
del name_list[2]# 通过指定位置删除
print(name_list)

[ajun, daxiong, kangfu]
pop(),del(),remove()

列表的扩展

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu]
2 a=[1,2,3]
3 name_list.extend(a)
4 print(name_list)
5 
6 [ajun, daxiong, leipi, kangfu, 1, 2, 3]
extend()

列表的统计

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu,ajun,1,2]
2 print(name_list.count(ajun))#统计列表中存在的元素出现了几次
3 
4 2
count()

列表的长度

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu,ajun,1,2]
2 print(len(name_list))
3 
4 7
len()方法,求列表的长度

列表的查找

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu,ajun,1,2]
2 print(name_list.index(ajun))#默认查找显示第一个元素
3 print(name_list.index(1))
4 
5 0
6 5
index()方法

列表的排序和翻转

技术分享
1 name_list=[ajun,daxiong,leipi,kangfu,ajun,1,2]
2 name_list.reverse()
3 print(name_list)
4 name_list.sort()
5 print(name_list)
6 
7 [2, 1, ajun, kangfu, leipi, daxiong, ajun]
8 [1, 2, ajun, ajun, daxiong, kangfu, leipi]
排序sort(),翻转reserve()

列表的复制

技术分享
 1 name_list=[ajun,daxiong,leipi,kangfu,ajun,1,2]
 2 name_list2=name_list.copy()#copy()浅复制
 3 print(name_list2)
 4 name_list[1]=zhangsan
 5 print(name_list)
 6 print(name_list2)
 7 name_list[1]=[lisi,wangwu]
 8 name_list2=name_list.copy()
 9 print(name_list)
10 print(name_list2)
11 
12 [ajun, daxiong, leipi, kangfu, ajun, 1, 2]
13 [ajun, zhangsan, leipi, kangfu, ajun, 1, 2]
14 [ajun, daxiong, leipi, kangfu, ajun, 1, 2]
15 [ajun, [lisi, wangwu], leipi, kangfu, ajun, 1, 2]
16 [ajun, [lisi, wangwu], leipi, kangfu, ajun, 1, 2]
17 [ajun, [lisi, wangwu], leipi, kangfu, ajun, 1, 2]
了解copy()

五、元祖

元祖的表示(),元祖是不可修改的列表。

元祖的创建

技术分享
1 name_list=(ajun,daxiong,leipi,kangfu,ajun,1,2)#直接创建
2 print(name_list)
3 name_list=tuple((ajun,daxiong,leipi,kangfu,ajun,1,2))#通过tuple()方法创建
4 print(name_list)
5 name_list=[ajun,daxiong,leipi,kangfu,ajun,1,2]
6 name_list2=tuple(name_list)#列表转换为元祖
7 print(name_list2)
元祖的创建

元祖只有两种方法,查找index()和统计count()

技术分享
1 name_list=(ajun,daxiong,leipi,kangfu,ajun,1,2)
2 print(name_list.index(ajun))
3 print(name_list.count(ajun))
4 
5 0
6 2
元祖的查找和统计

六、字典

 字典操作:

字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。 

语法:

info = {

    ‘stu1101‘: "TengLan Wu",

    ‘stu1102‘: "LongZe Luola",

    ‘stu1103‘: "XiaoZe Maliya",

}

字典的特性:

dict是无序的

key必须是唯一的,so 天生去重 

创建,增加,修改,删除(pop方法)

技术分享
创建字典
stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
print(stu_dict)
增加或者修改  存在就是修改,不存在就是增加,通过key
stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
stu_dict["stu1104"] = "大熊00"
print(stu_dict)

{stu1102: LongZe Luola, stu1103: XiaoZe Maliya, stu1101: 康复}

删除

stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
stu_dict.pop(stu1102)
print(stu_dict)

{stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
>>> info
字典的方法

删除

技术分享
 1 stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
 2 del stu_dict[stu1102]
 3 print(stu_dict)
 4 
 5 {stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
 6 
 7 #随机删除
 8 stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
 9 stu_dict.popitem()
10 print(stu_dict)
11 
12 {stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya}
del 删除方法 popitem()随机删除方法

查找

技术分享
1 stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
2 print(stu1102 in stu_dict )
3 print(stu_dict.get(stu1102)) #存在返回内容,不存在返回None
4 print(stu_dict.get(stu1105))
5 
6 True
7 LongZe Luola
8 None
查找

多级字典

技术分享
 1 av_catalog = {
 2     "欧美":{
 3         "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
 4         "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
 5         "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
 6         "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
 7     },
 8     "日韩":{
 9         "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
10     },
11     "大陆":{
12         "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
13     }
14 }
15 
16 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
17 print(av_catalog["大陆"]["1024"])
多级字典(源自老男孩)
技术分享
1 stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
2 print(stu_dict.values())
3 print(stu_dict.keys())
4 
5 dict_values([LongZe Luola, 大熊, XiaoZe Maliya, TengLan Wu])
6 dict_keys([stu1102, stu1104, stu1103, stu1101])
显示值和关键字

setdefault查找,对的返回对的值,不对的返回对的值

技术分享
stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
print(stu_dict.setdefault(stu1104,大熊))
print(stu_dict.setdefault(stu1104,康复))

大熊
大熊
setdefault()方法

多级更新,update

技术分享
1 stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
2 b={1:2,3:4,5:6}
3 stu_dict.update(b)
4 print(stu_dict)
5 
6 {stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu, 1: 2, 3: 4, 5: 6}
update()方法,多个内容更新

items方法,把字典改为列表

技术分享
1 stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
2 print(stu_dict.items())
3 
4 dict_items([(stu1102, LongZe Luola), (stu1104, 大熊), (stu1103, XiaoZe Maliya), (stu1101, TengLan Wu)])
items()方法,把字典改为列表

循环打印字典:

技术分享
 1 #Author:ajun
 2 stu_dict={stu1102: LongZe Luola, stu1104: 大熊, stu1103: XiaoZe Maliya, stu1101: TengLan Wu}
 3 #循环dict
 4 #方法1
 5 for key in stu_dict:
 6     print(key,stu_dict[key])
 7 
 8 #方法2
 9 for k,v in stu_dict.items(): #会先把dict转成list,数据里大时莫用
10     print(k,v)
循环打印字典

七、字符串

特性:不可修改

技术分享
name.capitalize()  首字母大写
name.casefold()   大写全部变小写
name.center(50,"-")  输出 ---------------------Alex Li----------------------
name.count(lex) 统计 lex出现次数
name.encode()  将字符串编码成bytes格式
name.endswith("Li")  判断字符串是否以 Li结尾
 "Alex\tLi".expandtabs(10) 输出Alex      Li, 将\t转换成多长的空格 
 name.find(A)  查找A,找到返回其索引, 找不到返回-1 

format :
    >>> msg = "my name is {}, and age is {}"
    >>> msg.format("alex",22)
    my name is alex, and age is 22
    >>> msg = "my name is {1}, and age is {0}"
    >>> msg.format("alex",22)
    my name is 22, and age is alex
    >>> msg = "my name is {name}, and age is {age}"
    >>> msg.format(age=22,name="ale")
    my name is ale, and age is 22
format_map
    >>> msg.format_map({name:alex,age:22})
    my name is alex, and age is 22


msg.index(a)  返回a所在字符串的索引
9aA.isalnum()   True

9.isdigit() 是否整数
name.isnumeric  
name.isprintable
name.isspace
name.istitle
name.isupper
 "|".join([alex,jack,rain])
alex|jack|rain


maketrans
    >>> intab = "aeiou"  #This is the string having actual characters. 
    >>> outtab = "12345" #This is the string having corresponding mapping character
    >>> trantab = str.maketrans(intab, outtab)
    >>> 
    >>> str = "this is string example....wow!!!"
    >>> str.translate(trantab)
    th3s 3s str3ng 2x1mpl2....w4w!!!

 msg.partition(is)   输出 (my name , is,  {name}, and age is {age}) 

 >>> "alex li, chinese name is lijie".replace("li","LI",1)
     alex LI, chinese name is lijie

 msg.swapcase 大小写互换


 >>> msg.zfill(40)
00000my name is {name}, and age is {age}



>>> n4.ljust(40,"-")
Hello 2orld-----------------------------
>>> n4.rjust(40,"-")
-----------------------------Hello 2orld


>>> b="ddefdsdff_哈哈" 
>>> b.isidentifier() #检测一段字符串可否被当作标志符,即是否符合变量命名规则
True
字符串的方法 源自老男孩

技术分享

 

八、作业

8.1

程序:购物车程序

需求:

  1. 启动程序后,让用户输入工资,然后打印商品列表
  2. 允许用户根据商品编号购买商品
  3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 
  4. 可随时退出,退出时,打印已购买商品和余额
    技术分享
    product_list = [
        (Iphone,5800),
        (Mac Pro,9800),
        (Bike,800),
        (Watch,10600),
        (Coffee,31),
        (Alex Python,120),
    ]
    shopping_list = []
    salary = input("Input your salary:")
    if salary.isdigit():
        salary = int(salary)
        while True:
            for index,item in enumerate(product_list):
                #print(product_list.index(item),item)
                print(index,item)
            user_choice = input("选择要买嘛?>>>:")
            if user_choice.isdigit():
                user_choice = int(user_choice)
                if user_choice < len(product_list) and user_choice >=0:
                    p_item = product_list[user_choice]
                    if p_item[1] <= salary: #买的起
                        shopping_list.append(p_item)
                        salary -= p_item[1]
                        print("Added %s into shopping cart,your current balance is \033[31;1m%s\033[0m" %(p_item,salary) )
                    else:
                        print("\033[41;1m你的余额只剩[%s]啦,还买个毛线\033[0m" % salary)
                else:
                    print("product code [%s] is not exist!"% user_choice)
            elif user_choice == q:
                print("--------shopping list------")
                for p in shopping_list:
                    print(p)
                print("Your current balance:",salary)
                exit()
            else:
                print("invalid option")
    参考答案 源自老男孩

8.2

8.1改进版

买家入口:实现商品信息存在文件中,购买物品后,余额显示

卖家入口:实现可以添加商品,修改商品

技术分享
zuoye_sale.py
#Author:ajun
#实现商家模块,商家可以登录,并且可以添加商品和修改价格
import re
import getpass
name=input("Please input username:")
passwd=input("Please input passwd:")
count=0
f=open("sale_user.txt","r")

for line in  f.readlines():
    if(name==re.split(":",line)[0]):
        if(passwd==re.split(":",line)[1]):
            print("Welcome,login success!")
            while True:
                f1=open("good_list.txt",r+)

                for line1 in f1:
                    good1=re.split(":",line1)[0]
                    print(" %s\t"%good1)
                select1=int(input("""Please select what you want to do?
                            1:添加商品
                            2:修改价格
                            3:退出\n"""))
                if(select1==1):
                    """添加商品模块"""
                    add_1=input("Please input goods and price:")
                    f1.write("\n")
                    f1.write(add_1)
                    f1.close()
                    continue
                elif(select1==2):
                    mod_goods=input("Please input goods :")
                    for line1 in f1:
                        if mod_goods in line1:
                            mod_price=input("Please input the price:")
                            if mod_price.isdigit():
                                f1.seek(0)
                                #f1=open("good_list.txt","r")
                                f_new=open("good_list.bak.txt","w",encoding="utf-8")
                                for line_1 in f1:
                                    if mod_goods in line_1:
                                        line_1=line_1.replace(re.split(":",line_1)[1],"%s:"%mod_price)
                                    f_new.write(line_1)
                                f_new.flush()
                                f1.close()
                                f_new.close()

                                #写回原文件
                                #f1.seek(0)
                                #f_new.seek(0)
                                f1=open("good_list.txt","w")
                                f_new=open("good_list.bak.txt","r")
                                for line_2 in f_new:
                                    f1.write(line_2)
                                f1.flush()
                                f1.close()
                                f_new.close()
                                continue
                            else:
                                print("你输入的价格格式错误!")
                                continue
                    else:
                        print("The name is  not exist!")
                        continue

                elif(select1==3):
                    """退出商品模块"""
                    exit()
                else:
                    """其它情况,从新输入模块"""
                    print("输入错误,请重新输入\n")
                    continue
                f1.close()
                break
        else:
            print("The password is wrong!")
else:
    print("The username is not exist!")

f.close()

zuoye_buyer.py
#Author:ajun
#实现买家模块,买家第一次登录需要输入收入。
#买家可以买东西
import re
import getpass
goods_dict={}
goods_list=[]
name=input("Please input username:")
passwd=input("Please input passwd:")
salary=0
count=0
shopping_list=[]
f=open("buyer_user.txt","r")

for line in  f.readlines():
    if name==re.split(":",line)[0]:
        if passwd==re.split(":",line)[1]:
            print("Welcome,login success!")
            passwd_flag=re.split(":",line)[2]
            passwd_flag=int(passwd_flag)
            if 1==passwd_flag:
                salary=int(re.split(":",line)[3])
            else:
                salary=input("Please input your money:")
                salary=int(salary)
                #修改文件

                f.close()
                f=open("buyer_user.txt","r")
                f_new=open("buyer_user.bak.txt","w",encoding="utf-8")
                for line_1 in f:

                    if name in line_1:
                        line_1=line_1.replace(":0:0:",":1:%s:"%salary)
                    f_new.write(line_1)

                f_new.flush()
                f.close()
                f_new.close()

            print("The money of your  is %s "%salary)
            """货品处理模块"""
            f1=open("good_list.txt",r+)
            for line1 in f1:
                key_1=re.split(":",line1)[0]
                goods_dict[key_1]=re.split(":",line1)[1]
            f1.close()
            #print(goods_dict)
            """字典转换为列表模块"""
            for i in goods_dict.items():
                goods_list.append(i)
            #print(goods_list)
            """买货品模块"""
            while True:
                for item in goods_list:
                    print(goods_list.index(item),item)
                user_choice = input("Your choice?")
                if user_choice.isdigit():
                    user_choice=int(user_choice)

                    if user_choice < len(goods_list) and user_choice >= 0 :
                        p_item = goods_list[user_choice]
                        p_i=p_item[1]
                        #print(p_i)
                        p_i=int(p_i)
                        if p_i<salary :
                            salary-=p_i
                            shopping_list.append(p_item)
                            print(" Added %s in shopping cart, and your current balance is \033[31;1m%s\033[0m"%(p_item,salary))
                        else:
                            print("\033[41;1m你的余额只剩[%s],你买个毛线啊!\033[0m" % salary)
                    else:
                        print("Product code [%s] is not exist!" %user_choice)
                elif user_choice==q:
                    print("---------shopping list---------")
                    for p in goods_list:
                        print(p)
                    print("Your current balance:%s"  % salary)
                    #写回数据
                    f=open("buyer_user.txt","w")
                    f_new=open("buyer_user.bak.txt","r")
                    for line_2 in f_new:
                        if name in line_2:
                            line_2=line_2.replace(re.split(":",line_2)[3],"%s"%salary)
                        f.write(line_2)
                    f.flush()
                    f.close()
                    f_new.close()
                    exit()
                else:
                     print("invalid option!")
        else:
            print("The password is wrong!")
else:
    print("The username is not exist!")

f.close()


buyer_user.txt
ajun1:ajun123:1:5000:
daxiong1:daxiong123:1:4000:
zhangsan1:zhangsan123:0:0:
lisi1:lisi123:1:3942:
wangwu1:wangwu123:0:0:

sale_user.txt
ajun:ajun123:
daxiong:daxiong123:
zhangsan:zhangsan123:
lisi:lisi123:
wangwu:wangwu123:

good_list.txt
cat:600::
dog:900:
iphone:5000:
bike:590:
cake:129:
参考答案-阿军

 

python学习第二周(数据类型、字符串、列表、元祖、字典)