python学习10—迭代器、三元表达式与生成器

1. 迭代器协议

定义:对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往后走不能往前退)

2. 可迭代对象

实现了迭代器协议的对象,对象内部定义一个__iter__()方法

3. for循环实现机制

  字符串、列表,元组,字典,集合,文件等都不具有next方法,所以他们都不是可迭代对象(iterable object),但是为什么for循环可以进行呢?

  原因:for循环首先调用了他们的内置方法__iter()__方法将其转换为可迭代对象,然后再调用这个转换后的可迭代对象的__next()__方法,进行迭代。

l = [1,2,3]
# iterable object
iter_l = l.__iter__()
print(iter_l.__next__())

  字符串、列表、元组为有序序列,也可以通过索引取值,但是字典、集合、文件等非序列类型,不可以通过索引取值,所以出现了for循环,一个基于迭代器协议的统一的遍历方式。

4. 使用while循环实现for循环机制

l = [1,2,3]
detail_l=l.__iter__()
while True:
try:
print(detail_l.__next__())
except StopIteration:
print('end of iteration')
break

5. next()函数

python内置函数next()调用对象的__next()__方法,实现机制与__next()__相同。

l = [1,2,3,5,6]

l_iter = l.__iter__()

print(l_iter.__next__())  #两行print()代码效果相同

print(next(l_iter))

6. 三元表达式

  如下代码,如果name == 'b'则返回a,如果name不等于'b'则返回c。

name = 'b'
result = 'a' if name == 'b' else 'c'

  相当于c++中的条件运算符(三目运算符)“?:”,都是对一个条件进行判断,满足条件与否分别返回一个值。

#include<iostream>
using namespace std;
int main()
{
int a = ;
int b = ;
int c = a>b ? a : b;
return ;
}

7. 列表解析

  利用三元表达式可以进行列表解析。

egg = ['egg %s' %i for i in range(10) if i > 2]

  返回:

>>> ['egg 3', 'egg 4', 'egg 5', 'egg 6', 'egg 7', 'egg 8', 'egg 9']

8. 生成器

  生成器作为一种数据类型,自动实现了迭代器协议,即可以直接调用生成器的__next__()方法,生成器就是可迭代对象。

8.1 生成器函数

  生成器函数使用yield代替return,且可返回多个值,每次调用返回一个值。

def f():
yield 1
yield 2
yield 3
yield 4
yield 5 iter_f = f()
print(iter_f.__next__())
print(iter_f.__next__())
print(iter_f.__next__())

8.2 生成器表达式

  将列表解析的[]替换为()即可获得生成器表达式。

egger = ('egg %s' %i for i in range(10) if i > 2)

print(egger)
print(egger.__next__())
print(egger.__next__())
print(egger.__next__())

  很多python内置函数如sum(),map(),reduce(),filter()等都是遵循迭代器协议的,故可利用生成器进行一些高级的操作。

sum(x**2 for x in range(10))

  注意:生成器只能遍历一次,遍历之后,生成器被释放。

python学习10—迭代器、三元表达式与生成器的更多相关文章

  1. python之旅:三元表达式、列表推导式、生成器表达式、函数递归、匿名函数、内置函数

    三元表达式 #以下是比较大小,并返回值 def max2(x,y): if x > y: return x else: return y res=max2(10,11) print(res) # ...

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

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

  3. python学习-38迭代器和生成器

    迭代器和生成器 ---- 迭代器协议和for循环工作机制 1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往 ...

  4. Python学习 :迭代器&生成器

    列表生成式 列表生成式的操作顺序: 1.先依次来读取元素 for x 2.对元素进行操作 x*x 3.赋予变量 Eg.列表生成式方式一 a = [x*x for x in range(10)] pri ...

  5. python学习日记(迭代器、生成器)-乱七八糟

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

  6. Python学习之迭代器和生成器

    那么首先什么是迭代器和生成器呢? 迭代器即迭代的工具,那么什么又是迭代呢?所谓迭代:迭代是一个重复的过程,每次重读即一次迭代,并且每次迭代的结果都是下一次迭代的初始值.例: l=[1,2,3] cou ...

  7. python:列表生成式和三元表达式、匿名函数

    一.列表生成式 1.列表生成式就是python内置的一种用来生成list的生成式. 比如下面这个例子: l=[] for i in range(10) list.append(i) 生成一个列表要用循 ...

  8. day19-1 迭代器,三元表达式,列表推导式,字典生成式,

    目录 迭代器 可迭代对象 迭代器对象 总结 三元表达式(三目表达式) 列表推导式 字典生成式 迭代器 可迭代对象 拥有iter方法的对象就是可迭代对象 # 以下都是可迭代的对象 st = '123'. ...

  9. python学习道路(day5note)(列表生成式,生成器,装饰器,常用模块)

    生成列表的方式 data = [1,2,3]  需求   每个数字加上1 # data = ( x*2 for x in range(5)) print(data)   列表生成式 后面的I赋予加1操 ...

随机推荐

  1. PHP代码审计基础

    php核心配置 php.ini 基本配置 语法 大小写敏感 运算符 空值的表达式 安全模式 安全模式 safe_mode = off 用来限制文档的存取,限制环境变量的存取,控制外部程序的执行.PHP ...

  2. Django框架(二十七)—— ContentType组件

    目录 ContentType组件 一.什么是ContentType组件 二.使用ContentType 三.使用场景总结 ContentType组件 一.什么是ContentType组件 conten ...

  3. Django框架(二十六)—— Django rest_framework-分页器与版本控制

    目录 分页器与版本控制 一.三种分页器 二.分页器 1.普通分页(PageNumberPagination) 2.偏移分页(LimitOffsetPagination) 3.加密分页(CursorPa ...

  4. mysql 5.7.20 取得动态sql执行结果

    drop procedure test; delimiter ;; CREATE procedure test() -- 取动态sql的值 begin ); ); set v_sqlcounts = ...

  5. springboot多数据库及分布式事务配置

    1.导入相应的jar包依赖 <!-- 集成mybatis --> <dependency> <groupId>org.mybatis.spring.boot< ...

  6. Vue.js文档学习

    Vue细碎小点 生命周期钩子:created().mounted().updated().destroyed() 不要在选项属性或回调上使用箭头函数,比如 created: () => cons ...

  7. Linux设置chrome缓存至内存,及开关机同步

    默认chrome缓存位置在~/.cache/google-chrome中,磁盘io很多.为减少磁盘io,保护磁盘同时加快chrome速度,可设置缓存使用内存盘,缺点是重启后缓存丢失,所以这里可以使用脚 ...

  8. rabbitMQ 问题

    1.有时候在学习或者测试的时候,发现我在一个EXCHANGE  上面绑定了多个通道,这些通道的ROUTING_KEY 各不相同.但是从发送端 发到EXCHANGE 时,却在别的通道上面也收到了该消息, ...

  9. vue 学习六 在组件上使用v-model

    其实这个部分应该是属于component,为什么把这玩意单独拿出来呢,原因是它这个东西比较涉及到了vue的事件,以及v-model指令的使用,还是比较综合的.所以就拿出来啦 父组件 <templ ...

  10. 73. PrintStream(打印流)

    PrintStream(打印流)   打印流可以打印任意类型的数据,而且打印前都会把数据转换成字符串再进行打印(就是把数据存入硬盘中) 编码与解码图例:下面我们来看看一个简单的字节输出流 public ...