"""
生成器:
什么是生成器?
一遍循环一遍计算的机制
列表的弊端:
# 耗时:
# 开销内存
生成器可以实现什么?
可以生成数据
如何创建生成器(生成器的用法)
1.g = (列表推导式)
2.一个函数中,包含yield关键字
如何使用生成器生成数据:
1.next(g)
2.g.__next__()
3.g.send(argv)
参数有要求:首次获取的时候,必须给None,非首次获取的时候,可以给任意参数
注意:
生成器生成数据只能从前往后,依次生成,如果超出范围,会导致StopIteration异常
生成器具备可迭代性(可以使用for循环直接遍历)
生成器的好处:
效率更高
更节约内存
弊端:
没有列表使用更方便
"""import time
import sys
# start_time = time.time()# # list1 = [x for x in range(1,10000001) if x % 2 == 0]# g = (x for x in range(1,11) if x % 2 == 0)#[2,4,6,8,10]# print(g)# end_time = time.time()# print(f'耗时:{end_time-start_time}秒')# # print(f'占用内存:{sys.getsizeof(list1)/1024}k')# print(f'占用内存:{sys.getsizeof(g)/1024}k')# print(next(g))# print(next(g))# print(next(g))# print(next(g))# print(next(g))# print(next(g))# for i in g:# print(i)deffunc1():for i inrange(10):# print(i)yield i
# yield 1
v = func1()print(v)# for i in v:# print(i)# print(next(v))# print(v.__next__())print(v.send(None))print(v.send(123))
"""
yield关键字作用:
暂停函数(记录所有状态)
yield 协程
多任务交替执行
g.send(None)
"""# def gen():# print('a')# count = yield 1# # print('--->',count)# # print('b')# yield 2# #注意打印结果# g = gen()# print(next(g))# # print(g.send('123'))# next(g)# for i in g:# print(i)import time
defget():whileTrue:print('爬数据')yielddefdeal():whileTrue:print('处理数据')yield
g1 = get()
g2 = deal()whileTrue:next(g1)next(g2)
time.sleep(0.5)
"""
2.封装一个类,可以通过for循环直接打印指定范围内的质数
class IntegerRange():
def __init__(self,start,end,step):
pass
def __iter__(self):
pass
例如:
for i in IntegerRange(2,20,1):
print(i)
可以依次打印出2,3,5,7,11...等全为质数的数字
"""classIntegerRange:def__init__(self,start,end,step=1):
self.start = start
self.end = end
self.step = step
defis_prime_number(self,n):for i inrange(2,n):if n % i ==0:returnFalsereturnTruedef__iter__(self):while self.start < self.end:if self.is_prime_number(self.start):yield self.start
self.start += self.step
r = IntegerRange(2,10)for i in r:print(i)"""
3.封装一个模拟下载函数,并使用装饰器完成下载函数耗时的统计
"""import random
import time
deffuncOut(func):deffuncIn(*args,**kwargs):
start_time = time.time()
v = func(*args,**kwargs)
end_time = time.time()print(f'完成功能{func.__name__} 耗时:{end_time-start_time}秒')return v
return funcIn
@funcOut
defdownload():for i inrange(1,11):
time.sleep(random.random())print(f'下载完成{i*10}%')
download()
"""
4.使用两种方式创建可以生成10以内所有偶数的生成器,并使用相应方式展示生成数据。
"""
g =(i for i inrange(1,11)if i %2==0)deffunc1():for i inrange(1,11):if i %2==0:yield i
# for i in g:# print(i)## g1 = func1()# print(next(g1))"""
5.小明通过美团外卖叫了一份xx商家的外卖,外卖小哥很快将外卖送到了小明手里,并求小明给五星好评
类图 (UML)
使用图例描述出类与类之间的关系
用户类
属性:
名字
地址
联系方式
行为:
点外卖(平台)
软件类App
属性:
平台名称
商家列表
行为:
下单(商家)
派单(骑手)
商家类
属性:
名称
菜单
行为:
接单()
骑手类
属性:
名字
电话
行为:
取餐(商家)
送餐(用户)
求好评(用户)
"""# 用户类classUser:def__init__(self,name,address,tel):
self.name = name
self.address = address
self.tel = tel
# 通过某个软件,点外卖deftake_out(self,app):# 选择一个商家print(f'{self.name} 通过{app.app_name} 在商家{app.merchant_list[0].name} 叫了一份外卖')# 调用软件的下单功能
app.place_order(app.merchant_list[0],self)# 平台类classApp:def__init__(self,app_name):
self.app_name = app_name
# 商家列表
self.merchant_list =[Merchant('北京饭店'),Merchant('建国饭店'),Merchant('国贸饭店')]# 平台为商家下单defplace_order(self,merchant,user):# 商家接单
merchant.get_order(self)# 创建骑手
rider = Rider('张三',123)
self.send_order(rider,merchant,user)# 平台为骑手派单defsend_order(self,rider,merchant,user):print(f'平台已派单给骑手:{rider.name}')# 骑手去取餐
rider.get_food(merchant,user)# 商家类classMerchant:def__init__(self,m_name):
self.name = m_name
self.menu_list =['xx1','xx2']# 商家接单defget_order(self,app):# print(f'商家{self.name} 已接收来自平台{app.app_name}的订餐')## # 骑手类classRider:def__init__(self,name,tel):
self.name = name
self.tel = tel
# 取餐defget_food(self,merchant,user):print(f'骑手{self.name} 前往商家{merchant.name} 取餐中')
self.send_food(user)# 送餐defsend_food(self,user):print(f'骑手{self.name} 为用户{user.name} 送餐中')# 求好评defplese(self,user):pass# user = User('小明','北京市西城区天门广场',110)# app = App('美团外卖')# user.take_out(app)
"""
IO操作
文件操作:
文件的分类:
广义:
狭义:
文件的作用:
数据持久化
传统文件的操作:
1.打开文件
2.读写操作
3.关闭文件
写:
课下查阅:
绝对路径
相对路径
将内存中的数据->文件
绝对路径:
E:\offcn\授课班级\9.基地系统0902班\Day14代码\demo01_知识回顾.py
相对路径:
demo02.py
f = open('demo02.py','打开方式','文件编码方式')
f.write('字符串内容')
读:
从文件中读取出来->内存
read(n)
读取指定长度n,如果不指定长度,默认读取所有
readline()
只读取一行
readines()
读取所有行,存储到列表中
# 循环录入一首诗,存储到文件中
"""# 将一首诗写入到文件中defpoem_write():# 打开文件
f =open('poem.txt','a',encoding='utf-8')for i inrange(1,5):
s =input(f'请输入第{i}句')# 将字符串s的内容写入到文件f中
f.write(s+'\n')else:# 关闭文件
f.close()# poem_write()defpoem_read():
f =open('poem.txt','r', encoding='utf-8')# s = f.read(5)# s = f.readline()
s = f.readlines()print(s)
f.close()
poem_read()
"""
文件的打开
mode: r w a
读写:
r+
w+
a+
操作图片,音频,视频...
rb
wb
文件的读写
read
readline
readlines
文件的关闭
f.close()
逐行读取文件的方式:
for s in f:
print(s)
-----------
s = f.readline()
while s != '':
print(s)
s = f.readline()
文件的复制:
1.读取目标文件中的数据
打开目标文件
读取所有内容
2.将读取到的数据写入新文件中 (注意新文件名的处理)
打开新文件
将读取到的内容写入到新文件中
关闭所有文件
def copyfile(oldfile):
pass
"""# f = open('poem.txt',mode='r',encoding='utf-8')# s = f.read(5)# print(s)# # 在之前读取结束的位置,继续读取# s = f.read(5)# print(s)# f.close()# 循环读取逐行读取某个文件中所有的内容
f =open('demo01_知识回顾.py','r',encoding='utf-8')# for s in f:# print(s,end='')# f.close()
s = f.readline()while s !='':print(s,end='')
s = f.readline()
f.close()