标签:空间换时间 结果 取值 文件句柄 两种 机制 for循环 类型 寻址
表达式1 if 条件表达式 else 表达式2
c = a if a > b else b
执行流程:
a = 10
b = 20
c = a if a > b else b # 三目运算
print(c)
运行结果:
20
f-strings的格式:
f"xxxx{传入的变量}xxxx"
(建议使用f
)F"xxxx{传入的变量}xxxx"
(不建议使用F
)name = "zxd"
age = 23
print(f"姓名:{name} 年龄:{age}")
运行结果:
姓名:zxd 年龄:23
引号中如果需要大括号{}
时,用两个{{}}
代表
print(f"{{'a'}}") # 用两个大括号表示
运行结果:
{'a'}
引号中需要使用引号时,一定用两个单引号‘‘
表示
print(f"{{'a'}}") # 用单引号表示
运行结果:
{'a'}
传入的参数可以是三目表达式
a = 10
b = 10
print(f"{a if a > b else b}")
运行结果:
10
说迭代器之前咱们来看一看可迭代对象,什么是可迭代对象?
s = "12345"
lst = [1, 2, 3, 4, 5]
dic = {1: 1, 2: 2, 3: 3}
.......
# 这些都是可迭代对象
s = "12345"
lst = [1, 2, 3, 4, 5]
dic = {1: 1, 2: 2, 3: 3}
for el in s:
print(el)
for el in lst:
print(el)
for el in dic:
print(el)
查看可迭代对象的官方方法:
__iter__()
方法,只要使用有此方法的对象全部都是可迭代对象dir()
函数可以查看对象所有的方法lst = [1, 2, 3, 4, 5]
print("__iter__" in dir(lst))
运行结果:
True
可迭代对象的特点:
应用:内存空间大,当数据量比较少,建议使用可迭代对象
迭代器的生成方法:
iter(可迭代对象)
lst = [1, 2, 3, 4, 5]
l = iter(lst)
print(l)
运行结果:
<list_iterator object at 0x0000020BAFCEA940>
可迭代对象.__iter__()
lst = [1, 2, 3, 4, 5]
l = lst.__iter__()
print(l)
运行结果:
<list_iterator object at 0x000002490EFDA8D0>
迭代器的取值
next(迭代器)
lst = [1, 2, 3, 4, 5]
l = iter(lst)
print(next(l))
print(next(l))
print(next(l))
print(next(l))
print(next(l))
运行结果:
1 2 3 4 5
迭代器.__next__()
lst = [1, 2, 3, 4, 5]
l = lst.__iter__()
print(l.__next__())
print(l.__next__())
print(l.__next__())
print(l.__next__())
print(l.__next__())
运行结果:
1 2 3 4 5
lst = [1, 2, 3, 4, 5]
l = lst.__iter__()
print(l.__next__())
print(l.__next__())
print(l.__next__())
print(l.__next__())
print(l.__next__())
print(l.__next__())
运行结果:
1 2 3 4 5
StopIteration
迭代器的特点:
for循环的本质就是一个迭代器
lst = [1, 2, 3, 4, 5]
l = iter(lst)
while True:
try:
print(next(l))
except StopIteration: # 捕获异常
break
向同一个迭代器取值,迭代器内部会记录取值位置,赋值给变量,变量会指向地址和上次取值位置
lst = [1, 2, 3, 4, 5]
l_iter = iter(lst)
print(next(l_iter))
print(next(l_iter))
print(next(l_iter))
print(next(l_iter))
print(next(l_iter)) # l_iter指向取值记录位置
运行结果:
1 2 3 4 5
l_iter
指向迭代器的地址,每一次取值,l_iter
指向上一次取值位置向同一个迭代器取值,迭代器内部会记录取值位置,若不赋值,每一次取值都从开头取值,相当于每次寻址后都从头开始
lst = [1, 2, 3, 4, 5]
print(next(iter(lst)))
print(next(iter(lst)))
print(next(iter(lst)))
print(next(iter(lst)))
print(next(iter(lst)))
print(next(iter(lst))) # 每次都从头开始取值
运行结果:
1 1 1 1 1
func()
直接寻址,都从头部开始取值应用:内存小,数据量巨大时,建议使用迭代器
iter(可迭代对象)
和可迭代对象.__iter__()
得到生成器的本质就是迭代器
生成器就是一个自己写的迭代器,而迭代器只能通过iter()
函数得到
生成器的目的是不通过数据转换实现,通过代码实现
lst = [1, 2, 3, 4, 5]
l_iter = iter(lst)
print(next(l_iter))
print(next(l_iter))
print(next(l_iter))
print(next(l_iter))
print(next(l_iter))
运行结果:
1 2 3 4 5
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
f_gen = func()
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
运行结果:
1 2 3 4 5
通过函数实现生成器
def func():
print(1)
return 1
print(func())
运行结果:
1 1
return
替换成yield
就变成了一个生成器def func():
print(1)
yield 1
print(func())
运行结果:
<generator object func at 0x000001B27042C50>
yield
:
生成器的取值
next(生成器)
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
f_gen = func()
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
运行结果:
1 2 3 4 5
生成器.__next__()
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
print(func().__next__())
print(func().__next__())
print(func().__next__())
print(func().__next__())
print(func().__next__())
运行结果:
1 2 3 4 5
生成器的本质就是一个迭代器,所以它拥有迭代器的所有特点
向同一个生成器取值,yield会记录取值位置,赋值给变量,变量会指向地址和上次取值位置
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
f_gen = func()
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
print(next(f_gen))
print(next(f_gen)) # f_gen指向生成器地址和yiele记录的位置
运行结果:
1 2 3 4 5
向同一个生成器取值,yield会记录取值位置,若不赋值,每一次取值都从开头取值,相当于每次寻址后都从头开始
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
print(next(func()))
print(next(func()))
print(next(func()))
print(next(func()))
print(next(func())) # 每次都从头开始取值
运行结果:
1 2 3 4 5
若yield的值是个可迭代对象,还可以将其对象逐个返回
yield from
def func():
yield from [1, 2, 3]
yield from [4, 5, 6]
print(next(func()))
print(next(func()))
print(next(func()))
print(next(func()))
print(next(func()))
print(next(func()))
运行结果:
1 2 3 4 5 6
__iter__()
方法的对象都是可迭代对象iterator
就是一个迭代器__iter__()
和__next__()
放法的就是一个迭代器generator
就是一个生成器send()
方法的就是一个生成器标签:空间换时间 结果 取值 文件句柄 两种 机制 for循环 类型 寻址
原文地址:https://www.cnblogs.com/tianlangdada/p/11567942.html