Python的容器、生成器、迭代器、可迭代对象的家谱
前言
之前虽然写Python,但是对Python的这些概念也是模模糊糊,知道有一天,看到了一篇文章,讲的透彻,所以就写这篇作为对于这篇高文的读书笔记吧
致谢,该文作者,完全理解Python迭代对象、迭代器、生成器
总论
总论:可迭代对象概念最大,包含迭代器和大部分容器,以及例如files、sockets等可以迭代的对象。
容器:
list、dequeue、set、dict、Counter、tuple、str等等,注意Bloom filter容器不能迭代,所以不是所有容器都可以迭代的。
迭代器:
概念比较复杂,基本上就是实现了__iter__()和__next__()两个方法的对象,当没有下一个元素的时候跑出StopIteration异常。
所以所有的生成器都是迭代器,这里的生成器包括生成器推导式,和生成器函数。
生成器:
特殊又优雅的迭代器,函数体没有return内容(实际上,在循环中return 本身类似于break的功能,但是不能 return xxx);
可以节省CPU和内存。
生成器表达式:
与列表推导式的差别
[x for x in y if x > z] -> 列表推导式
(x for x in y if x > z) -> 生成器表达式
然后我们来重点学习一下生成器吧:
生成器
yield 来代替return 临时转移程序控制权,yield 暂时把当下的值返回给编程者,但是保留了函数运行状态,而不是像return 那样直接结束了自身函数的调用。
例如我们来处理一个大文件
def readBigFile(filename):
with open(filename,"r") as fread:
while True:
try:
line = fread.readline()
except Exception(reason):
raise
if line != "" and line != None:
yield line
else:
break
Python的容器、生成器、迭代器、可迭代对象的家谱的更多相关文章
- Python 生成器, 迭代器, 可迭代对象的区别
1.可迭代对象 在python中, 一切皆对象, 但凡是可以用for循环进行遍历取值的对象都可以称之为可迭代对象, 可迭代对象在程序的一个执行周期中,可以无限轮次的进行循环遍历 2.迭代器 a.一个可 ...
- Python生成器,迭代器,可迭代对象
在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict ...
- Python之列表生成式、生成器、可迭代对象与迭代器
本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法 ...
- 【转】Python之列表生成式、生成器、可迭代对象与迭代器
[转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...
- 理解迭代器,生成器,yield,可迭代对象
原文:https://foofish.net/iterators-vs-generators.html 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Gen ...
- Python——迭代器&可迭代对象
可迭代对象 什么是对象: Python中,一切皆对象.一个变量,一个列表,一个字符串,文件句柄,函数等等都可称为一个对象.一个对象就是一个实例,就是实实在在的东西. 什么是迭代 迭代就是一个重复的过程 ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- python14 1.带参装饰器 | wrapper 了了解 # 2.迭代器 ***** # 可迭代对象 # 迭代器对象 # for迭代器 # 枚举对象
## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 ...
随机推荐
- TensorFlow-GPU:查看电脑显卡型号是否支持CUDN,以及相关软件下载与介绍
1.显卡(GPU)是否支持CUDN https://developer.nvidia.com/cuda-gpus 2.了解基础知识 1)CUDA(Compute Unified Device Arch ...
- spring mvc实现自定义注解
实现方式:使用@Aspect实现: 1. 新建注解接口:CheckSign package com.soeasy.web.utils; import org.springframework.core. ...
- 安卓开发笔记——Gallery组件+ImageSwitcher组件
什么是Gallery? Gallery是一个水平的列表选择框,它允许用户通过拖动来查看上一个.下一个列表选项. 下图是今天要实现的最终效果: 利用Gallery组件实现的一个横向显示图像列表,可以通过 ...
- java程序员如何编写更好的单元测试的7个技巧
详解 cppunit进行单元测试 单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确.通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函 ...
- CDbConnection failed to open the DB connection: could not find driver错误的处理
在PHP.INI文件中extension=php_pdo_mysql.dll 去掉注释
- IFrame实现页面无刷新
一.html 和s代码段 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- Vim 操作符命令和动作命令
http://www.cnblogs.com/littlerabbit/articles/2349951.html
- Maven------报错:Error resolving version for plugin
配置Maven插件时报错:Error resolving version for plugin 'org.springframeboot.boot:spring-boot-maven-plugin' ...
- Java实现非法访问异常
创建ExceptionTest类,在该类的main()方法中,使用反射获得String类的所有域,不要使用setAccessible方法修改这些域的可见性,然后通过反射获得私有域中与”hash”相匹配 ...
- Visual Studio 添加SVN插件
这两天为了开发一个移动混合式的框架,被迫去学习去使用VisualStudio,这玩意当年离开校园就再也没用过了,再次看到感觉还是很眼熟...,这篇文件就简单说明下VS下怎么安装SVN插件吧: 1 首先 ...