python高端写法_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 #动态添加对象成员

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值