python学习笔记16

一、上堂回顾

1.csv文件的读写

​ 注意区分和普通文件的读写

2.高阶函数

​ 工作原理

​ 使用

二、面向对象综合练习

1.pickle模块的使用

代码演示:

import  pickle
​
"""
pickle提供了一个简单的持久化功能,可以将对象以文件的形式存放到磁盘上
pickle模块只能在Python中使用,Python中所有的数据类型【list,string,tuple,dict,set,对象】都可以使用pickle进行序列化
但是,需要注意的是:pickle序列化的数据,人一般无法识别
"""
class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
​
    def show(self):
        print("name:%s age:%d" %(self.name,self.age))
​
p = Person("张三",10)
p.show()
​
#序列化:将对象存储到本地磁盘
"""
pickle.dump(obj,file,protocol=None)
obj:将要封装的对象【将要写入到本地磁盘的对象】
file:obj将要写入的文件对象,注意:file必须以二进制可写形式打开,"wb"
protocol:可选参数,表示告知pickle的协议,支持的协议有0,1,2,3,默认的协议是3
"""
f = open("file1.txt","wb")   #类似于write的使用,文件不存在,则自动创建
pickle.dump(p,f)
f.close()
​
#反序列化:将本地磁盘上存储的对象读取出来
"""
pickle.load(file)
file:要读取的文件对象,注意:file必须以二进制可读的形式打开,"rb"
"""
f1 = open("file1.txt","rb")
p1 = pickle.load(f1)
p1.show()

2.综合练习

商品:goods.py

"""
商品类:
    商品名称   商品价格   商品剩余量
"""
class Goods(object):
    def __init__(self,name,price,balance):
        self.name = name
        self.price = price
        self.balance = balance
​
    def __str__(self):
        return "[goods] name:%s price:%d balance:%d" % (self.name,self.price,self.balance)

用户:user.py

"""
用户类:
    姓名  用户id【这个标识对于每个用户而言是唯一的]】    密码     拥有购物车  用户登录状态【默认为 False 表示没有登录】
​
"""
class User(object):
    def __init__(self,name,uid,psw,shopping_car):
        self.name = name
        self.uid = uid
        self.psw = psw
        self.shopping_car = shopping_car
        self.islogin = False
        
    def __str__(self):
        return "[user] name:%s uid:%s psw:%s shopping_car:%s islogin:%s" %(self.name,self.uid,self.psw,self.shopping_car,self.islogin)

购物车:shoppingcar.py

"""
购物车类:
    商品列表:程序初始时,商品列表为空
"""
class ShoppingCar(object):
    def __init__(self):
        self.good_list = {}
​
    def __str__(self):
        return  "%s" %(self.good_list)

仓库:storage.py

"""仓库类:【信息保存在本地磁盘:程序刚启动时把列表先存储到文件中,之后使用再读取出来】
    商品列表
           商品名称     价格        剩余量
        Mac电脑       20000    100
        PthonBook   30      200
        草莓键盘         80         60
        iPhone      7000        70
​
"""
​
import pickle
from  shopcar.goods import Goods
import  os
​
#注意:仓库采用单例实现,表示不管在哪个地方,或者不管是哪个用户访问,获取到的都是同一个仓库
#装饰器实现单例
def single(cls):
    #方式一
    """
    instance = None
​
    def getInstance(*args,**kargs):
        nonlocal  instance
        if instance == None:
            instance = cls(*args,**kargs)
        return instance
​
    return  getInstance
    """
    #方式二
    instance = {}
    def getInstance(*args,**kargs):
        if cls not in instance:
            instance[cls] = cls(*args,**kargs)
        return  instance[cls]
​
    return  getInstance
​
@single
class Storage(object):
    def __init__(self):
        #程序刚启动时把列表先存储到文件中,之后使用再读取出来
        pass
​
    #加载商品
    def load_goods(self):
        if not os.path.exists("goodslist.txt"):
            #将商品列表添加到文件中
            self.goodslist = []
​
            names = ["Mac电脑","Python Book","草莓键盘","iPhone"]
            prices = [20000,30,80,7000]
            balances = [100,200,60,70]
