python迭代器、生成器及三元表达式

(1)迭代器协议

字符串、元组、列表、字典、集合、文件对象这些都不是可迭代对象,只不过在for循环中,调用了他们内部的__iter__方法,把他们变成了可迭代对象

然后for循环调用可迭代对象的的__next__方法去取值,而且for循环会捕捉StopIateration异常,以终止迭代

x=‘hello’for i in x:
    print(i)

for循环相当于:

x=‘hello‘
iter_test=x.__iter__()
print(iter_test)
print(iter_test.__next__())

相当于:

x=‘hello‘iter_1=x.__iter__()print(next(iter_1))

遵循迭代器协议的对象叫做可迭代对象,即iter_1是一个可迭代对象;next()函数:就是在调用iter_l.__next__()

(2)生成器

生成器就是一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__inter__()方法),生成器就是可迭代对象

生成器函数:使用yield语句而不是return语句返回结果

(3)三元表达式:

条件成立时的返回值(可做函数处理)   条件   条件不成立时的返回值(可做函数处理)

name=‘wangqiang‘
# name=‘quyao‘
res=‘男生‘ if name == ‘wangqiang‘ else ‘nvsheng‘
print(res)

三元表达式可以只有两元,但不能是四元及其以上

(4)列表解析

egg_list=[]
for i in range(10):
    egg_list.append(‘鸡蛋%s‘ %i)
print(egg_list)

输出结果为:[‘鸡蛋0‘, ‘鸡蛋1‘, ‘鸡蛋2‘, ‘鸡蛋3‘, ‘鸡蛋4‘, ‘鸡蛋5‘, ‘鸡蛋6‘, ‘鸡蛋7‘, ‘鸡蛋8‘, ‘鸡蛋9‘]

用列表解析的方法:

l=[‘鸡蛋%s‘ %i for i in range(10)]
print(l)

列表解析的缺点是,生成的列表是放在内存中,处理数据较大时占内存空间较大

LMJ=(‘鸡蛋%s‘ %i for i in range(10)) #生成器表达式
print(LMJ)
print(LMJ.__next__())
print(LMJ.__next__())
print(next(LMJ))

其中将列表[‘鸡蛋%s‘ %i for i in range(10)]转换成生成器表达式即LMJ=(‘鸡蛋%s‘ %i for i in range(10)),本身变成一个可迭代对象,next(LMJ)和LMJ.__next__()实现的功能相同

总结:

1.把列表解析的[]换成()得到的就是生成器表达式

2.列表解析和生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

(5)深浅拷贝

==>浅copy:只copy第一层,列表,字典类型copy内容改变,原内容也会改变

a=[[1,2],3,4]
b=a[:]  #相当于b=a.copy()
b[1]=‘alex‘
print(b)
print(a)

运行结果为:

[[1, 2], ‘alex‘, 4]
[[1, 2], 3, 4]

拷贝和修改的过程如下:

此时由于a[1]的地址指针没有修改,故列表a不发生变化

a=[[1,2],3,4]
b=a[:]  #相当于b=a.copy()
b[0][0]=8
print(b)
print(a)

运行结果为:

[[8, 2], 3, 4]
[[8, 2], 3, 4]

拷贝和修改的过程如下:

此时,列表a中第一个元素的第一位的地址指针发生改变,故列表a和列表b同时发生变化

==>深copy:克隆一份(需要单独的一个模块来进行,这个模块叫做copy)

import copy
a=[[1,2],3,4]
b=copy.deepcopy(a)
b[0][0]=8
print(b)
print(a)

运行结果为:

[[8, 2], 3, 4]
[[1, 2], 3, 4]

此时,列表a不会发生变化

原文地址:https://www.cnblogs.com/quyao/p/9656538.html

时间: 2024-11-10 16:04:46

python迭代器、生成器及三元表达式的相关文章

Python基础----生成器、三元表达式、列表生成式、生成器表达式

Python开发基础-Day9-生成器.三元表达式.列表生成式.生成器表达式 生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 print('second----->') yield 2 print('third----->') yield 3 print('fouth----->') g=foo() from collections impor

python学习笔记第九节(迭代器,生成器,三元表达式)

for循环相当于自动调动__iter__ for循环相当于上面这样每次__next__再打印一次 while循环的迭代方式,采用try的方式 判断是否为可迭代 判断是否为迭代器对象 加了蓝色段,可以调用原来的函数名 迭代对象 可以__iter__的迭代器 将__iter__之后的结果的迭代器对象 可以直接__next__的 生成器 迭代到yield后停止,相当于__next__函数加上yield后就是迭代器.可以每次__next__显示,每次显示到yield后停止,相当于return,但是下次_

Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式

什么是生成器:只要函数内部包含有yield关键字,那么函数名()的到的结果(生成器地址)就是生成器,再调用函数不会执行函数内部代码这个生成器本身有  _iter_  he  _next_功能(即生成器就是一个迭代器) 为什么要用生成器:生成器是一种自定义迭代器的方式 总结yield的功能1.提供一种自定义迭代器的方式2.yield可以暂停住函数,返回值 yield he return 相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制不同点:return只能返回一次值,yield可

python——函数 20、三元表达式、列表推导式、生成器表达式

1.三元表达式 # 什么是三元表达式 三元:三个元素 x=1 y=2 if x>y: print(x) else : print(y) # 变为三元表达式: hhh=x if x>y else y print(hhh) # 简单明了 ———————————————————————————————————— def max2(x,y): if x>y: return x else : return y print(max2(1,5)) # 变为三元表达式: def max2(x,y): r

[python]--迭代器,生成器补充

在python中,list,string,dict都是可迭代对象,可以通过for语句遍历. 迭代器 迭代器对象要求支持迭代器协议的对象,在python中,支持迭代器协议就算实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身; next()方法返回容器的下一个元素,在结尾时引发StopIteration异常 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素. 对于可迭代对象,

python迭代器,生成器,推导式

可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象. 内置函数:dir() print(dir(str)) 判断一个对象是否是可迭代对象: print('iter' in dir(str)) 优点: 直观. 操作方法较多. 缺点: 占内存. 不能迭代取值(索引,字典的key). 迭代器 字面意

Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

python 迭代器&&生成器

有一篇文章写得迭代器和生成器,写得很好:https://www.cnblogs.com/wj-1314/p/8490822.html #列表生成器print([i*2 for i in range(10)]) #生成器:调用时才会产生相应的数据,不调用时不暂用内存,同时只记住当前的位置,只有一个__next__()方法b=(i*2 for i in range(10))for i in b: print(i) 什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量

十七、python沉淀之路--三元表达式、列表解析

一.三元表达式 1 a = '骑车' 2 3 res = '好天气' if a == '骑车' else '睡觉' 4 print(res) 1 睡觉 解析:res = '好天气'        if a == '骑车'           else '睡觉'  ,将一个句子分了三部分.简单的逻辑运算可用这种三元表达式 二.列表解析 1 gift_list = [] 2 for i in range(10): 3 gift_list.append('礼盒%s'%i) 4 print(gift_l