欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python学习笔记16

程序员文章站 2022-06-16 21:22:22
...

一、上堂回顾

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()

python学习笔记16