​
            #遍历列表
            for i in range(len(names)):
                # 已知根据的商品信息创建一个商品对象出来
                goods = Goods(names[i],prices[i],balances[i])
                #将创建好的商品对象添加到商品列表中
                self.goodslist.append(goods)
​
            #将数据持久化到本地磁盘
            self.save_goods()
        else:
            #加载文件中的商品
            self.custom_load()
​
    #将数据持久化到本地磁盘
    def save_goods(self):
        with open("goodslist.txt","wb") as f:
            pickle.dump(self.goodslist,f)
​
    #获取文件中的商品列表
    def get_goods(self):
        if os.path.exists("goodslist.txt"):
            self.custom_load()
​
    def custom_load(self):
        with open("goodslist.txt", "rb") as f:
            # 反序列化对象【将文件中对象读取出来】
            # 注意:时刻保证程序中的商品列表和文件中商品列表的一致性
            self.goodslist = pickle.load(f)

功能类:operation.py

"""
程序
    因为一个程序可能有很多用户,则需要将用户保存在本地
            将注册的用户添加在字典中
                key:用户id 【用户id随机产生即可,从10000~99999中随机产生一个】
                value:对应的用户对象
​
    行为:
    用户注册——》根据下面信息生成一个用户,并将用户保存在本地
        随机产生 id
        输入姓名和密码
        创建一个购物车对象
​
​
    登录 ——》 登录成功返回为 True  否则返回为 False
        输入用户id 检测是否有该用户  没有的话提示注册
        有的话检测用户登录状态 若为 True  提示已登录
        否则 再输入密码进行登录
            不要忘记修改用户的登录状态
​
    购买商品 ——》验证用户是否登录,没有登录提示登录
        否则
            列出仓库中商品名单
                1. Mac电脑
                2.PthonBook
                3.草莓键盘
                4.iPhone
            用户输入对应的编号 在仓库中获得对应的商品
            用户输入数量 — 与该商品的的剩余量对比
                > 剩余量
                    让用户重新输入并提示该商品的剩余量
                <=剩余量
                    将该商品添加在该用户的购物车中
                    并将仓库中的数据量做出相应的减少
                注意:将修改之后的结果同步在本地文件中,时刻保持数据的正确性
​
    删除购物车的商品——》验证用户是否登录,没有登录提示登录
        否则
            请用户输入商品名字 查看该用户的购物车中是否有该商品
            如果没有,提示购物车中没有该商品
            否则:
                先选择要删除的商品
                请用户设置删除的数量
                    数量  >=   购物车中商品数量
                        购物车清单中删除该商品
                    否则:
                        购物车清单中做出相应的减少
            注意:将修改之后的结果同步在本地文件中,时刻保持数据的正确性
​
​
    结算——》验证用户是否登录 没有登录提示登录
        否则
            获取该用户的购物车中商品清单,计算总额
        注意: 结算完成 购物车清空
              将修改之后的结果同步在本地文件中,时刻保持数据的正确性
​
​
    退出登录———》验证用户是否登录 没有登录提示登录
        否则
            修改用户登录状态
        注意:将修改之后的结果同步在本地文件中,时刻保持数据的正确性
"""
from shopcar.goods import  Goods
from shopcar.user import  User
from shopcar.shoppingcar import ShoppingCar
from shopcar.storage import Storage
import  pickle
import os
import random
​
class Operation(object):
    #当程序启动起来之后,加载本地用户文件
    def __init__(self):
        self.load_all_user()
        print(self.userlist)
​
    #加载所有用户
    def load_all_user(self):
        if os.path.exists("user.txt"):
            #反序列化
            with open("user.txt","rb") as f:
                self.userlist = pickle.load(f)
        else:
            #定义一个字典
            self.userlist = {}
​
    #保存用户信息
    def save_user(self):
        #序列化
        with open("user.txt","wb") as f:
            pickle.dump(self.userlist,f)
​
    #随机产生一个用户id
    def get_uid(self):
        #问题:用户id是为了唯一标志一个用户的,一定不能重复
        #注意:随机数可能会出现重复的情况,所以避免
        while True:
            uid = str(random.choice(range(10000, 100000)))
            if uid not in self.userlist:
                return uid
