解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列
本节内容
1.迭代器协议与for循环
2.三元表达式
3.解压序列
4.列表解析
5.生成器
迭代器协议与for循环
1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中下一项,要么引起异常报错(因为迭代到头了,只能往后走不能倒退)
2.可迭代对象:实现了迭代器协议的对象(其实python中所有对象都不是可迭代对象,如何实现:对象内部定义一个__iter__方法)
3.协议就是一种约定,可迭代对象实现了迭代器协议,python内部工具(如for循环,sum,max等)使用迭代器协议访问对象。
i = [,,,]
a = i.__iter__() #将i变成可迭代对象
print(a.__next__()) #
print(a.__next__()) #
print(a.__next__()) #
print(a.__next__()) #
那么for 循环是怎么做的呢?
for循环做了两件事,第一件事就是把传入for循环对象使用__iter__方法,使其变成可迭代对象,之后每次使用都引用了__next__方法
第二件事就是:next到头,也就是迭代到头了会报错嘛,而for循环就自动为我们处理了报错
for a in i:
print(a)
注意:while循环的工作机制并不是迭代循环,而是索引循环,所以不能循环字典、集合、文件等迭代对象,使用for循环,还能节省内存因为遍历一个扔一个
三元表达式
l = ['鸡蛋%s' %i for i in range(10) if i>5 ]
print(l)
三元表达式其实就是简略式编程
name = 'ecohboy' a = '帅哥'if name == 'ecohboy' else 'sb'
print(a)
if 左边为若真的操作,中间是判断语句,右边为否则操作 但只适用于简单逻辑。
列表解析
l = ['鸡蛋%s' %i for i in range(10) if i>5 ]
print(l)
解压序列
l = [1,2,3,4,5,6,7]
a,*b,c = l
print(a,b,c)
解压序列就是一一对应取值,但用这种方法可以不通过索引也可以取到开头与结尾的值
生成器
生成器可以理解为一个数据类型,但他自动实现了迭代器协议(不用调用__iter__方法)所以生成器就是可迭代对象
1.生成器函数配合yeild(返回值)使用:
def test():
yield 1
yield 2
yield 3
yield 4 g = test()
print(g)
print(g.__next__()) #1
print(g.__next__()) #2
print(g.__next__()) #3
print(g.__next__()) #4
2.生成器表达式
laomuji = ('鸡蛋%s' %i for i in range(10))
print(laomuji.__next__()) #鸡蛋0
print(laomuji.__next__()) #鸡蛋1
print(laomuji.__next__())
print(laomuji.__next__())
生成器表达式实际就是把列表解析【】改成()
解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列的更多相关文章
- Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化
一.装饰器 一.装饰器的知识储备 1.可变长参数 :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...
- 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式
一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数 :*args和**kwargs def index(name,age): print(na ...
- Python开发——函数【迭代器、生成器、三元表达式、列表解析】
递归和迭代 小明问路篇解释说明 递归:小明——>小红——>小于——>小东:小东——>小于——>小红——>小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...
- Python day14迭代器,三元表达式,列表解析以及生成器表达式
1.迭代器 str=['sds','ccc','dw'] lit_1=str.__iter__()#获取迭代器 print(lit_1.__next__())#打印下一个值 # 用while做for的 ...
- Python中的可迭代对象/迭代器/For循环工作机制/生成器
本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...
- python的迭代器、生成器、三元运算、列表解析、生成器表达式
一 迭代的概念 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前 ...
- 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)
一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...
- Python(迭代、三元表达式、列表生成、生成器、迭代器)
迭代 什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). ...
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...
随机推荐
- 关于"net::ERR_CONNECTION_ABORTED"和"Firebug 达到了 Post 请求大小限制"的问题
1.其中"net::ERR_CONNECTION_ABORTED"是在Chrome的控制台中打印出来的. 2."Firebug 达到了 Post 请求大小限制" ...
- 【一天一道LeetCode】#349. Intersection of Two Arrays
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...
- Aandroid TV 基于Leanback支持最新MD设计的TV开发框架
原文地址:http://blog.csdn.net/sk719887916 作者:skay 基于6.0最新的API 支持TV的框架 Android 6.0已完美支持TV开发,之前的5.0后Recycl ...
- WebLogic11g-负载分发
负载均衡的实现方式有很多种,这里只介绍三种相对来说成本较低的方案(维护成本以及费用成本)weblogic自带的proxy.apache.nginx 1.weblogic自带的proxy方式: 1) ...
- ledisdb:支持类redis接口的嵌入式nosql
ledisdb现在可以支持嵌入式使用.你可以将其作为一个独立的lib(类似leveldb)直接嵌入到你自己的应用中去,而无需在启动单独的服务. ledisdb提供的API仍然类似redis接口.首先, ...
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
unp第二章主要将了TCP和UDP的简介,这些在<TCP/IP详解>和<计算机网络>等书中有很多细致的讲解,可以参考本人的这篇博客[计算机网络 第五版]阅读笔记之五:运输层,这 ...
- XML文档操作之JAXP下实现
JAXP是java API for xml PRocessing的缩写. 其API可以在javax.xml.parsers 这个包中找到.这个包向用户提供了两个最重要的工厂类,SAXParserFac ...
- Linux服务器Jboss运行环境搭建步骤和开机自动启动脚本编写运行
Jboss运行环境:Linux+Jdk+Jboss+jsp系统 Jboss软件说明:类似于Tomcat,就是一个跑Jsp系统的环境,他的站点路径跟Tomcat类似,Tomcat存放站点文件到webap ...
- Android开发-Listview中显示不同的视图布局
1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(十)
打开Arm.h,在其接口中添加一个新方法: -(void)armShoot; 接下来在Arm.m中实现该方法: -(void)armShoot{ CGPoint startPoint = [self ...