列表生成式

格式:通过一个或者若干个在List里边的for构建List而非List外部的for循环

举个例子:计算从1到10整数的平方构成一个List

L=[ x*x for x in range(1,11) ]

作用:①取代for循环+append快速生成一个List

②从已有的List中快速生成另一个List

补充:

1、for后可以跟 if,以达到筛选合适的元素而非全部元素以创建List

如:只取偶数

L=[ x*x for x in range(1,11) if not x%2]

注意:for后的if为筛选,不能跟else

for后的if会只筛选出符合条件的x用以构建List

for前可以跟if…else …,此时if…else…为表达式,不起筛选作用(即不会减少List中的元素个数)

L=[x if x%2 else -x for x in range(1,11)]
[1, -2, 3, -4, 5, -6, 7, -8, 9, -10]

相当于

for x in range(1,11):
if x % 2: #为偶数
x=x #不变
else:
x=-x

2、可以两个变量同时参与

L=[ m+n for m in 'abc' for n in 'xyz']
['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']

效果类似于两层循环,第一个for对应外层循环,第二个for对应内层循环

3、当然两个变量同时参与也可以不用两个for

例如对Dict的Key和Value的访问

1 D={'Mike':23,'Bob':19,'Jim':20}
2 L=[ m+':'+str(n) for m,n in D.items()]
3
4 L
5 ['Mike:23', 'Bob:19', 'Jim:20']

注意第二行,只有相同类型才能用加号+,所以要对整数类型n进行强制类型转换

这样的话,2和3看起来就和for循环区别很小了,只是把for循环的循环体放在了for循环前边

应用:

1、用简洁的语句列出当前目录下的所有文件名

import os
[D for D in os.listdir('.')] ['.idea', 'Fib.py', 'Hanoi.py', 'T1.py', 'venv']

os是模块方面的内容,以后会学到

2、将一个列表List中的所有字符串中的字符小写

方法:字符串的lower方法,str.lower(),如果是大写则是upper方法

注意,如果该List中既有字符串,又有其他类型,则需要for后if筛选

L=[ 'Abc' , 123 , 'MNO' ,True]
A=[s.lower() for s in L if isinstance(s,str)] A
['abc', 'mno']

生成器

意义:生成列表List过大时,为节省空间,不把List中的每个元素都保存下来,而是根据算法,需要时通过迭代计算出指定的值

Python这种边迭代边计算的机制叫做生成器(Generator)

创建:

①把列表生成式的中括号[ ]变为小括号( )即可

G=(x*x for x in range(1,11))

②通过函数创建,利用yield关键字

如果一个函数中包含了yield关键字,那它就不是一个普通的函数,而是一个Generator。

!!!普通函数是遇到return返回,而对于Generator,是在每次调用next()方法的时候执行,遇到yield语句返回,再次执行时,从上次返回的yield语句后一句继续执行。可以理解为,yield就是generator的return

举个例子:

def odd():
print ('step 1')
yield 1
print ('step 2')
yield 2
print ('step 3')
yield 3 o=odd()
next(o)
step 1
1 next(o)
step 2
2 next(o)
step 3
3

odd()是一个Generator,遇到next()才会执行,遇到yield就返回,每次执行都是从上次的yield处继续的。执行了3次next()后,已经没有yield了,所以再调用next()就会报错

访问元素

注意:不能通过下标 [ N ] 的方式访问generator的特定元素

①一个接一个打印

不断用next方法,python2.x中的方法是generator.next();python3.x中的方法是next(generator)

G=(x*x for x in range(1,11))

next(G)
1
next(G)
4
next(G)
9

无法next时,会抛出StopIteration错误

②for循环

Generator也是可迭代对象,可以通过for迭代

for i in G:
print (i) 16
25

100

由于之前已经next()了3次,所以无法从头输出,只能从第四次开始

需要注意的是,用for迭代对generator进行操作,相当于进行了相同次数的next(),因此可以继续next()的次数减少了

补充:要访问某个特定元素,需要先迭代一定次数,而无法直接访问,换言之,这个元素没有保存在内存中,而是实时计算得到的

实例

Fibonacci数列:

def Fib2(num):
n=1;a=0;b=1;
while n<num:
print (b)
s=a
a=b
b+=s
n+=1
return

Fib数列可以根据初始两个值,推算出后续任意值,这与Generator十分相似,如果我们指明是对哪个变量运用了推算规则,我们就可以把这个函数变为Generator

方法是,将print改为yield,这意味着,我们用yield标识了这个根据算法推算出来的变量b,则这个变量就是构成Generator的那个变量(这里说法不严谨,但一时找不出更适合的词语)

如果一个函数变为了Generator,我们便可以通过for循环访问其中的元素;next()也可以,但不如for简洁

for i in Fib2(6):
print (i) 1
1
2
3
5

补充:Generator函数可以用一个变量承接,如

F=Fib2(6)

这样可以更直观地看出来是Generator而非普通的函数

另外,普通函数调用返回值是一个确定的值,Generator返回的是一个Generator

