Python基础(十一)
2020-12-13 14:41
标签:空间换时间 结果 取值 文件句柄 两种 机制 for循环 类型 寻址 执行流程: f-strings的格式: 引号中如果需要大括号 引号中需要使用引号时,一定用两个单引号 传入的参数可以是三目表达式 说迭代器之前咱们来看一看可迭代对象,什么是可迭代对象? 查看可迭代对象的官方方法: 可迭代对象的特点: 应用:内存空间大,当数据量比较少,建议使用可迭代对象 迭代器的生成方法: 迭代器的取值 迭代器的特点: for循环的本质就是一个迭代器 向同一个迭代器取值,迭代器内部会记录取值位置,赋值给变量,变量会指向地址和上次取值位置 向同一个迭代器取值,迭代器内部会记录取值位置,若不赋值,每一次取值都从开头取值,相当于每次寻址后都从头开始 应用:内存小,数据量巨大时,建议使用迭代器 生成器的本质就是迭代器 生成器就是一个自己写的迭代器,而迭代器只能通过 生成器的目的是不通过数据转换实现,通过代码实现 通过函数实现生成器 生成器的取值 生成器的本质就是一个迭代器,所以它拥有迭代器的所有特点 向同一个生成器取值,yield会记录取值位置,赋值给变量,变量会指向地址和上次取值位置 向同一个生成器取值,yield会记录取值位置,若不赋值,每一次取值都从开头取值,相当于每次寻址后都从头开始 若yield的值是个可迭代对象,还可以将其对象逐个返回 Python基础(十一) 标签:空间换时间 结果 取值 文件句柄 两种 机制 for循环 类型 寻址 原文地址:https://www.cnblogs.com/tianlangdada/p/11567942.html今日主要内容
补充:三目运算
表达式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)
运行结果:
可迭代对象.__iter__()
lst = [1, 2, 3, 4, 5]
l = lst.__iter__()
print(l)
运行结果:
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
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())
运行结果:
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
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
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 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()
方法的就是一个生成器
上一篇:C#通过SFTP协议操作文件