python的一些高级语法

简介:

1.python 可迭代对象的写法

a.循环版-迭代器

通过实现类的属性方法实现

class Fab(object): 


    def __init__(self, max): 

        self.max = max 

        self.n, self.a, self.b = 0, 0, 1 


    def __iter__(self):   //返回迭代属性

        return self 


    def next(self):       //实现迭代方法

        if self.n < self.max: 

            r = self.b 

            self.a, self.b = self.b, self.a + self.b 

            self.n = self.n + 1 

            return r 

        raise StopIteration()


>>> for n in Fab(5): 

 ...     print n 

 ... 

遍历结束时抛出StopIteration异常

iter = (x**2 for x in rang(10) if x%2==0)生成迭代器,相当于yield

list = [x**2 for x in rang(10) if x%2==0]  生成列表

b.yield - 生成器(也属于迭代器:由解释器自动生成的迭代器,有助于保持代码简洁)

 def fab(max): 

    n, a, b = 0, 0, 1 

    while n < max: 

        yield b 

        a, b = b, a + b 

        n = n + 1 


 >>> for n in fab(5): 

 ...     print n 

 ... 


yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法)

 >>> f = fab(5) 

 >>> f.next() 

要注意区分 fab 和 fab(5),fab 是一个 generator function,而 fab(5) 是调用 fab 返回的一个 generator,好比类的定义和类的实例的区别

在一个 generator function 中,如果没有 return,则默认执行至函数完毕抛出 StopIteration ,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。


另一个 yield 的例子来源于文件读取。如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取:

 def read_file(fpath): 

    BLOCK_SIZE = 1024 

    with open(fpath, 'rb') as f: 

        while True: 

            block = f.read(BLOCK_SIZE) 

            if block: 

                yield block 

            else: 

                return

生成器或迭代器相比于列表可以更大限度的减小内存的开销

for line in open("test.txt"):   #use file iterators

    print line

能节省内存的地方就应该是用生成器(速度快,节省内存)

2.动态添加对象成员

class Info():

def __init__(self):

self.a=10

>>info = Info()

>>info.b=20

>>print info.b   #动态添加对象成员




本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1928577,如需转载请自行联系原作者
相关文章
|
16天前
|
Java 编译器 C语言
Python速成篇(基础语法)上
Python速成篇(基础语法)上
|
1月前
|
Java 程序员 C++
【python】—— 基础语法(二)
【python】—— 基础语法(二)
|
1月前
|
存储 机器学习/深度学习 XML
python基础语法——文件与库
本文基于pycharm编译器,也可以使用Anaconda 里的编译器,将讲解一些python的一些基础语法知识,是对上篇文章的补充.
31 0
|
1月前
|
存储 Python
Python中基本语法(3)
Python中基本语法(3)
31 1
|
1月前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
165 0
|
1月前
|
机器学习/深度学习 数据挖掘 C语言
python数据分析——Python语言基础(语法基础)
对于学过C语言的人来说,python其实很简单。学过一种语言,学习另一种语言,很显然的能感觉到,语言大体上都是相通的。当然,没学习过C语言,不是就不能学习python,python相对于其他语言,还是入手最简单的。
26 0
|
9天前
|
Python
02-python的基础语法-01python字面量/注释/数据类型/数据类型转换
02-python的基础语法-01python字面量/注释/数据类型/数据类型转换
|
12天前
|
JavaScript 前端开发 Python
Python 高级主题: 解释 Python 中的闭包是什么?
【4月更文挑战第13天】闭包是内部函数引用外部变量的函数对象,作为外部函数的返回值。当外部函数执行完毕,其变量本应消失,但由于内部函数的引用,这些变量在内存中保持存活,形成闭包。例如,在外函数中定义内函数并返回内函数引用,实现对外部局部变量的持久访问。闭包在Python和JavaScript等语言中常见,是强大的编程工具,连接不同作用域并允许局部变量持久化,用于复杂程序设计。**
16 4
|
16天前
|
存储 监控 Java
Python速成篇(基础语法)下(新年快乐♥)
Python速成篇(基础语法)下(新年快乐♥)
|
23天前
|
Java C语言 C++
【Python】5. 基础语法(3) -- 函数篇
【Python】5. 基础语法(3) -- 函数篇
26 1

热门文章

最新文章