一、可迭代对象
可迭代对象:
窄义来讲:能够通过for…… in这种方式,把元素一个个取出来的,这个对象叫可迭代对象。
lst = [1, 2, 3, 5]
for i in lst:
print(i)
广义来讲:对象实现了__iter__()方法 ,返回了一个迭代器对象 (iter())
- 可迭代对象:列表、元组、字典、字符串、集合
- 不可迭代对象:整数、浮点数、布尔值
2、判断对象是否可迭代 isinstance()
from collections.abc import Iterable # Iterable 可迭代对象
print(isinstance([1, 2], Iterable)) # True 列表是可迭代对象
print(isinstance((12,3),Iterable)) # True
print(isinstance({'name':'rose'},Iterable)) # True
二、迭代器
1、迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器:
iter() 和next() / __iter__() 和 __next__()
2、迭代器特性:
- 1、访问者不需要关心迭代器内部结构,只需不断执行next()方法获取下一个内容;
- 2、不能随机访问集合中的某个值,只能从头到尾顺序的读取;
- 3、访问到一半时不能回退,不能访问之前的值;
- 4、适合遍历很大的数据集合,节省内存,提升速度。
for i in 100:
print(i)
s = '100'
for i in '100':
print(i)
3、原理:
1.通过__iter__()方法可将迭代对象转化成一个迭代器对象(s.__iter__()) / iter(可迭代对象);
2.迭代对象.__next__()获取下一值 / next(迭代器)
3.循环步骤2,直到抛出StopIteration的异常,for循环会在捕捉异常后结束
验证for循环的工作原理
lst = [1, 2, 3, 4, 5] # 列表是可迭代对象
创建迭代器对象
it = iter(lst) # iterator 迭代器
print(it) #
# # 输出迭代器的下一个元素
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it)) # 元素取完后会报StopIteration
或
it = lst.__iter__() # iterator 迭代器
print(it) #
输出迭代器的下一个元素
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
4、可迭代对象和迭代器 —- 迭代器是可迭代对象
lst = [1,23,4]
s = iter(lst)
from collections.abc import Iterator,Iterable
print(isinstance(lst, Iterable)) # True lst是可迭代对象
print(isinstance(s, Iterator)) # True s是迭代器
print(isinstance(s, Iterable)) # True s是可迭代对象
案例
class Person:
def __init__(self):
self.n = 1
def funa(self):
self.n += 1
return self.n
p = Person()
print(p.funa())
print(p.funa())
print(p.funa())
print(p.funa())
from collections.abc import Iterator,Iterable
print(isinstance(p, Iterable)) # False
for i in p:
print(i) # TypeError: 'Person' object is not iterable
5迭代器 —拥有__iter__() 和 __next__()
from collections.abc import Iterator,Iterable
class Person:
def __iter__(self):
self.n = 1
return self
def __next__(self):
self.n += 1
return self.n
p = Person()
print(isinstance(p, Iterable)) # True
print(isinstance(p, Iterator)) # True
it = iter(p)
print(it)
print(next(it))
print(next(it))
print(next(it))
三、生成器
生成器是特定的迭代器
生成器用于”凭空”生成(yield)元素,它不会一次性将所有元素全部生成,而是按需一个个地生成。所以从头到尾都只需占用一个元素的内存空间。
yield 效果是使函数中断,并保存中断的状态
1.生成器函数
from collections.abc import Iterator,Iterable,Generator
def funa():
yield 1
f = funa()
print(next(f))
# print(next(f))
print(isinstance(f, Iterator)) # True
print(isinstance(f, Generator)) # True
2.如果在return后返回一个值,这个值是StopIteration异常的说明 ,而不是程序的返回值
def funa():
yield 1
return '哈哈,出现异常啦'
f = funa()
print(f) #
print(next(f))
print(next(f)) # StopIteration: 哈哈,出现异常啦
3.生成器函数的表达式
def funa(n):
for i in range(n):
yield i*5
f = funa(3)
print(next(f))
print(next(f))
print(next(f))
print(next(f))
4.多个yield
def funa():
yield 'a'
yield 'b'
f = funa()
print(next(f))
print(next(f))
print(next(f))
定义一个函数
处理文件,用户指定要查找的文件和内容
将文件中包含要查找内容的每一行都输出到屏幕
def funa(fname):
with open(fname, encoding='utf-8') as f :
print(f.read())
funa(r'C:Users运营Desktop小故事.txt')
5、按行读取
def funa(fname):
with open(fname, encoding='utf-8') as f:
for i in f:
print(i, end='') # i表示文件内容的某一行
funa(r'C:Users运营Desktop小故事.txt')
6、在每一行里,判断是否有指定关键字
def funa(fname, word):
with open(fname, encoding='utf-8') as f:
for i in f:
# print(i, end='') # i表示文件内容的某一行
if word in i: # 判断该行有这个关键字
print(i)
funa(r'C:Users运营Desktop小故事.txt', '兄弟')
7、改成生成器函数
def funa(fname, word):
with open(fname, encoding='utf-8') as f:
for i in f:
# print(i, end='') # i表示文件内容的某一行
if word in i: # 判断该行有这个关键字
yield i
a = funa(r'C:Users运营Desktop小故事.txt', '兄弟')
print(next(a))
print(next(a))
8、创建生成器
lst = [i*2 for i in range(3)]
print(lst,type(lst))
tt = (i*2 for i in range(3)) # 把中括号变成小括号 ,生成器
print(tt) # at 0x00000201CC054F90>
print(next(tt))
print(next(tt))
print(next(tt))
四、pip
- pip -V 版本
- pip install 包名/模块名
- pip install -U 包名
- pip uninstall 卸载包名
- pip freeze 安装包信息
- pip show 包名 显示详细信息
- pip install –upgrade pip pip自身更新
- pip –help 查看帮助信息