迭代器是容器型数据类型
特点:无法通过打印迭代器查看元素,也无法统计个数
需要使用时候必须从迭代器中取出,并且取出以后元素从迭代器中消失
l1=iter('hello') #
l2=iter([1,3,5,7,9]) #
print(next(l1)) #h
print(next(l1)) #e
print(next(l1)) #l
for i in l2:
print(i)
生成器是一种容器,但是这个保存的不是多个数据,而是容器的算法
同时具有迭代器保存数据的特点
1,打印看不到内容
2,不支持len操作
3,元素取一个少一个
调用一个带有yield关键字的函数就可以得到一个生成器对象
只要有,就创建生成器对象,不管yield在哪里
生成器产生的个数和值,由执行函数体的时候遇到几次yield,以及每次遇到yield的值来决定
# def func2():
# yield 100
# yield 200
# yield 300
# print(list(func2())) #[100, 200, 300]
#练习:创建python学号的生成器,python001-python999学号
方法1
def xuehao(subject):
num = 0
while num<1000:
num+=1
yield f'{subject}{num:0>3}'
g5=xuehao('python')
print(next(g5))
print(next(g5))
print(list(g5))
方法2
def study_id(subject):
for x in range(1, 1000):
yield f'{subject}{x:0>3}'
g3 = study_id('python')
g4 = study_id('java')
print(next(g3))
print(next(g3))
print(next(g4))
print(next(g3))
print(next(g4))
调用函数创建生成器的时候不会执行函数体,在通过生成器对象获取生成器对象的时候才执行函数体
而且每次执行到yield就停止,并且记录停止的位置,下次再获取元素的时候从上次结束的时候开始
存在的问题:
1如果多个函数需要添加同样的功能,需要修改多个函数的代码,并且添加相同的代码
2如果想要取消添加的功能,又要重新修改多个函数
import time
def func1():
start=time.time()
print('hello world')
end=time.time()
print(f'执行时间{end-start}')
func1()
#2)使用装饰器
#写一个装饰器
def count_time(f):
def new_f(*args,**kwargs):
start=time.time()
result=f(*args,**kwargs)
end=time.time()
print(f'时间{end-start}')
return result
return new_f
#使用装饰器
@count_time
def func2(a,b):
# start=time.time()
print(a*b)
# end=time.time()
func2(10000,20000)
装饰器的套路
def 装饰器名(f):
def new_f(*args,**kwargs)
result=f(*args,**kwargs)
实现新增的功能
return
return new_f
让数据以表格的方式存储(更简单的表格文件)
1)方法1:读取文件内容得到一个迭代器,迭代器中的元素是每一行对应的列表
a:创建reader对象csv.reader(文件对象)-创建文件相应的reader,并且获取文件内容
f=open('2018年北京积分落户数据.csv',encoding='utf-8',newline='')
reader=csv.reader(f)
#b通过reader对象获取文件内容(本质是迭代器)
print(next(reader)) #['id', 'name', 'birthday', 'company', 'score']
print(next(reader)) #['1', '杨效丰', '1972-12', '北京利德华福电气技术有限公司', '122.59']
print(next(reader)) #['2', '纪丰伟', '1974-12', '北京航天数据股份有限公司', '121.25']
#2)方法2:得到文件内容得到一个迭代器,迭代器中的元素是每一行内容对应的字典
reader2=csv.DictReader(f)
for i in reader2:
print(dict(i))
2.csv文件的写操作
1,方法1-以列表为单位写入一行数据
#a.创建writer对象,csv.writer(文件对象)
#writer对象.writerow(列表)--一次写入一行数据
#writer对象.writerows(列表)--一次写入多行数据
f2=open('file/student.csv','w',encoding='utf-8',newline='')
writer1=csv.writer(f2)
writer1.writerow(['学号','姓名','年龄'])
writer1.writerows([['01','张三','18'],
['02','lisi','20']])
#2)方法2-以字典为单位写入一行数据
#a.创建DictWriter对象:csv.DictWriter(文件对象,字典键)
writer2=csv.DictWriter(
open('file/dogs.csv','w',encoding='utf-8',newline=''),
['狗名','年龄','品种','价格']
)
# b.将字典的键作为文件内容写入文件的第一行
writer2.writeheader()
# c.写入数据
# writer对象.writerow(字典) - 一次写入一行数据
# writer对象.writerows(元素是字典的列表) - 同时写入多行数据
writer2.writerow({'狗名': '旺财', '年龄': 3, '品种': '哈巴狗', '价格': 500})
writer2.writerows([
{'狗名': '猜猜', '年龄': 2, '品种': '哈士奇', '价格': 1500},
{'狗名': '土豆', '年龄': 1, '品种': '土狗', '价格': 50},
{'狗名': '妞妞', '年龄': 3, '品种': '金毛', '价格': 2500}
])