迭代器,生成器,三元运算,列表推导式
目录
已学的知识中,哪些是对象
整型
浮点型
字符串
列表
元组
字典
集合
文件
函数
可迭代对象
可迭代对象有哪些?
字符串
列表
字典
集合
文件
总结:拥有iter方法的对象就是可迭代对象
迭代器
文件本身就是迭代器对象。
with open("a.txt",'r',encoding="utf8") as f:
print(f.__next__()) # 这里的f就是迭代器
迭代器对象:拥有iter方法和next方法的就是迭代器对象
文件既是可迭代对象,又是迭代器对象
三元表达式
# 普通的if判断
x = 10
y = 20
if x < y:
a = x
else:
a = y
print(a)
# 三元表达式:
x = 10
y = 20
a = x if x < y else print y
print(a)
列表推导式
list_plf = [i for i in rang(100) if i > 50]
print(list_plf)
dict_lt = {k:v for k,v in ==zip("abcdef",[1,2,3,4,5,6])== if v > 2}
print(dict_lt)
'''
总结:
列表推导式的逻辑判断最好是写在循环的后面
'''
生成器(yield)
yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是返回一个值。
def func():
print(1)
yield
print(2)
yield
g = func()
print(g)
'''
<generator object func at 0x10ddb6b48>
'''
生成器的本质就是迭代器
,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。并且从Python 2.5+开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。
def func():
print('from func 1')
yield 'a'
print('from func 2')
yield 'b'
g = func()
print(F"g.__iter__ == g: {g.__iter__() == g}")
res1 = g.__next__()
print(f"res1: {res1}")
res2 = next(g)
print(f"res2: {res2}")
# next(g) # StopIteration
'''
g.__iter__ == g: True
from func 1
res1: a
from func 2
res2: b
'''
def func():
print('from func 1')
yield 'a'
print('from func 2')
yield 'b'
g = func()
for i in g:
print(i)
print(f"list(func()): {list(func())}")
from func 1
a
from func 2
b
from func 1
from func 2
list(func()): ['a', 'b']
yield和return的区别
yield:接受函数返回值,但是函数不退出
return:接受函数返回值,但是函数会退出
def i_wanna_return():
yield 'a'
yield 'b'
return None
yield 'c'
for i in i_wanna_return():
print(i)
'''
a
b
'''
生成器表达式和列表推导式的区别
# 生成器
a = (i for i in range(10))
print(a)
'''
<generator object <genexpr> at 0x0000007B33E396D0>
'''
# 列表推导式
b = [i for i in range(10)]
print(b)
'''
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''
'''
总结:
1. 列表推导式相当于直接给你一筐蛋,而生成器表达式相对于给你一个母鸡。
2. 从内存的角度看,生成器更节省空间
'''
总结
yield
- 提供一种自定义迭代器的方式
- yield可以暂停住函数,并提供当前的返回值
yield和return
- 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制
- 不同点:return只能返回一次之;yield可以返回多次值
生成器表达式和列表推导式的区别
- 列表推导式相当于直接给你一筐蛋,而生成器表达式相对于给你一个母鸡。
- 从内存的角度看,生成器更节省空间