首页 > 代码库 > Python 专用方法和迭代机制

Python 专用方法和迭代机制

Python 设计哲学是“优雅”、“明确”、“简单”,对于一件事只用一种最好的方法来做,而这种优雅在于背后很自然的隐藏了很多细节。比如对一些对象直接用for 语句来迭代,一些全局函数可以作用于很多具有共同特征的对象,还有生成器装饰器自省等特性。其中很多实现都是借助 Python  内部专用方法,而对外则使用统一的全局函数来进行操作,在配合一些语法糖,使得 Python 写起来愈发的方便,符合人的直觉。

Python 专用方法

  • 类的私有方法:以双线划线开头,但是不以双下划线结尾的方法;
  • 类的专有方法:以双下划线开头和结尾,常用来被内建函数调用;
  • 模块私有对象:以单下划线开头,不能被导入到其他的模块中去;
#!/usr/bin/env python
# Python3 实现
_modeluprivate = '本模块私有'   #不能用 from module import * 导入

class People():
    def __myprivate(self):
        print("This is a private fun")
    def __test__(self):
        print('call __private: ',end='')
        self.__myprivate()

if __name__ == '__main__':
    a = People()
    a.__test__()            # 专有方法,一般系统专用,自己的类方法不要用这种新式命名
    a._People__myprivate()  # 私有方法被对外被翻译成了这种名字,从而达到私有的效果
    print(_modeluprivate)
    
'''
输出
call __private: This is a private fun
This is a private fun
本模块私有
'''

Python 迭代机制

Python 中的可迭代对象是实现了 __iter__() 方法的对象,而 __iter__() 方法返回一个迭代器对象,迭代器对象内部要实现 __next__() 方法。迭代器对外提供了一个统一的遍历集合的接口,并且可以直接用 for 语句来进行操作,非常的方便。对于一些特别大甚至无限的集合,迭代器避免了一次性将数据集载入,几乎是唯一的访问方法。

#!/usr/bin/env python
# Python3 实现
class IterTest():
    def __init__(self):
        self.a = 0
    def __iter__(self):
        return self
    def __next__(self):
        self.a += 1
        if self.a > 3:
            raise StopIteration
        return self.a

if __name__ == '__main__':
    a = IterTest()
    for i in a:
        print(i,end=' ')
    b = IterTest()
    print(list(b))  # list()构造器,可以接受可迭代对象
    c = IterTest()
    print(next(c), next(c), next(c))

'''
输出
1 2 3 [1, 2, 3]
1 2 3
'''

Python 的生成器其实返回的也是一个迭代器,同样可以对其使用 next() 函数,对其使用 for操作,有了 yield 关键字使得创建生成器更加的方便。

#!/usr/bin/env python
# Python3 实现
def funGenerate():
    yield 1
    yield 2
    yield 3

if __name__ == '__main__':
    a = funGenerate()
    for i in a:
        print(i, end=' ')
    b = funGenerate()
    print(next(b),next(b),next(b))

'''
输出
1 2 3 1 2 3
'''

Python 专用方法和迭代机制