python开发技术详解(三) 进阶的语法
文章目录:
- __call__
- __iter__
- yeild
- arrage
__call__ 可调用对象
#!/usr/bin/env python #!-*-coding:utf-8-*- ''' switch (C+) @author xyt 可调用对象 ''' class g_dpm(object): def __init__(self,g): self.g=g def __call__(self,t): return self.g*t**2 e_dpg=g_dpm(9.8) s=e_dpg(2) #2秒后自由下降距离。
动态函数:
利用eval转换为函数名(表达式),再调用函数
class student(object): def english(self): print "hello!" def china(self): print "你好!" def __call__(self,*args): eval(args[0]) self.english() stu=student() english='english' stu(english)
__iter__ 迭代对象的使用:
#!/usr/bin/env python #!-*-coding:utf-8-*- ''' 介绍python的built-in函数iter,以及类中的两个函数__iter__,__next__ iter函数有两种用法,一种是传一个参数,一种是传两个参数。返回的结果都是返回一个iterator对象。 先说传两个参数的,比如有 Python代码 收藏代码 i1 = iter(itr, 'c') 这个意思是说,返回itr的iterator,而且在之后的迭代之中,迭代出来'c'就立马停止。对这个itr有什么要求呢?这个itr在这里必须是callable的,即要实现__call__函数 ''' class Itr(object): def __init__(self): self.result=[1,2,3,4,5,6,7,8,9] self.i=iter(self.result) def __call__(self): res = next(self.i) print("__call__ called, which would return ", res) return res def __iter__(self): return iter(self.result) itr = Itr() a=iter(itr) for i in a: print i a=iter(itr,4) for i in a: print i
yeild
带有 yield 的函数在 Python 中被称之为 generator(生成器)
def fab(max): print max n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 a=fab(11) for i in a: print i
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
xrange 通过 iterable 对象来迭代
for i in range(1000): pass
会导致生成一个 1000 个元素的 List,而代码:
for i in xrange(1000): pass
则不会生成一个 1000 个元素的 List,而是在每次迭代中返回下一个数值,内存空间占用很小。因为 xrange 不返回 List,而是返回一个 iterable 对象。