python开发技术详解(三) 进阶的语法

文章目录:

  1.   __call__
  2.   __iter__
  3.   yeild
  4.   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 对象。

 

 

 

 

  

posted @ 2014-10-13 19:07  UCanBeFree  阅读(237)  评论(0编辑  收藏  举报