一、迭代器

    迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值。

    

 lst=[1,2,3,4,5]
count=0
while count<len(lst):
print(lst[count])
count +=1

    既然有for循环为什么还要用迭代器呢? 当然对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包

  含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引

  的迭代方式,这就是迭代器。

  可迭代对象:

   可迭代对象指的是内置有__iter__方法的对象,我们要如何查看内置是否有__iter__()方法呢?
  
 lst=[1,2,3]
print(dir(lst))

  在需要查看的对象前使用dir方法 就是来查看该对象内置的方法,如果其中含有__iter__,又含有__next__()方法那么该对象就是可迭代对象

  注:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象。

  

 lst=[1,2,3]
g = lst.__iter__()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) #当列表中不存在元素提供迭代则会抛出异常StopIteration,或者说结束标志

  我们怎么可以避免报错呢?

 lst=[1,2,3,4,5,6,7,]
g=lst.__iter__()
while True:
try:
print(g.__next__())
except StopIteration: #此处表示当遇到该提示时终止迭代
break

  迭代器的优缺点:

    (1)优点: 提供一个统一的,不依赖索引的迭代方式, 节省内存。

    (2)缺点: 惰性计算,只能往后走,不能往前退

二、生成器

  生成器本质上就是迭代器

  

 def func():
print(111)
return 222
print(func()) def func():
print(111)
yield 222
print(func())

  怎样判断生成器,只要函数内部包含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码

  

def func():
print("")
yield 222
gener = func() #这里是获取生成器,不会执行函数
print(gener.__next__()) #这个时候函数才会执行,yield和return一样都是用来返回数据

  

  生成器的特点和迭代器一样,取值方式和迭代器一样

    惰性机制,只能往后退,不能往前,优点是节约内存。取值方式也是用.__next__() 执行函数. 执行到下一个yield.

  生成器一般由生成器函数或者生成器表达式来构建

  

 def func():
print(1)
a=yield "a"
print(a)
print(2)
b=yield "b"
print(b)
yield "over"
g =func() #获取生成器
print(g.__next__()) #没有上一个yield 所以不能使用send() 开头必须是__next__()
print(g.send("中华")) # send()与next用法相同,还可以将值传给上一个yield
print(g.__next__()) #send()也不能用来当末尾 yield代表结束 seed没值可传

三、列表推导式

  列表推导式是用一行代码来构建你想要的列表。

  

 lst=["","","","","",]
for i in range(len(lst)):
print(i) # 传统方法获取列表的索引值 lst=[i for i in range(0,5)]
print(lst) #将想要的结果放入到列表中 dic={"name":"张三","sex":"男"}
dic = {k:v for k,v in dic.items()}
print(dic) # 字典的推导式与列表大同小异 gen = (i for i in range(1,4))
print(gen) # 这个就是生成器表达式,元组不存在推导式。

  生成器表达式与列表推导式的区别

    列表推导式比较消耗内存,一次性加载

    生成器表达式几乎不耗用内存,只有在用到的时候才会获取分配内存


 

python之迭代器、生成器及列表推导式的更多相关文章

  1. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  2. python基础(14):生成器、列表推导式

    1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...

  3. Python-02 生成器表达式,列表推导式

    列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for  变量i  in 可迭代的数据类型 ] 列表 ...

  4. Python的高级特性2:列表推导式,生成器与迭代器

    一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...

  5. 【python】 迭代器、生成器、列表推导式

    一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...

  6. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

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

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...

  8. python之生成器和列表推导式

    一.生成器函数 1.生成器 就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现). 2.构建生成器的两种方式 1,生成 ...

  9. Python_迭代器、生成器、列表推导式,生成器表达式

    1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...

随机推荐

  1. HtmlHelper介绍

    目录 什么是HtmlHelper? 为什么要使用HtmlHelper? 清爽简单 修改路由不用改连接 很早就知道这个了,但是我一直不用.今天看了看书,准备以后都使用这个 什么是HtmlHelper? ...

  2. [转]C++ STL中的Binary search(二分查找)

    链接地址:https://www.cnblogs.com/wkfvawl/p/9475939.html

  3. 【python基础】使用import导入相对路径的源文件

    前言 在编写python代码的过程中,不同路径下的源码文件该如何引用,这是个问题,本文针对这个问题介绍解决方法. 源码目录结构: . ├── conf.py ├── main.py ├── mod/ ...

  4. 【C/C++开发】C中调用C++函数

    C中如何调用C++函数? 前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下 ...

  5. 乐字节Java|封装JavaBean、继承与权限修饰

    本文继续讲Java封装.上一篇:乐字节Java|GC垃圾回收机制.package和import语句 这次讲述JavaBean.继承与权限修饰 一. 封装javaBean 封装(Encapsulatio ...

  6. LeetCode 141. 环形链表(Linked List Cycle) 19

    141. 环形链表 141. Linked List Cycle 题目描述 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 ...

  7. 修改Linux服务器中的MySql密码

    1.可以直接在数据库中修改,因为知道root密码,所以直接登录 mysql -uroot -p 2.查看一下数据库,修改root密码需要使用如下图所示的mysql数据库 3.通过use mysql指明 ...

  8. [转帖]ORM框架的前世今生

    ORM框架的前世今生 https://www.cnblogs.com/7tiny/p/9551754.html 目录 一.ORM简介二.ORM的工作原理三.ORM的优缺点四.常见的ORM框架 一.OR ...

  9. 《Mysql - 幻读》

    一:准备 - 为了深入了解幻读,准备数据. CREATE TABLE `t` ( `id` ) NOT NULL, `c` ) DEFAULT NULL, `d` ) DEFAULT NULL, PR ...

  10. linux服务器安装svn并上传项目

    一.安装svn (1)安装svn服务器: yum install subversion (2)查看版本(随自己意愿): svnserve --version 二.创建svn仓库并配置 (1)创建svn ...