​
    #用户注册
    def user_register(self):
        #获取uid
        uid = self.get_uid()
        #购物车对象
        sc = ShoppingCar()
        #用户名和密码
        name = input("请输入用户名:")
        psw = input("请输入密码:")
        #创建一个用户
        user = User(name=name,uid=uid,psw=psw,shopping_car=sc)
        print(user.uid)
​
        #将用户添加到用户字典中
        self.userlist[uid] = user
​
        #同步到本地文件中
        self.save_user()
​
    #用户登录
    def user_login(self):
        uid = input("请输入用户id;")
        if uid not in self.userlist:
            print("请先注册")
            return
​
        #在uid存在的情况下,通过id获取用户的登录状态
        #首先通过uid获取用户
        user = self.userlist[uid]
        if user.islogin:
            return user
​
        #用户是未登录状态
        while True:
            psw = input("请输入登录密码:")
            if psw == user.psw:
                user.islogin = True
                return user
​
            else:
                print("请输入正确的密码:")
​
    #向购物车中添加商品
    def add_goods(self):
        #在添加商品之前,校验用户是否登录成功
        user = self.user_login()
        if user == None:
            print("请先进行登录:")
            return
​
        #说明用户已经登录
        print("""
        0.Mac电脑
        1.Python Book
        2.草莓键盘
        3.iPhone
        """)
        #引导用户进行选择商品
        index = int(input("请输入商品编号:"))
        #获取仓库
        storage = Storage()
        #print(storage.__dir__())
        #从商品列表中获取商品对象
        goods = storage.goodslist[index]
        #引导用户输入需要购买的商品的数量
        num = int(input("请输入需要购买的商品数量:"))
        if num < 0 :
            print("输入有误")
        else:
            while num > goods.balance:
                num = int(input("商品剩余量为:%d 请重新输入需要购买的商品数量:"%(goods.balance)))
            else:
                #重新实例化商品对象
                user_goods = Goods(goods.name,goods.price,num)
                #添加到购物车中
                user.shopping_car.good_list[user_goods] = num
                #仓库中商品的剩余量发生变化
                goods.balance -= num
​
                #数据发生变化,同步数据到本地文件
                #更新用户信息
                self.save_user()
                #更新商品信息
                storage.save_goods()
​
    #删除购物车中的商品
    def del_goods(self):
        user = self.user_login()
        if user == None:
            print("请先登录")
            return
​
        #说明登录成功
        g_name = input("请输入要删除的商品名称:")
        #定义一个变量,获取该商品对象
        goods = None
        #定义一个变量,用于标记该商品是否存在
        flag = False   #默认不存在
​
        #遍历用户的购物车的商品列表
        #商品列表是一个字典,key为商品对象,value为商品数量
        for key  in user.shopping_car.good_list:
            if key.name == g_name:
                goods = key
                flag = True
​
        if not flag:
            print("商品不存在")
            return
​
        #操作仓库
        #在仓库中获取该商品
        storage = Storage()
        index = 0
        for i in range(len(storage.goodslist)):
            if storage.goodslist[i].name == g_name:
                index = i
​
        #根据商品的位置获取商品对象
        storage_goods = storage.goodslist[index]
​
        #引导用户输入需要减少的商品数量
        num = int(input("请输入要减少的商品的数量:"))
        if num >= goods.balance:
            #将该用户对应的商品删除
            user.shopping_car.good_list.pop(goods)
            #仓库中需要加上
            storage_goods.balance += goods.balance
​
        else:
            goods.balance -= num
            #购物车中的商品的数量更改
            user.shopping_car.good_list[goods] = goods.balance
            # 仓库中需要加上
            storage_goods.balance += num
​
        #同步数据到本地文件
        self.save_user()
        storage.save_goods()
​
    #结算购物车
    def give_money(self):
        user = self.user_login()
        if user == None:
            print("请先登录")
            return
​
        #获取购物车中的所有的商品
        goods_dict  = user.shopping_car.good_list
​
        #计算所有商品的总价格
        total = 0
        for key,value in goods_dict.items():
            total += value * key.price
​
        print("总计为:%d" %(total))
​
        #清空购物车
        goods_dict.clear()
​
        #保存用户信息
        self.save_user()
