迭代器
百科:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
迭代器定义:
所谓迭代器就是具有next方法的对象,在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。
迭代器书写格式:
从可迭代对象生成一个迭代器
迭代器=iter(可迭代对象)
下个值=next(迭代器)
示例:
li = [1,2,3,4,5,6]
a = iter(li)
print(a)
print(next(a)) # 单次取一个
执行结果:1
注意:next()只能用一次;如果用循环取,不用管下标,只能依次取值,取完之后会抛出异常,迭代完毕(next(a) == a.next())
示例:
li = [1,2,3]
itr = iter(li)
try:
while True:
b = next(itr)
print(b)
except StopIteration:
print('error!!!')
执行结果:
1
2
3
error!!!
for和while也都可以实现迭代过程,比如:
for i in range(100): # 依次拿东西 这就是迭代的过程
print(i)
===========================================================
li = [1,2,3,4,5,6]
index = 0
while index < len(li): # 也能实现迭代过程
print(li[index])
index +=1
那么问题来了,可迭代对象与迭代器有什么区别 ?
当一个对象有__iter__ next 两个魔法方法 ,就叫做迭代器。如果没有 next 只有iter 就叫做迭代对象。
可迭代对象一定有: __ iter __
迭代器有: __ iter __ , __ next __
生成器
生成器也叫简单生成器,生成器可以帮助读者写出非常优雅的代码,当然,编写任何程序时不使用生成器也是可以的。
创建一个生成器就像创建函数一样简单,
示例(显式的暂停与恢复,next控制):
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
yield 6
a = func()
print(a)
print(next(a)) #通过next激活yield的运行
执行结果:
1
注意:①遇到yield 就会返回出来,后面的代码没有被执行, 它会暂停, 再运行next 恢复代码会继续往下执行。②生成器在不运行它时,只是一串代码,表达式而已。③一个next只能激活一个yield。
隐式的支持迭代协议
实例 1:
#斐波那锲数列:数列当中每一个值都等于前面两个数相加的值
def fibo(n):
i,a,b = 0,1,1
while i<n:
yield a
a,b = b,a+b
i += 1
d = fibo(5)
for i in d:
print(i,end=' ')
执行结果:
1 1 2 3 5
实例 2:
def func():
print('我执行1')
yield 1
print('我执行2')
yield 2
print('我执行3')
yield 3
a = func()
print(next(a)) #不写会发生什么呢? 不写的结果就是print都不会被打印
执行结果:
我执行1
补充:递归生成器
上面创建的生成器只能处理两层嵌套,为了处理嵌套使用了两个for循环,如果要处理任意层的嵌套呢?例如,可以每层嵌套需要增加一个for循环,但不知道有几层嵌套,所以必须把解决方案变得更灵活,现在可以用递归来解决。
def fla(aa):
try:
for bb in aa:
for cc in fla(bb):
yield cc
except TypeError:
yield aa
li = list(fla([[[1],2],3,4,[5,[6,7]],8])) #注意括号层次比较多
print(li)
执行结果:
[1, 2, 3, 4, 5, 6, 7, 8]
总结:生成器和普通函数有什么区别和联系?
- 相同点:
- 定义格式相同,都是使用def语句
- 二者都可以有return语句,也可以没有
- 函数体格式相同
- 不同点:
- 生成器函数中主要使用yield返回数据,而函数主要使用return返回数据
- 二者返回值不同,函数可以根据需要返回任何类型;生成器函数执行返回的是一个生成器
- 函数要调用会执行代码,生成器不会,等待next激活运行代码
包跟包管理
什么是包?
包体现了模块的结构化管理思想,包由模块文件构成,将众多具有相关功能的模块文件结构化组合形成包。
什么是模块?
模块是一种以.py为后缀的文件,在.py文件中定义了一些常量和函数。模块的名称是该.py文件的名称。
什么是库?
Python中的库是借用其他编程语言的概念,没有特别具体的定义,Python库着重强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。模块有诸多函数组成,包由诸多模块机构化组成,库中也可以包含包、模块和函数。
import功能:
import datetime #导入整个模块
from datetime import datetime # 部分导入 导入部分包
from datetime import * # 所有的模块
import datetime as dt # 取别名
# 没有去别名:datetime.now() #取别名后 使用(例):dt.now()
import time,deatetime # 导入多个包
同级导包
import 文件名
# 文件夹要有__init__.py
python 内置的包都是这么导入的
if __name__ == '__main__':
print(__name__)
__name__ 自身调用就用__main__
别人调用不了,就会变成包的名字,不会执行__main__
pip — python必备的包管理:
基本使用:
pip -V # 版本
pip list #本地安装包
pip install [package_name] # 包安装
#包更新
pip install -U [package_name]
#包卸载
pip uninstall [package_name]
#包检索(服务器端)
pip search [package_keyword]
#输出安装包的详细信息
pip freeze
#显示本地安装包的详细信息
pip show [package_name]
#pip自身更新
pip install --upgrade pip
#帮助信息
pip--help