-
Rational类虽然可以做加法,但无法做减法、乘方和除法,请继续完善Rational类,实现四则运算。
提示:
减法运算:__sub__
乘法运算:__mul__
除法运算:__div__def gcd(a, b): if b == 0: return a return gcd(b, a % b) class Rational(object): def __init__(self, p, q): self.p = p self.q = q def __add__(self, r): return Rational(self.p * r.q + self.q * r.p, self.q * r.q) def __sub__(self, r): return Rational(self.p * r.q - self.q * r.p, self.q * r.q) def __mul__(self, r): return Rational(self.p * r.p, self.q * r.q) def __div__(self, r): return Rational(self.p * r.q, self.q * r.p) def __str__(self): g = gcd(self.p, self.q) return '%s/%s' % (self.p / g, self.q / g) __repr__ = __str__ r1 = Rational(1, 2) r2 = Rational(1, 4) print r1 + r2 print r1 - r2 print r1 * r2 print r1 / r2
查看全部 -
匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。
map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
myabs = lambda x: -x if x < 0 else x
查看全部 -
如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数,要让 len() 函数工作正常,类必须提供一个特殊方法__len__(),它返回元素的个数
查看全部 -
对 int、str 等内置数据类型排序时,Python的 sorted() 按照默认的比较函数 cmp 排序
对一组类的实例排序时,就必须提供自己的特殊方法 __cmp__(),若list包含不止一个类,则__cmp__可能会报错
查看全部 -
如果要把一个类的实例变成 str,就需要实现特殊方法__str__()
因为 Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。
有一个偷懒的定义__repr__的方法:
__repr__ = __str__
查看全部 -
1. 特殊方法
任何类型的实例都有一个特殊方法: __str__()
用于print的_str_; 用于len的_len_; 用于cmp的_cmp_ ...
特殊方法定义在class中
不需直接调用,python某些函数或操作符会调用对应的特殊方法
2. 正确实现:
只需编写用到的特殊方法
有关联性的特殊方法都要实现
查看全部 -
斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。
请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。
class Fib(object): def __init__(self, num): a, b, L = 0, 1, [] for n in range(num): L.append(a) a, b = b, a + b self.numbers = L def __str__(self): return str(self.numbers) __repr__ = __str__ def __len__(self): return len(self.numbers) f = Fib(10) print f print len(f)
查看全部 -
对于Person类的定义:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender
希望除了 name和gender 外,可以提供任意额外的关键字参数,并绑定到实例,请修改 Person 的 __init__()定 义,完成该功能。
传入**kw 即可传入任意数量的参数,并通过 setattr() 绑定属性。
class Person(object): def __init__(self, name, gender, **kw): self.name = name self.gender = gender for k, v in kw.iteritems(): setattr(self, k, v) p = Person('Bob', 'Male', age=18, course='Python') print p.age print p.course
查看全部 -
Python提供了open()函数来打开一个磁盘文件,并返回 File 对象。File对象有一个read()方法可以读取文件内容:
例如,从文件读取内容并解析为JSON结果:
import json f = open('/path/to/file.json', 'r') print json.load(f)
由于Python的动态特性,json.load()并不一定要从一个File对象读取内容。任何对象,只要有read()方法,就称为File-like Object,都可以传给json.load()。
请尝试编写一个File-like Object,把一个字符串 r'["Tim", "Bob", "Alice"]'包装成 File-like Object 并由 json.load() 解析。
只要为Students类加上 read()方法,就变成了一个File-like Object。
import json class Students(object): def read(self): return r'["Tim", "Bob", "Alice"]' s = Students() print json.load(s)
查看全部 -
请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
要定义关键字参数,使用 **kw;
除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。
class Person(object): def __init__(self, name, gender, birth, **kw): self.name = name self.gender = gender self.birth = birth for k, v in kw.iteritems(): setattr(self, k, v) xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student') print xiaoming.name print xiaoming.job
查看全部 -
请创建包含两个 Person 类的实例的 list,并给两个实例的 name 赋值,然后按照 name 进行排序。
class Person(object): pass p1 = Person() p1.name = 'Bart' p2 = Person() p2.name = 'Adam' p3 = Person() p3.name = 'Lisa' L1 = [p1, p2, p3] L2 = sorted(L1, key = lambda x: x.name) print L2[0].name print L2[1].name print L2[2].name
查看全部 -
返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。
def count(): fs = [] for i in range(1, 4): def f(j): def g(): return j*j return g r = f(i) fs.append(r) return fs f1, f2, f3 = count() print f1(), f2(), f3()
查看全部 -
请编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。
def calc_prod(lst): def lazy_prod(): def f(x, y): return x * y return reduce(f, lst, 1) return lazy_prod f = calc_prod([1, 2, 3, 4]) print f()
查看全部 -
首先可以用 type() 函数获取变量的类型,它返回一个 Type 对象
对于实例变量,dir()返回所有实例属性,包括`__class__`这类有特殊意义的属性
dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了
查看全部 -
eg.
class A(object): def __init__(self, a): print 'init A...' self.a = a class B(A): def __init__(self, a): super(B, self).__init__(a) print 'init B...' class C(A): def __init__(self, a): super(C, self).__init__(a) print 'init C...' class D(B, C): def __init__(self, a): super(D, self).__init__(a) print 'init D...'
查看全部
举报