day19迭代器,生成器,装饰器和csv文件操作
一、迭代器
1.什么是迭代器(iter)
迭代器是容器型数据类型
特点:无法通过打印迭代器查看元素,也无法统计元素个数;
需要使用元素的时候,必须将元素从迭代器中取出,而且取出以后该元素就会从迭代器中消失
2.创建迭代器 —— 将其他序列转换成迭代器
i1 = iter('hello')
i2 = iter([10,20,30,40,50,60])
i3 = iter({'1':2,'2':3})
print(i1,type(i1))#<str_iterator object at 0x000001DE866C0C10> <class 'str_iterator
print(i2,type(i2))#<list_iterator object at 0x000001DE866C0B80> <class 'list_iterator'>
3.获取迭代器的元素
不管以什么方式取到了迭代器的元素,被获取到的元素一定会从迭代器中消失
1)获取单个元素next(迭代器)
i2 = iter([10,20,30,40,50,60])
print(next(i2))#10
print(next(i2))#20
print(next(i2))#30
print(next(i2))#40
print(next(i2))#50
print(next(i2))#60
print(next(i2)) #StopIteration 迭代器中的元素已经空了
2)遍历
i2 = iter([10,20,30,40,50,60])
for x in i2:
print(x)
print(list(i2))#[] 遍历完了之后在打印迭代器中的值,已经为空
二、生成器
1.什么是生成器
生成器是一种容器,但是这个保存的不是多个数据,而是产生(创建)多个数据的算法,同时具有迭代器保存数据的特点:
1)打印看不到内容
2)不支持len操作
3)元素也是取一个少一个,而且不能放回生成器中
注意:生成器获取元素和迭代器获取元素的方法一样
2.创建生成器
调用一个带用yield关键函数就可以得到一个生成器对象
注意:如果函数中有yield,那么调用这个函数不会执行函数体,也不会获取函数返回值,而是创建一个生成器对象
练习:创建学科学号的生成器,能产生从python001到python999的学号
def student_num():
for x in range(1, 1000):
yield f'python{x:0>3}'
print(list(student_num()))#['python001', 'python002', 'python003', 'python004'....]
3.控制生成器产生数据的个数和值
生成器产生数据的个数和值由执行函数体的时候会遇到几次yield,以及每次遇到yield的时候的值来决定
4.生成器创建数据的原理
调用函数创建生成器的时候不会执行函数体,在通过生成器对象获取生成器中的元素的时候才会执行函数,而且每次在执行函数体的时候只会执行到yield就停止,并且记录停止的位置,下次再获取元素的时候从上次结束的位置接着执行
三、装饰器
1.装饰器用来给函数添加功能
1)通过直接修改原函数的代码可以给函数添加功能
存在问题:a.如果多个函数需要添加同样的功能,需要修改多个函数代码,并且添加相同的代码
b 如果想要取消添加的功能,又要重新修改多个函数的函数
mport time
def func1():
start = time.time()
print("执行时间需要多久")
end = time.time()
print(f'执行时间:{end - start}')
2)使用装饰器
def count_time(f):
def new_f(*args, **kwargs):
start = time.time()
result = f(*args, **kwargs)
end = time.time()
return result
return new_f()
@count_time
def func1():
print("执行时间需要多久")
四、csv文件操作
csv文件(逗号分隔值文件) - 让数据以表格的方式存储(更简单的表格文件)
1.csv文件读操作
1)方法1: - 读文件内容得到一个迭代器,迭代器中的元素是每一行内容对应的列表
a.创建reader对象:csv.reader(文件对象) - 创建文件对应的reader,并且获取文件内容)
注意:打开csv文件的时候需要给参数newline赋值为空串
2)方法2 - 读文件内容得到一个迭代器,迭代器中的元素是每一行内容对应的字典(键是每一列的第一行数据)
b. 通过reader(本质是一个迭代器)对象获取文件内容
csv.DictReader(文件对象)
f = open('D:/Python2201数据分析/2018年北京积分落户数据.csv', encoding='utf-8', newline='')
read1 = csv.DictReader(f)
print(list(read1))#打印值是一个字典
2.csv文件写操作
1)方法1: - 以列表为单位写入一行数据
a 创建writer对象:csv.writer(文件对象)
writer对象.writerow(列表) - 一次写入一行数据
writer对象.writerows(元素是列表的列表) - 同时写入多行数据
writer1 = csv.writer(open('file/students.csv', 'w', encoding='utf-8', newline=''))
writer1.writerow([1, 'name', 'tel', 'score'])
writer1.writerow([2, '小明', '1234', '89'])
2)方法2:以字典为单位写入一行数据
a 创建DictWirter:csv.DictWirter(文件对象,字典的键)
b 将字典的键作为文件内容写入文件的第一行
c 写入数据:writer对象.writerow(列表) - 一次写入一行数据
writer对象.writerows(元素是列表的列表) - 同时写入多行数据