​
    #退出
    def exit(self):
        user = self.user_login()
        if user != None:
            user.islogin = False
            # 保存用户信息
            self.save_user()

测试文件:test.py

from shopcar.operation import Operation
​
def main():
    op = Operation()
​
    while True:
        print("1.注册 2.登录 3.购买 4.删除 5.结算 6.退出")
        select = int(input("请输入选择:"))
        if select == 1:
            op.user_register()
        elif select == 2:
            op.user_login()
        elif select == 3:
            op.add_goods()
        elif select == 4:
            op.del_goods()
        elif select == 5:
            op.give_money()
        else:
            op.exit()
            break
​
if __name__ == "__main__":
    main()

三、turtle绘图

绘制图像,

1.画布

绘图区域,可以设置大小和颜色,初始位置

2.画笔

坐标原点为初始位置,

forward 默认沿着x轴的正方向

3.绘图命令

操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。

(1)画笔运动命令

命令 说明 turtle.forward(distance) 向当前画笔方向移动distance像素长度

turtle.backward(distance) 向当前画笔相反方向移动distance像素长度

turtle.right(degree) 顺时针移动degree° turtle.left(degree) 逆时针移动degree°

turtle.pendown() 移动时绘制图形,缺省时也为绘制 turtle.goto(x,y) 将画笔移动到坐标为x,y的位置

turtle.penup() 提起笔移动,不绘制图形,用于另起一个地方绘制

turtle.circle() 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆

setx( ) 将当前x轴移动到指定位置 sety( ) 将当前y轴移动到指定位置

setheading(angle) 设置当前朝向为angle角度

home() 设置当前画笔位置为原点,朝向东。

dot(r) 绘制一个指定直径和颜色的圆点

(2)画笔控制命令

命令 说明

turtle.fillcolor(colorstring) 绘制图形的填充颜色

turtle.color(color1, color2) 同时设置pencolor=color1, fillcolor=color2

turtle.filling() 返回当前是否在填充状态 turtle.begin_fill() 准备开始填充图形

turtle.end_fill() 填充完成 turtle.hideturtle() 隐藏画笔的turtle形状 turtle.showturtle() 显示画笔的turtle形状

(3)全局控制命令

命令 说明

turtle.clear() 清空turtle窗口,但是turtle的位置和状态不会改变

turtle.reset() 清空窗口,重置turtle状态为起始状态

turtle.undo() 撤销上一个turtle动作

turtle.isvisible() 返回当前turtle是否可见

stamp() 复制当前图形

turtle.write(s [,font=("font-name",font_size,"font_type")]) 写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项

(4)其他命令

命令 说明

turtle.mainloop()或turtle.done() 启动事件循环 -调用Tkinter的mainloop函数。必须是乌龟图形程序中的最后一个语句。 turtle.mode(mode=None) 设置乌龟模式(“standard”,“logo”或“world”)并执行重置。如果没有给出模式,则返回当前模式。模式初始龟标题正角度standard向右(东)逆时针logo向上(北)顺时针 turtle.delay(delay=None) 设置或返回以毫秒为单位的绘图延迟。

turtle.begin_poly() 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。

turtle.end_poly() 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。 turtle.get_poly() 返回最后记录的多边形。

4.实例

1、

import turtle

#设置画布的大小和背景颜色:方式一
#turtle.screensize(400,400,"red")
#启动画布
#turtle.done()

#画布
screen = turtle.Screen()
#设置画布的背景颜色
screen.bgcolor("cyan")
screen.setup(600,600)

#创建画笔
pen = turtle.Turtle()
#设置画笔的形状
pen.shape("turtle")
#设置画笔的颜色
pen.pencolor("yellow")
#设置线宽
pen.pensize(3)
#设置画笔的填充颜色
pen.fillcolor("red")

#开始填充
pen.begin_fill()
for i in range(5):
    #向x正方向前进200像素
    pen.forward(200)
    #顺时针旋转40度
    pen.right(40)
 #停止填充
pen.end_fill()

#将画笔隐藏
pen.hideturtle()

#将画笔显示
pen.showturtle()

2、

#绘制正方形
import  turtle