迭代器

可迭代对象(Iterable):可以直接用于for循环的数据类型;

两种:

1、集合类数据——Dict List Tuple Str

2、迭代器Iterator

迭代器(Iterator):可以被next( )函数调用,并不断返回下一个值的对象,直到最后抛出StopIteration错误表示无法继续返回下一个值

举例:Generator(两种:1、生成器 2、带yield的Generator函数)

可以用isinstance函数判断某数据是否为Iterable或者Iterator

#这里的A表变量,不表字母A
isinstance(A , Iterable) isinstance(A , Iterator)

检查前应先从collections库中导入Iterator类

from collections.abc import Iterator

将Iterable转化为Iterator:iter()函数

from collections.abc import Iterator

isinstance(iter([]),Iterator)
True

Python对于Iterator的处理——当做一个数据流,只能通过next()不断返回下一个数据,它是一个惰性数列——不存储所有值,而是需要时才计算出想要的值。

Python中for循环的实质是将Iterable转化为Iterator,再通过不断的next()实现的

for x in [1,2,3,4,5]:
pass #等价于 it=iter( [ 1,2,3,4,5 ] )
while True:
try:
x=next( it )
except StopIteration :
break

列表生成式 生成器 迭代器 yield的更多相关文章

  1. Python之旅Day5 列表生成式 生成器 迭代器 装饰器

    装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...

  2. python协程函数应用 列表生成式 生成器表达式

    协程函数应用 列表生成式 生成器表达式   一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...

  3. python 基础 4.4 生成式 生成器 迭代器

    一.生成式和生成器   列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.   #/usr/bin/python #coding=u ...

  4. 列表生成式,迭代器&生成器

    python3中range(10)就 是迭代器 列表生成式 #列表生成式 a=[0,1,2,3,4,5] b=[] for index,i in enumerate(a): a[index]+1 pr ...

  5. Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器

    本节内容: 1.深浅拷贝 2.三目运算 3.迭代器和生成器 4.装饰器 1.深浅拷贝 拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需 ...

  6. s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

    python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...

  7. Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式

    一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...

  8. python 基础 列表生成式 生成器

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  9. Python学习 Day 4 函数 切片 迭代 列表生成式 生成器

    定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...

随机推荐

  1. redis一主两从搭建

    一主两从搭建: 主配: daemonize yes port 6379 logfile ./redis6379.log dir ./ bind 10.131.156.170 从1配: daemoniz ...

  2. 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进

    项目代码可以从Github下载:https://github.com/zhenl/ZL.Shudu .代码随项目进度更新. 前面我们使用一个数组保存预制的游戏,然后随机从中抽取一个游戏作为新游戏,如果 ...

  3. 业务4P分析实践

    原创不易,求分享.求一键三连 前言 假期继续思考BI未来的方向,其实常规的BI规划也不是不能出,比如公司BI看板建设.数据指标体系建设.业务线UE模型数据监控等,但这种不会超出预期的东西自然也能算技术 ...

  4. CF1574F Occurrences

    考虑什么样的串是合法的. 直接考虑比较抽象,考虑具象化这个问题. 容易发现一个字符串的限制就相当于如果出现了其中一个字符 \(a_i = c\),那么 \(s\) 中 \(c\) 前 \(i - 1\ ...

  5. jdk、jre、javase、javaee、javame的区别

    Jdk定义 JAVA的开发工具包,包含jre,可以进行编译和运行Java程序. Jre定义 JAVA的运行环境,如果不需要进行编译程序,则可只安装jre. Javase定义 标准版Java SE(Ja ...

  6. 支付宝同步请求检查appid,以及公钥,私钥是否正确

    第一步:下载支付宝Demo 下载地址:https://opendocs.alipay.com/open/270/106291#%E8%BF%90%E8%A1%8C%E8%AF%B4%E6%98%8E ...

  7. 分布式系统及CAP理论

    一.集中式系统 在学习分布式之前,先了解一下与之相对应的集中式系统是什么样的. 集中式系统用一句话概括就是:一个主机带多个终端.终端没有数据处理能力,仅负责数据的录入和输出.而运算.存储等全部在主机上 ...

  8. js trim()方法

    从字符串中移除前导空格.尾随空格和行终止符. 语法 stringObj.trim() 参数 stringObj 必选.String 对象或字符串.trim 方法不修改该字符串. 返回值 已移除前导空格 ...

  9. web虚拟主机、日志分割以及日志分析

    目录 一.构建虚拟web主机 1.1 概述 1.2 支持的虚拟主机类型 1.3 部署虚拟主机步骤 1.3.1 基于域名的虚拟主机 (1)为虚拟主机提供域名解析 (2)为虚拟主机准备网页文档 (3)添加 ...

  10. VMware15.5虚拟机安装及LInux系统安装前 准备工作

    VMware15.5虚拟机安装及Linux系统安装前 准备工作 一.vmware15.5安装 1.安装环境准备 1.vmware15.5版本和秘钥(版本资源和密钥小白已经上传到资源文档里面,要想下载可 ...