迭代器与生成器

#迭代器

定义

 迭代器是一个可以遍历容器的一个对象

  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没有办法回头,不会从头开始,他只会从记忆的位置的开始

"""

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'>

元组类型

list01 = [1,2,3,4]

#把里面的代码看成一个整体,一个对象

#利用我们的tuple()函数

a=  tuple(i+1 for i in list01)

print(a)  #(2, 3, 4, 5)

print(type(a)) #<class 'tuple'>

#把3+2变成一个整体

(3+2)/9

集合类型

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()}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值