python学习No9
sys模块
sys.stdin接受用户的输入,键盘读取输入的数据
sys.stdout 标准输出,默认控制台
sys.stderr错误输出,默认控制台n
stdin
import sys
#
s_in=sys.stdin
while True:
y=s_in.readline()
if y=='\n':
break
print(y)
sys.stdout=ope
stdout(改变控制台)
print('hello')
print('yes')
print(1/0)
print('------比较上下-----两个代码')
sys.stdout=open('stdout.txt','w',encoding='utf8')
print('hello')
print('yes')
print(1/0)
stderr
sys.stderr=open('stdout.txt','w',encoding='utf8')
print(1/0)
序列化和反序列化
序列化:将数据从内存持久化保存到硬盘的过程
反序列化:将数据将硬盘加载到内存的过程
将数据写入文件夹中
file=open('name.txt','w',encoding='utf8')
# names=['zhangsan','lisi','jack','tony']
# file.write(names)
#注释报错。由此可见,write只能写入字符串或者二进制
file.write('aaa')
将数据转换成字符串(repr/str),或者二进制可以写入文件夹。
转换成字符串可以用json更常用,区别在于json里使用“”表示字符串
转换成二进制:使用pickle
json里将数据持久的两个方法:
dumps:将数据转换成json字符串,不会将字符串保存在文件里,要保存得自己write
dump:可以直接将数据转换成json字符串的同时写入文件
#json本质就是字符串,区别在于json要用双引号表示字符串
import json
names=['zhangsan','lisi','jack']
x=json.dumps(names)#dumps将数据转换成字符串
#print(x)
file=open('names.txt','w',encoding='utf8')
file.write(x)
file.close()
names=['zhangsan','lisi','jack']
file=open('names.txt','w',encoding='utf8')
json.dump(names,file)
json的反序列也有两个方法:
loads:将json字符串加载成为python里的数据
load:读取文件,把读取的内容加载成为python里的数据
x='{"name":"zhangsan","age":18}'
p=json.loads(x)
print(p,type(p))
print(p['name'])
#load
file1=open('name.txt','r',encoding='utf8')
y=json.load(file1)
print(y)
print(y[0])
file1.close()
pickle
序列化:
dumps:将python数据转换成二进制
dump:将python数据转换成二进制,同时保存到指定文件
#dumps
names=['zhangsan','lisi','jieke']
b_name=pickle.dumps(names)
file=open('name.txt','wb')
file.write(b_name)#写入 的是二进制,不是纯文本
file.close()
file1=open('name.txt','rb')
x=file1.read()
y=pickle.loads(x)
print(y)
#dump
names=['zhangsan','lisi','jieke']
file2=open('names.txt','wb')
pickle.dump(names,file2)
反序列化:
loads:将二进制加载成为python数据
load:读取文件,并将文件二进制内容加载成为python
#利用load读取
file2=open('names.txt','wb')
pickle.dump(names,file2)
file2.close()
file3=open('names.txt','rb')
y=pickle.load(file3)
print(y)
#原封不动保存
class Dog(object):
def __init__(self,name,color):
self.name=name
self.color=color
def eat(self):
print(self.name+'正在吃东西')
d=Dog('大黄','黄色')
#保存到文件里
pickle.dump(d,open('dog.txt','wb'))
#从文件里加载出来
a=pickle.load(open('dog.txt','rb'))
a.eat()
print(a.name,a.color)
pickle和json使用的区别
pickle用来将数据原封不动转换为二进制,但是这个二进制只能用python识别。
json只能保存一部分信息,作用是在不同的平台里传递数据,储存的是基本的数据类型
程序的异常处理
如下代码就是异常代码,除数不能为0,报错是程序对代码的健壮性,就像人的痛感,实际也是一种保护机制。
def div(a,b):
return a/b
x=div(5,0)
x+=3
print(x)
避免程序报错崩的做法:(异常处理的模式)
try…except 语句来处理程序运行的异常
def div(a,b):
return a/b
try:
x=div(5,0)
print('aaaaa')#出错此行就不打印
except Exception as e:
print("程序出错了")
else:
print(x)
继承小练习
有一个学生类Student属性:学号姓名年龄性别成绩,班级类,方法:查看班级中学生信息,查看指定学号学生信息,查看班级中成绩不及格学生信息,将班级中学生按照成绩降序排列。
class Student(object):
def __init__(self,number,name,age,gender,score):
self.name=name
self.number=number
self.age=age
self.gender=gender
self.score=score
def __str__(self):
return ('编号:{},性别:{},年龄:{},性别:{},分数:{}'.format(self.number, self.name, self.age, self.gender, self.score))
class Grade(object):
def __init__(self,name,students):
self.name=name
self.students=students
def show_all(self):
for student in self.students:
print(student)
def failed_students(self):
result=filter(lambda student:student.score<60,self.students)
for x in result:
print(x)
def order_students(self):
self.students.sort(key=lambda s:s.score,reverse=True)
s1=Student(1,'张三',18,'male',80)
s2=Student(3,'ll',18,'male',99)
s3=Student(10,'tony',90,'male',89)
s4=Student(7,'jack',23,'famle',77)
s5=Student(25,'jerry',90,'famle',56)
g=Grade('大一2班',[s1,s2,s3,s4,s5])
g.show_all()
print()
g.failed_students()
print()
g.order_students()
for student in g.students:
print(student)