本节内容


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循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列的更多相关文章

  1. Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化

    一.装饰器 一.装饰器的知识储备 1.可变长参数  :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...

  2. 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式

    一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数  :*args和**kwargs def index(name,age): print(na ...

  3. Python开发——函数【迭代器、生成器、三元表达式、列表解析】

    递归和迭代 小明问路篇解释说明 递归:小明——>小红——>小于——>小东:小东——>小于——>小红——>小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...

  4. Python day14迭代器,三元表达式,列表解析以及生成器表达式

    1.迭代器 str=['sds','ccc','dw'] lit_1=str.__iter__()#获取迭代器 print(lit_1.__next__())#打印下一个值 # 用while做for的 ...

  5. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  6. python的迭代器、生成器、三元运算、列表解析、生成器表达式

    一 迭代的概念 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前 ...

  7. 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)

    一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...

  8. Python(迭代、三元表达式、列表生成、生成器、迭代器)

    迭代 什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). ...

  9. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

随机推荐

  1. 关于"net::ERR_CONNECTION_ABORTED"和"Firebug 达到了 Post 请求大小限制"的问题

    1.其中"net::ERR_CONNECTION_ABORTED"是在Chrome的控制台中打印出来的. 2."Firebug 达到了 Post 请求大小限制" ...

  2. 【一天一道LeetCode】#349. Intersection of Two Arrays

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  3. Aandroid TV 基于Leanback支持最新MD设计的TV开发框架

    原文地址:http://blog.csdn.net/sk719887916 作者:skay 基于6.0最新的API 支持TV的框架 Android 6.0已完美支持TV开发,之前的5.0后Recycl ...

  4. WebLogic11g-负载分发

    负载均衡的实现方式有很多种,这里只介绍三种相对来说成本较低的方案(维护成本以及费用成本)weblogic自带的proxy.apache.nginx  1.weblogic自带的proxy方式:  1) ...

  5. ledisdb:支持类redis接口的嵌入式nosql

    ledisdb现在可以支持嵌入式使用.你可以将其作为一个独立的lib(类似leveldb)直接嵌入到你自己的应用中去,而无需在启动单独的服务. ledisdb提供的API仍然类似redis接口.首先, ...

  6. 【unix网络编程第三版】阅读笔记(二):套接字编程简介

    unp第二章主要将了TCP和UDP的简介,这些在<TCP/IP详解>和<计算机网络>等书中有很多细致的讲解,可以参考本人的这篇博客[计算机网络 第五版]阅读笔记之五:运输层,这 ...

  7. XML文档操作之JAXP下实现

    JAXP是java API for xml PRocessing的缩写. 其API可以在javax.xml.parsers 这个包中找到.这个包向用户提供了两个最重要的工厂类,SAXParserFac ...

  8. Linux服务器Jboss运行环境搭建步骤和开机自动启动脚本编写运行

    Jboss运行环境:Linux+Jdk+Jboss+jsp系统 Jboss软件说明:类似于Tomcat,就是一个跑Jsp系统的环境,他的站点路径跟Tomcat类似,Tomcat存放站点文件到webap ...

  9. Android开发-Listview中显示不同的视图布局

    1. 使用场景 在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够 ...

  10. (NO.00003)iOS游戏简单的机器人投射游戏成形记(十)

    打开Arm.h,在其接口中添加一个新方法: -(void)armShoot; 接下来在Arm.m中实现该方法: -(void)armShoot{ CGPoint startPoint = [self ...