python高级


python高级(不定期更新)

列表存入文件,再读取出列表

思路

文件里的必须是字符串形式,其他形式不行,因此如果列表、元组、字典等需要写入文件时事先应该str类型转化

  1. 写成列表,用str转成字符串存进去,然后用 eval函数去掉引号
  2. 写入字符串,用一个符号进行分割,然后用strbook.split("")取出来

例题

题目:
定义一个产品类Book表示图书库存类,该类有三个数据成员:name, publisher, price, count,分别表示该图书的书名(字符串型)、出版社(字符串型)、单价(小数类型)、库存数量(整数类型),通过构造函数传值进行初始化。图书的初始信息存储在books.txt文件中,每行表示一种图书,每行有四列分别表示产品的四个信息。要求从文件读取所有书籍信息,保存在列表中,按出版社和库存量排序,保存到文件。请根据以下给出的主函数代码完善整个程序代码。
def main():
booklist=[]
loadBook(booklist)
sortBook(booklist)
saveBook(booklist)
main()
代码:

'''创建一个书类,并且创建对象时可以存入文件book.txt,用&作为分割,避免书名中出现逗号造成转列表时出现bug'''
class Book:
"这是一个书类"
def __init__(self, name='none', publisher='none', price=0, count=0):
self.name=name
self.publisher=publisher
self.price=price
self.count=count
f=open('.\\book.txt','a')
bookList=[self.name,self.publisher,self.price,self.count]
#         print(bookList)
f.write('\n')
f.write(str(bookList))
f.close() 

def loadBook(booklist):
global f1
f1=open('.\\book.txt','r')
'''一行一行的将文件取出,将每一行转成列表,并将每一行存入另一个列表,用sort进行排序'''
'''实际上那个booklist我并没有用到emmm'''
def sortBook(booklist):
def takethird(elem):
return elem[3]

x = len(f1.readlines())
f1.seek(0,0)
BOOKALL=f1.readlines()
f1.seek(0,0)
#     print(x)
global listbook
listbook=[]
for i in range(0,x):
strbook=BOOKALL[i].strip('\n')
listbook.append(eval(strbook))
#         listbook.append(strbook.split("&"))
#     print(listbook)
listbook.sort(key=takethird)
#     print(listbook)
def saveBook(booklist):
f2=open('./booksort.txt','a+')
for i in listbook:
f2.write(str(i)+'\n')
f2.close()
def main():
Book('1','2',2,3)
booklist=[]
loadBook(booklist)
sortBook(booklist)
saveBook(booklist)
main() 

高级函数

格式转换

str():转为字符串

排序sort()

默认:list.sort(cmp=None, key=None, reverse=False)
reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。
该方法没有返回值,但是会对列表的对象进行排序。
举例:
def takethird(elem):
return elem[3]
sort(key=takethird)
补充sorted
sorted是sort的增强版
sort只能对列表进行排序
sorted可以对所有可迭代对象进行排序,返回一个列表

字符串头尾指定的字符生成的新字符串

str.strip('\n')

字符串分离,转为列表

strbook.split("&")

面向对象

self的理解

为什么函数中要写self?
因为你不写self你就用不了别的函数存在self里的值,不然就要用全局变量了
而且python中的函数只能用自己函数内部的局部变量和self里的

私有变量

在变量名前加上__双下划线

全局变量

变量名前面加上global

空值

None

json文件存储

不只是能存字符串

代码

import json
a_dict = {'user_id':'qbf','user_name':'hello',100:200}

with open('.\example.json','w') as f:
json.dump(a_dict,f)

with open('.\example.json') as f:
content = json.load(f)
print(content)

文件

f=open()
f.close()
等于
with open() as f:
pass
优点:不用关闭