Skip to content

Latest commit

 

History

History
241 lines (168 loc) · 4.83 KB

File metadata and controls

241 lines (168 loc) · 4.83 KB

第12节 python迭代器和python的范围

❤️💕💕python是一种动态的解释形语言,由于python的普遍性,学会python能更快的解决问题,以及学习其他的知识。Myblog:http:https://nsddd.top


[TOC]

python迭代器

迭代器是一个包含可数个值的对象。

迭代器是可以迭代的对象,这意味着您可以遍历所有值。

从技术上讲,在 Python 中,迭代器是一个实现迭代器协议的对象,它由方法__iter__()__next__().

迭代器和可迭代

列表、元组、字典和集合都是可迭代的对象。它们是可迭代的 容器,您可以从中获取迭代器。

所有这些对象都有一个iter()用于获取迭代器的方法:

In [83]: mytuple = ("apple", "banana", "cherry")
    ...: myit = iter(mytuple)
    ...:
    ...: print(next(myit))
    ...: print(next(myit))
    ...: print(next(myit))
apple
banana
cherry

甚至字符串也是可迭代的对象,并且可以返回一个迭代器:

In [84]: mystr = "banana"
    ...: myit = iter(mystr)
    ...:
    ...: print(next(myit))
    ...: print(next(myit))
    ...: print(next(myit))
    ...: print(next(myit))
    ...: print(next(myit))
    ...: print(next(myit))
b
a
n
a
n
a

创建一个迭代器

要将对象/类创建为迭代器,您必须实现方法 __iter__() __next__()对象。

正如您在Python 类/对象一章中所了解的,所有类都有一个名为 的函数 __init__(),它允许您在创建对象时进行一些初始化。

__iter__()方法的作用类似,您可以进行操作(初始化等),但必须始终返回迭代器对象本身。

__next__()方法还允许您执行操作,并且必须返回序列中的下一项。

In [89]: class MyNumbers:
    ...:   def __iter__(self):
    ...:     self.a = 1
    ...:     return self
    ...:
    ...:   def __next__(self):
    ...:     x = self.a
    ...:     self.a += 1
    ...:     return x
    ...:

In [90]: myclass = MyNumbers()
    ...: myiter = iter(myclass)

In [91]: print(next(myiter))
1

In [92]: print(next(myiter))
2

In [93]: print(next(myiter))
3

In [94]: print(next(myiter))
4

In [95]: print(next(myiter))

停止迭代

如果您有足够的 next() 语句,或者如果它在 for循环中使用,上面的示例将永远持续下去。

为了防止迭代永远进行,我们可以使用 StopIteration语句。

在该__next__()方法中,如果迭代完成指定次数,我们可以添加终止条件以引发错误:

In [103]: class MyNumbers:
     ...:   def __iter__(self):
     ...:     self.a = 1
     ...:     return self
     ...:
     ...:   def __next__(self):
     ...:     if self.a <= 20:
     ...:       x = self.a
     ...:       self.a += 1
     ...:       return x
     ...:     else:
     ...:       raise StopIteration
     ...:

In [104]: myclass = MyNumbers()

In [105]: myiter = iter(myclass)

In [106]: for x in myiter:
     ...:   print(x)
     ...:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

python范围

量只能在它创建的区域内使用。这称为范围

和其他语言一样,在本类中创建的变量只能在本类中使用,在本函数中创建的函数只能在本函数中使用

全部范围

在 Python 代码主体中创建的变量是全局变量,属于全局范围。

全局变量可在任何范围内使用,全局和本地。

In [108]: a = 112

In [110]: def afunc():
     ...:     print(a)
     ...:

In [112]: afunc()
112

In [113]: a

命名变量

In [114]: x = 300
     ...:
     ...: def myfunc():
     ...:   x = 200
     ...:   print(x)
     ...:
     ...: myfunc()
     ...:
     ...: print(x)
200
300

全局关键字

如果需要创建全局变量,但又卡在局部范围内,可以使用 global关键字。

global关键字使变量成为全局变量。

In [118]: x = 300
     ...:
     ...: def myfunc():
     ...:   global c
     ...:   c = 200
     ...:   print(c)
     ...:   print(x)
     ...:
     ...: myfunc()
     ...: print(c)
     ...: print(x)
200
300
200
300

END 链接