turtle.screensize(800,600)
#设置画笔颜色
turtle.color("red")
#设置画笔宽度
turtle.pensize(10)
#设置绘制速度
turtle.speed(1)
#提起画笔,移动到指定的位置,开始绘图
turtle.penup()
#移动到指定的位置
turtle.goto(100,200)
#落下画笔,开始绘图
turtle.pendown()
turtle.goto(300,200)
turtle.goto(300,0)
turtle.goto(100,0)
turtle.goto(100,200)

turtle.done()

3、

import  turtle

turtle.pensize(10)
turtle.color("red")

#绘制圆
#turtle.circle(50)

#绘制多边形
#注意:绘制多边形,steps操作,取值为num,则表示需要绘制num变形,steps越大,则圆接近于圆
turtle.circle(100,steps=300)

turtle.done()
 

4、

import  turtle

turtle.pensize(10)
turtle.speed(10)

l = ["red","yellow","black","blue","green"]

turtle.color(l[0])
turtle.circle(100)

turtle.color(l[1])
turtle.penup()
turtle.goto(150,0)
turtle.pendown()
turtle.circle(100)

turtle.color(l[2])
turtle.penup()
turtle.goto(300,0)
turtle.pendown()
turtle.circle(100)

#下面的两个圆
turtle.color(l[3])
turtle.penup()
turtle.goto(75,-150)
turtle.pendown()
turtle.circle(100)

turtle.color(l[4])
turtle.penup()
turtle.goto(225,-150)
turtle.pendown()
turtle.circle(100)

turtle.done()
5、

import  turtle

#同时设置penColor=red   fillcolor=yellow
turtle.color("red","yellow")
#准备开始填充
turtle.begin_fill()

for i in range(3):
    turtle.forward(200)
    turtle.left(120)

turtle.end_fill()

turtle.done()

6、

import turtle

screen = turtle.Screen()
screen.bgcolor("red")
screen.setup(800, 600)

#创建画笔
pen = turtle.Turtle()
#设置画笔的形状
pen.shape("turtle")
#设置画笔的颜色
pen.pencolor("yellow")
#设置线宽
pen.pensize(3)
#设置一下填充颜色
pen.fillcolor("yellow")

pen.begin_fill()
pen.circle(100)
pen.end_fill()

pen.penup()
pen.goto(-100, 140)
pen.pendown()

pen.circle(50, 360)

pen.penup()
pen.goto(100, 140)
pen.pendown()

pen.circle(50, 360)

pen.pencolor("white")
pen.penup()
pen.goto(-50, 100)
pen.pendown()
pen.fillcolor("white")
pen.begin_fill()
pen.circle(20, 360)
pen.end_fill()

pen.pencolor("black")
pen.penup()
pen.goto(-40, 100)
pen.pendown()
pen.fillcolor("black")
pen.begin_fill()
pen.circle(10, 360)
pen.end_fill()

pen.pencolor("white")
pen.penup()
pen.goto(50, 100)
pen.pendown()
pen.fillcolor("white")
pen.begin_fill()
pen.circle(20, 360)
pen.end_fill()

pen.pencolor("black")
pen.penup()
pen.goto(40, 100)
pen.pendown()
pen.fillcolor("black")
pen.begin_fill()
pen.circle(10, 360)
pen.end_fill()

pen.pencolor("black")
pen.penup()
pen.goto(0, 60)
pen.pendown()
pen.fillcolor("black")
pen.begin_fill()
pen.circle(10, 360)
pen.end_fill()

pen.pencolor("white")
pen.penup()
pen.goto(-40, 40)
pen.pendown()
pen.fillcolor("white")
pen.right(25)
pen.pensize(10)
pen.circle(100, 60)

pen.hideturtle()
screen.exitonclick()

7、七夕快乐

from turtle import *
screen = Screen()
screen.bgcolor("purple")
pensize(5)
hideturtle()
def curvemove():
    for i in range(200):
        right(1)
        forward(1)
color('red','pink')
begin_fill()
left(140)
forward(111.65)
curvemove()
left(123)
curvemove()
forward(111.65)
end_fill()
forward(10)
up()
goto(-21,80)
write("七夕快乐")
done()

猜你喜欢

转载自blog.csdn.net/weixin_42569562/article/details/81809902