目录
01-作业1
class Point(object):
# point 方法在创建时,需要两个int类型的参数,用来表示x,y坐标
def __init__(self, x: int, y: int):
self.x = x
self.y = y
class Rectangle(object):
def __init__(self, top_left: Point, bottom_right: Point):
self.top_left = top_left
self.bottom_right = bottom_right
def get_area(self):
length = abs(self.bottom_right.x - self.top_left.x)
width = abs(self.top_left.y - self.bottom_right.y)
return length * width
def is_inside(self, point):
# if self.bottom_right.x >= point.x >= self.top_left.x and self.top_left.y >= point.y >= self.bottom_right.y:
# return True
# else:
# return False
return self.bottom_right.x >= point.x >= self.top_left.x and self.top_left.y >= point.y >= self.bottom_right.y
# p1 = Point(4, 20) # 定义左上角的点
# p2 = Point(30, 8) # 定义右下角的点
#
# r = Rectangle(p1, p2) # 把左上角和有下角的点传递给矩形
# print(r.get_area())
#
# p = Point(20, 30)
# print(r.is_inside(p))
#
# x = Point(20, 20)
# print(r.is_inside(x))
class Calculator(object):
# def add(self, a, b):
# return a + b
@staticmethod
def add(a, b):
return a + b
# c = Calculator() # 有必要创建一个实例对象吗?
# print(c.add(4, 5))
print(Calculator.add(4, 5))
Python进阶-静态方法(@staticmethod)
@staticmethod
静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包
放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性class cal: cal_name = '计算器' def __init__(self,x,y): self.x = x self.y = y @property #在cal_add函数前加上@property,使得该函数可直接调用,封装起来 def cal_add(self): return self.x + self.y #在cal_info函数前加上@classmethon,则该函数变为类方法, @classmethod #该函数只能访问到类的数据属性,不能获取实例的数据属性 def cal_info(cls): #python自动传入位置参数cls就是类本身 print('这是一个%s'%cls.cal_name) #cls.cal_name调用类自己的数据属性 @staticmethod #静态方法 类或实例均可调用 def cal_test(a,b,c): #改静态方法函数里不传入self 或 cls print(a,b,c) c1 = cal(10,11) cal.cal_test(1,2,3) #>>> 1 2 3 c1.cal_test(1,2,3) #>>> 1 2 3
02-作业2
class Auto(object):
def __init__(self, color, weight, speed=0, wheel_count=4):
self.color = color
self.weight = weight
self.speed = speed
self.wheel_count = wheel_count
def change_speed(self, x):
"""
修改车速
:param x: 表示要修改的车速值。如果是正数,表示加速,负数表示减速,0表示停车
"""
if x == 0: # 如果传递的参数0,表示要停车
self.speed = 0
return
self.speed += x
if self.speed <= 0 and x < 0:
self.speed = 0
return
class CarAuto(Auto):
def __init__(self, color, weight, ac, navigator, speed=0, wheel_count=4):
# self.color = color
# self.weight = weight
# self.speed = speed
# self.wheel_count = wheel_count
super(CarAuto, self).__init__(color, weight, speed, wheel_count)
self.navigator = navigator
self.ac = ac
car = CarAuto('白色', 1.6, '美的', 'iOS', 10, 5)
print(car.color)
print(car.weight)
print(car.navigator)
print(car.ac)
print(car.speed)
print(car.wheel_count)
03-文件操作
# Python里使用 open 内置函数用来打开一个文件
# file:文件的路径。相对路径和绝对路径
# mode:打开文件的模式。 r:只读 w:写入 b:二进制 t:文本形式打开
# mode 默认使用的 rt
# encoding:用来指定文件的编码方式。windows系统里,默认是gbk
# file = open('xxx.txt') # 报错,默认是以 rt 打开,如果文件不存在,会报错
# file = open('sss.txt', 'w', encoding='utf8') # 创建一个新的文件
# file.write('你好')
# file = open('sss.txt', 'rt', encoding='utf8')
# print(file.read()) # 将所有的数据都读取出来
# readline只读取一行数据
# while True:
# content = file.readline()
# print(content)
# if content == '':
# break
# 读取所有行的数据,保存到一个列表里
# x = file.readlines()
# print(x)
# x = file.read(10) # 指的是读取的长度
# 优化:没有绝对的优化,除非提升硬件
file = open('../02-视频/02-作业讲解2.mp4', 'rb')
# print(file.read())
while True:
content = file.read(1024)
if not content:
break
print(content)
file.close()
open 内置函数用来打开一个文件 # file:文件的路径。相对路径和绝对路径 # mode:打开文件的模式。 r:只读 w:写入 b:二进制 t:文本形式打开 # mode 默认使用的 rt # encoding:用来指定文件的编码方式。windows系统里,默认是gbkfile = open('../02-视频/02-作业讲解2.mp4', 'rb') # print(file.read())
04-实现文件拷贝功能
import os
file_name = input('请输入一个文件路径:')
if os.path.isfile(file_name): # 判断是否是文件
# 打开旧文件
old_file = open(file_name, encoding='utf8')
# sss.txt ==> sss.txt.bak.txt
# 'sss.txt' + 'bak' + 'txt'
# names = file_name.rpartition('.') # ('sss.txt','.','txt')
# new_file_name = names[0] + '.bak.' + names[2]
names = os.path.splitext(file_name) # ('xxx', '.txt')
# # print(names)
new_file_name = names[0] + '.bak' + names[1]
new_file = open(new_file_name, 'w', encoding='utf8') # 打开一个新文件用于写入
# 把旧文件的数据读取出来写入到新的文件
new_file.write(old_file.read())
new_file.close()
old_file.close()
else:
print('您输入的文件不存在')
重点理解,常用
05-文件拷贝优化
import os
file_name = input('请输入一个文件路径:')
if os.path.isfile(file_name):
old_file = open(file_name, 'rb') # 以二进制的形式读取文件
names = os.path.splitext(file_name)
new_file_name = names[0] + '.bak' + names[1]
new_file = open(new_file_name, 'wb') # 以二进制的形式写入文件
while True:
content = old_file.read(1024) # 读取出来的内容是二进制
new_file.write(content)
if not content:
break
new_file.close()
old_file.close()
else:
print('您输入的文件不存在')
06-csv文件的读写
import csv # 系统内置模块
# file = open('demo.csv', 'w', encoding='utf8', newline='') # 打开一个文件
# w = csv.writer(file)
# w.writerow(['name', 'age', 'score', 'city'])
# w.writerow(['zhangsan', 19, 90, '襄阳'])
# w.writerow(['lisi', 19, 90, '纽约'])
# w.writerows(
# [
# ['name', 'age', 'score', 'city'],
# ['zhangsan', 19, 90, '襄阳'],
# ['lisi', 19, 90, '纽约']
# ]
# )
file = open('info.csv', 'r', encoding='utf8', newline='')
r = csv.reader(file)
for data in r:
print(data)
file.close()
file = open('info.csv', 'r', encoding='utf8', newline='') r = csv.reader(file) for data in r: print(data) file.close()
07-将数据写入到内存
# 将数据写入到内存涉及到 StringIO和BytesIO两个类
from io import StringIO, BytesIO
from wsgiref import simple_server
s_io = StringIO()
# s_io.write('hello') # 把数据写入到了内存里缓存起来了
# s_io.write('good')
# print(s_io.getvalue())
# s = ''
# s += 'hello'
# s += 'word'
# print(s)
# file 需要的是一个文件流对象
# print('hello', file=open('sss.txt', 'w'))
print('good', file=s_io)
print('yes', file=s_io)
print('ok', file=s_io)
print(s_io.getvalue())
s_io.close()
b_io = BytesIO()
b_io.write('你好'.encode('utf8'))
print(b_io.getvalue().decode('utf8'))
b_io.close()
08-sys模块的使用
import sys
# sys.stdin 接收用户的输入,说白了就是读取键盘里输入的数据
# stdout和stdin默认都是控制台
# sys.stdout 标准输出
# sys.stderr 错误输出
s_in = sys.stdin # input就是读取 sys.stdin 里的数据
# while True:
# content = s_in.readline().rstrip('\n') # hello\n ==>hello \n==> ''
# if content == '':
# break
# print(content)
m = open('stdout.txt', 'w', encoding='utf8')
sys.stdout = m
print('hello')
print('yes')
print('good')
m.close()
# err == > error 错误
x = open('stderr.txt', 'w', encoding='utf8')
sys.stderr = x
print(1 / 0)
x.close()
09-json的使用
# 序列化:将数据从内存持久化保存到硬盘的过程
# 反序列化:将数据从硬盘加载到内存的过程
# write时,只能写入字符串或者二进制
# 字典、列表、数字等都不能直接写入到文件里
# 将数据转换成为字符串: repr/str 使用json模块
# json 本质就是字符串,区别在于json里要是用双引号表示字符串
# 将数据转换成为二进制: 使用pickle模块
import json
names = ['zhangsan', 'lisi', 'jack', 'tony']
# x = json.dumps(names) # dumps 的作用是将数据转换成为字符串
# # print(x) # ' ["zhangsan", "lisi", "jack", "tony"] '
#
file = open('names.txt', 'w', encoding='utf8')
# file.write(x)
# json里将数据持久有两个方法:
# dumps:将数据转换成为json字符串,不会将数据保存到文件里。
# dump: 将数据转换成为json字符串的同时写入到指定文件。
# json 反序列化也有两个方法:
# loads: 将json字符串加载成为Python里的数据
# load: 读取文件,把读取的内容加载成为Python里的数据
json.dump(names, file)
file.close()
x = '{"name":"zhangsan","age":18}' # 符合json规则的字符串
p = json.loads(x)
# print(p, type(p))
print(p['name'])
# load 读取一个文件,并把文件里的json字符串加载成为一个对象
file1 = open('names.txt', 'r', encoding='utf8')
y = json.load(file1)
print(y)
print(y[0])
file1.close()
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(self.name + '正在吃东西')
p = Person('henry', 20)
x = json.dumps(p.__dict__)
y = json.loads(x)
print(y)
# 序列化:将数据从内存持久化保存到硬盘的过程 # 反序列化:将数据从硬盘加载到内存的过程 # write时,只能写入字符串或者二进制 # 字典、列表、数字等都不能直接写入到文件里 # 将数据转换成为字符串: repr/str 使用json模块 # json 本质就是字符串,区别在于json里要是用双引号表示字符串 # 将数据转换成为二进制: 使用pickle模块
10-pickle模块的使用
# python 里存入数据只支持存入 字符串 和 二进制
# json: 将Python里的数据(str/list/tuple/dict/int/float/bool/None)等转换成为对应的json
# pickle: 将Python里任意的对象转换成为二进制
import pickle
# 序列化 dumps:将Python数据转换成为二进制
# dump:将Python数据转换成为二进制,同时保存到指定文件
# 反序列化 loads:将二进制加载成为Python数据
# load:读取文件,并将文件的二进制内容加载成为Python数据
names = ['张三', '李四', '杰克', '亨利']
# b_names = pickle.dumps(names)
#
# file = open('names.txt', 'wb')
# file.write(b_names) # 写入的是二进制,不是存文本
# file.close()
#
# file1 = open('names.txt', 'rb')
# x = file1.read()
# y = pickle.loads(x)
# print(y)
# file1.close()
# file2 = open('names.txt', 'wb')
# pickle.dump(names, file2)
# file2.close()
#
# file3 = open('names.txt', 'rb')
# pickle.load(file3)
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'))
# 从文件里加载出来
dd = pickle.load(open('dog.txt', 'rb'))
dd.eat()
print(dd.name, dd.color)
11-异常处理
# 在程序运行过程中,由于编码不规范等造成程序无法正常执行,此时程序就会报错
# 健壮性:很多编程语言都有异常处理机制。
def div(a, b):
return a / b
try:
x = div(5, 2)
print('呵呵呵')
except Exception as e: # 如果程序出错了,会立刻跳转到 except 语句
print('程序出错了!!!!')
else: # 程序运行如果没有出错,会执行else语句里的代码
print('计算的结果是', x)
重点
12-except语句
# try...except 语句用来处理程序运行过程中的异常
try:
person = {'name': 'zhangsan'}
print(person['age'])
print(1 / 2)
file = open('ddd.txt')
print(file.read())
file.close()
except Exception as e: # 给异常起了一个变量名 e
print(e)
# except:
# print('出错了!!!')
# except (FileNotFoundError, ZeroDivisionError, KeyError) as e: # 处理指定类型的异常
13-异常的使用场景
age = input('请输入您的年龄:') # input接收到的用户输入是一个字符串
# if age.isdigit():
try:
age = float(age)
except ValueError as e:
print('输入的不是数字')
else:
if age > 18:
print('欢迎来到我的网站')
else:
print('未满18岁,请自动离开')
常见异常总结
1.SynataxError:语法错误
2.NameError:试图访问的变量名不存在
3.IndexError:索引错误,使用的所以你不存在,常为索引超出序列范围
4.KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误
5.TypeError:类型错误,内建操作或是函数应于在错误类型的对象时会引发类型错误
6.ValueError:值错误,传给对象的参数类型不正确,例如给int()函数传入了字符串数据类型
7.AttributeError:属性错误,特性引用和赋值失败时会引发属性错误
8.IOError:输入输出错误
异常不局限于以上八中,这只是很常见的八种异常
捕获异常
1.try...except组合语法
(1)代码:
try:
正常的操作
except:
发生异常,执行这块代码
(2)案例:
2.try...except...else组合语法
(1)代码:
try:
正常的操作
except:
发生异常,执行这块代码
else:
如果没有异常,执行这块代码
(2)案例:
3.try...except...except(多个异常处理)
(1)代码:
try:
正常的操作
except A:
发生异常A,执行这块代码
except B:
发生异常B,执行这块代码
except:
发生其它异常,执行这块代码
else:
如果没有异常,执行这块代码
(2)案例:
4.try...except(A,B)(一次捕获多个异常)
(1)代码:
try:
正常的操作
except(A,B):
发生异常A和B,执行这块代码
(2)案例:
5.try...except...finally组合语法:(try...finally也可以)
(1)代码:
try:
正常的操作
except:
发生异常,执行这块代码
else:
如果没有异常,执行这块代码
finally:
不管有没有异常,都执行这块代码
(2)案例:
6.try...except(嵌套)
(1)代码:
try:
正常的操作
try:
正常的操作
finally:
不管有没有异常,都执行这块代码
except A:
发生异常,执行这块代码
(2)案例:
.处理异常(在脚本执行不成功时,我们希望能把信息打印出来)
1.如果已经知道会发生什么异常:
2.不知道会发生什么异常(万能的)---------所有的异常都继承Exception