python学习笔记(十)——迭代器和生成器(外加import功能)

迭代器

百科:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

迭代器定义

所谓迭代器就是具有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
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值