*定义*
迭代器是一个可以遍历容器的一个对象
\1. 迭代器返回一个对象
\2. 那些东西可以进行迭代
容器类型的---list set 字典 字符串
*方法*
"""
迭代器
#注意是两个下划线
list01.iter() 返回一个迭代器对象
<list_iterator object at 0x0000024037E0C588>
list01 = [1,2,3,4]
#注意是两个下划线
a = list01.iter()
print(a) #<list_iterator object at 0x0000024037E0C588>
1.我听要他何用,他是一个对象,我想要的是值
迭代器对象.next() 返回一个值
2.他只能返回第一个值吗 no
因为next()可以记忆位置,每次你调用一次,他会记住这位置,然后下一次从下一个位置开始
3.我要是一直调用,可以吗
报错StopIteration,没有数据了
我们的next没有办法回头,不会从头开始,他只会从记忆的位置的开始
"""
list01 = [1,2,3,4]
a = list01.iter()
print(a.next()) #1
print(a.next()) #2
print(a.next()) #3
print(a.next()) #4
print(a.next()) #报错
*迭代*
list01 = [1,2,3,4]
#注意是两个下划线
a = list01.iter()
"""
迭代对象的遍历
1.next() 不会从头开始, 每次从记忆的位置开始
2.for循环就相当于是不断的打印next()。但是为什么没报错
自己抛出StopIteration,然后停止循环
"""
for i in list01:
print(i)
*迭代对象*
\1. 那些东西可以进行迭代
容器类型的---list set 字典 字符串
*为什么是两个下划线*
有些方法以双下划线 “__” 开头和结尾,它们是Python的魔法函数,用于特殊用途
Next()
.next()
.Next()
init()
iter()
Func_sum()
*生成器*
*定义*
生成器也是一种迭代器,但是你只能对其迭代一次。
>>> a = func_add01([2,3,5,7,9])
>>> a
<generator object func_add01 at 0x000001AD11F8D148>
>>> for i in a:
print(i)
3
4
6
8
10
>>> a.next()
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
a.next()
StopIteration
>>> b = func_add01([2,3,5,7,9])
>>> b.next()
3
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个特殊的迭代器。
>>> func_add01([1,2,3,4])
<generator object func_add01 at 0x000001AD11F8D148
生成器可以一边循环一边计算
优点是节省内存
关键字是:yield
*代码*
>>> def func_add(list01):
list02 = []
for i in list01:
list02.append(i+1)
return list02
>>> func_add([1,2,3,4])
[2, 3, 4, 5]
>>> def func_add01(list01):
for i in list01:
yield i+1
>>> func_add01([1,2,3,4])
<generator object func_add01 at 0x000001AD11F8D148>
>>> list(func_add01([1,2,3,4]))
[2, 3, 4, 5]
>>> a = func_add01([2,3,5,7,9])
>>> a
<generator object func_add01 at 0x000001AD11F8D148>
>>> for i in a:
print(i)
3
4
6
8
10
>>> a.next()
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
a.next()
StopIteration
>>> b = func_add01([2,3,5,7,9])
>>> b.next()
3
>>>
*语法*
由于生成器是一个返回迭代器的函数
生成器一边循环一边计算
关键字是yield
def func_name(canshu):
for i in canshu:
yield luoji
*总结*
\1. 生成器都是迭代器,迭代器不一定是生成器
\2. 字符串,列表,元组,字典,集合都可以被for循环,说明他们都是可迭代对象
\3. 迭代器的两个方法:1.有iter() 2. 有next()
\4. isinstance() 类型判断。isinstance(a,Iterable) 判断a 是否是可迭代对象。
*练习*
\1. 定义一个函数,list01=[1,2,3,4,5],把里面的每一个元素进行平方,返回一个新列表
\2. 定义一个函数,list01=[1,2,3,4,5],把里面的每一个元素对2进行取余,返回一个新列表
*推导式*
*引入*
"""
普通循环
"""
for i in [1,2,3,4]:
print(i)
"""
推导式
"""
[print(i) for i in [1,2,3,4]]
*定义*
推导式是从一个或者多个迭代器快速创建序列的一种方法。
*语法*
[逻辑/结果 for i in 序列类型的变量]
你想要什么类型,就在外层包裹什么
序列类型
[] () {k,v} {}
*用法*
*列表类型*
"""
推导式
"""
list01 = [1,2,3,4]
a= [i+1 for i in list01]
print(a) #[2, 3, 4, 5]
print(type(a)) #<class 'list'>
*元组类型*
#把里面的代码看成一个整体,一个对象
#利用我们的tuple()函数
a= tuple(i+1 for i in list01)
print(a) #(2, 3, 4, 5)
print(type(a)) #<class 'tuple'>
*集合类型*
list01 = [1,2,3,4]
a= {i+1 for i in list01}
print(a) #{2, 3, 4, 5}
print(type(a)) #<class 'set'>
*字典类型*
dict01 = {"王五":20,"张三":50,"李四":80,"赵六":18}
for k,v in dict01.items():
print(k,v)
{print(k,v) for k,v in dict01.items()}