程序的主要功能
现在有个存储用户信息的像表格一样的文档:第一行是属性,各个属性用逗号(,)分隔,从第二行开始每行是各个属性对应的值,每行代表一个用户。如何实现读入这个文档,每行输出一个用户对象呢?
另外还有4个小要求:
下面一一进行解决
由于属性是动态添加的,属性-值 对也是动态添加的,类中要含有updateAttributes()和updatePairs()两个成员函数即可,此外用列表attributes存储属性,词典attrilist存储映射。其中init()函数为构造函数。__attributes前有下划线表示私有变量,不能在外面直接调用。实例化时只需a=UserInfo()即可,无需任何参数。
| 12345678910 | class UserInfo(object): \’Class to restore UserInformation\’ def __init__ (self): self.attrilist={} self.__attributes=[] def updateAttributes(self,attributes): self.__attributes=attributes def updatePairs(self,values): for i in range(len(values)): self.attrilist[self.__attributes[i]]=values[i] |
生成器相当于一个只需要初始化一次,就可自动运行多次的函数,每次循环返回一个结果。不过函数用return 返回结果,而生成器用yield 返回结果。每次运行都在yield返回,下一次运行从yield之后开始。例如,我们实现斐波拉契数列,分别用函数和生成器实现:
| 1234567 | def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return \’done\’ |
我们计算数列的前6个数:
| 12345678 | >>> fib(6)112358\’done\’ |
如果用生成器的话,只要把 print 改成 yield 就可以了。如下:
| 123456 | def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 |
使用方法:
| 12345678910111213 | >>> f = fib(6)>>> f<generator object fib at 0x104feaaa0>>>> for i in f:... print(i)... 112358>>> |
可以看到,生成器fib本身是个对象,每次执行到yield会中断返回一个结果,下次又继续从yield的下一行代码继续执行。生成器还可以用generator.next()执行,更多生成器的讲解请见URL
在我的程序中,生成器部分代码如下: