Python--day14(迭代器)
今日主要内容
1. 带参装饰器 (了了解)
2. 迭代器(*****)
可迭代对象
迭代器对象
for迭代器
枚举对象
1. 带参装饰器
1. 通常,装饰器为被装饰的函数添加新功能,需要外界的参数
outer参数固定就是一个,就是func
inner参数固定同被装饰的函数,也不能添加新参数
可以借助函数的嵌套定义,外层给内层传参
def wrap(info): # 装饰器的固定模板 def outer(func): def inner(*args,**kwargs): # 新功能 可能需要外界的参数 res = func(*args, **kwargs) # 新功能 可能需要外界的参数 return res return inner @wrap('外部参数')def fu():pass
2. 系统的wraps带参装饰器
本质上外界使用的韩式inner,但是打印显示的是wraps中的函数
from functools import wraps# 装饰器的固定模板 def outer(func): @wraps(func) def inner(*args,**kwargs): res = func(*args, **kwargs) return res return inner
2. 迭代器
2.1 迭代器
迭代器对象:可以不用依赖索引取值的容器
可迭代对象:可以通过某种方式得到迭代器对象
迭代器的优点:可以不用依赖于索引取值
迭代器的缺点:只能从前往后依次取值,不能指定位置取值,所以不能计算长度
2.2 可迭代对象
可迭代对象:有__iter__()方法的对象,可迭代对象调用__iter__()得到的是迭代器对象
ls = [1,2,3,4,5,6]res = ls.__iter__()print(res,list(res)) # <list_iterator object at 0x0000023CAE7A8240> [1, 2, 3, 4, 5, 6]
可迭代对象有哪些:str,list,tuple,dict,set,文件对象、range()、enumerate()、生成器对象
2.3 迭代器对象
迭代器对象:有__next__()方法的对象是迭代器对象,迭代器对象依赖__next__()方法进行取值.
1. 既内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值
2. 又有__iter__()方法的对象,执行迭代器__iter__()方法得到的仍然是迭代器本身
s = [1,2,3]res = s.__iter__()ls1 = res.__next__()print(ls1) # 1ls2 = res.__iter__()print(ls2 is res) # True
迭代器对象:enumerate() | file | 生成器对象
2.4 for循环迭代器
直接用while True循环在迭代器对象中通过__iter__()取值,终究会有取空的时候,取空再取值,会报StopIteriation异常
ls = [1,2,3,4,5]iter_ls = ls.__iter__()while True: try: print(iter_ls.__next__()) except StopIteration: print('取完了') break
for循环就是对while循环去迭代器对象的封装
for循环的工作原理:
for k in obj:pass
1. 先调用in后面那个对象的__iter__方法,得到一个迭代器对象
2. 迭代器调用__next__方法进行取值,将得到的返回值赋值给变量名k
3. 循环往复直到__next__取值,抛出异常,for会自动捕捉异常StopIteration然后结束循环
2.5 枚举对象
给可迭代对象及迭代器对象添加迭代索引
s = 'abc'for k in enumerate(s): print(k,end=' ') # (0, 'a') (1, 'b') (2, 'c')
dic = {'a': 1, 'b': 2, 'c': 3}obj = enumerate(dic)print(obj.__next__()) # (0, 'a')
dic = {'a': 1, 'b': 2, 'c': 3}for i,k_v in enumerate(dic.items()): k,v = k_v print(k_v,end='') # ('a', 1)('b', 2)('c', 3) print(i,k,v,end=' ') # 0 a 1 1 b 2 2 c 3
2.6 生成器
生成器:自定义的迭代器对象,就是用函数语法来声明生成器,用yield官架子取缔啊return关键字来返回值,参数没有多少变化
总结:有yield关键字的函数,函数名(),不是调用函数,而是生成得到生成器对象,生成器对象就是迭代器对象,可以通过__next__()进行取值
执行流程
def fn(): yield 1 yield 3 yield 5obj = fn()print(obj.__next__()) # 1 从开始往下执行,遇到第一个yield停止,拿到第一个yield的返回值print(obj.__next__()) # 3 从上一次停止的yield往下执行,在再遇到yield的地方停止,拿到当前yield的返回值print(obj.__next__()) # 5print(obj.__next__()) # StopIteration 以此类推,直到无法获得下一个yield,抛出StopIteration异常
# 案例一 创建生成器,从其取值,依次得到1! 2! 3! ... def jiecheng(): ji = 1 count = 1 while True: ji *= count yield ji count +=1obj = jiecheng()print(obj.__next__()) # 1print(obj.__next__()) # 2print(obj.__next__()) # 6print(obj.__next__()) # 24 可以无限取下去 # 案例二def jiecheng_num(num): ji = 1 for i in range(1,num+1): ji *= i yield jiobj = jiecheng_num(3)print(obj.__next__()) # 1print(obj.__next__()) # 2print(obj.__next__()) # 3print(obj.__next__()) # StopIteration # 案例三def my_range(num): count = 0 while count < num: yield count count +=1 for k in my_range(3): print(k,end=' ') # 0 1 2print(list(my_range(3))) # [0, 1, 2]print(tuple(my_range(3))) # (0, 1, 2)
Python--day14(迭代器)的更多相关文章
- Python day14迭代器,三元表达式,列表解析以及生成器表达式
1.迭代器 str=['sds','ccc','dw'] lit_1=str.__iter__()#获取迭代器 print(lit_1.__next__())#打印下一个值 # 用while做for的 ...
- python基础——迭代器
python基础——迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器 ...
- python基础—迭代器、生成器
python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...
- day14 迭代器 生成器 面向过程思想
"" 迭代器 什么是迭代器(iterator) 器指的某种工具, 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.1 再1.2 迭代的目的是要根据上一个结果,产 ...
- python之迭代器与生成器
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...
- Python:迭代器的简单理解
一.什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样).迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序 ...
- 第十六篇 Python之迭代器与生成器
一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...
- python——iterator迭代器|iterator详解——20140918|
-----------------------------------------------------------------------------前言--------------------- ...
- 搞清楚 Python 的迭代器、可迭代对象、生成器
很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...
- python函数-迭代器&生成器
python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...
随机推荐
- springcloud之hystrix熔断器-Finchley.SR2版
本篇和大家分享的是springcloud-hystrix熔断器,其主要功能是对某模块调用失败做断路和降级,简单点就当某个模块程序出问题了并达到某阈值就限制后面请求,并降级的方式提供一个默认返回数据.最 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史
---新内容开始--- 番外 大家周一好呀,又是元气满满的一个周一呀!感谢大家在周一这个着急改Bug的黄金时期,抽出时间来看我的博文哈哈哈,时间真快,已经到第十四篇博文了,也很顺顺(跌跌)利利 (撞撞 ...
- OAuth2实现单点登录SSO
1. 前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,“一看就会,一做就错”.网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那么回事儿,简直让人抓 ...
- GC参考手册 —— GC 算法(基础篇)
本章简要介绍GC的基本原理和相关技术, 下一章节再详细讲解GC算法的具体实现.各种垃圾收集器的实现细节虽然并不相同,但总体而言,垃圾收集器都专注于两件事情: 查找所有存活对象 抛弃其他的部分,即死对象 ...
- Python:说说字典和散列表,散列冲突的解决原理
散列表 Python 用散列表来实现 dict.散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组).在一般书中,散列表里的单元通常叫做表元(bucket).在 dict 的散列表当中,每个键 ...
- 机器学习之AdaBoost原理与代码实现
AdaBoost原理与代码实现 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-further-further/p/9642899.html 基本思路 ...
- SpringMVC+Mybatis 如何配置多个数据源并切换?
最近公司一个项目需要连接两个数据库(A和B)操作,有的模块查询A库,有的模块查询B库,因此需要改造下,项目后台用的是SpringMVC+Mybatis+MySQL架构,折腾了两天后终于搞定了,在这里记 ...
- 了解一下 - Base64
Base64编码是最常见的编码方式(使用64个字符表示任意8bit字节序列),是一种基于64个可打印字符来表示任意二进制数据的方法,是从二进制转换到可见字符的过程. 使用场景 数据加密后通过Base6 ...
- Flask实战第3天:url_for使用
我们之前是通过url来找到对应的视图函数 / => hello_world 那么url_for则是通过视图函数找到url hello world => / 演示如下 #c ...
- 重建程序员能力(3)-asp.net MVC框架增加Controller
MVC在微软中提供的框架目前只是发现是asp.net用.另 8年前,我做了个MVC的Windows APP框架如果有兴趣我日后会介绍给大家,欢迎大家关注.MVC的概念网站上有很多,大家去查阅一 ...