print(demo(x))
5.4 在函数内部可以通过关键字 global 来定义全局变量。
5.5 如果函数中没有return语句或者return语句不带任何返回值,那么该函数的返回值为 None 。
5.6 调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用函数定义时设置的默认值。(对、错)
5.7 在Python程序中,局部变量会隐藏同名的全局变量吗?请编写代码进行验证。 答案:会。 >>> def demo(): a=3 print a >>> a=5 >>> demo() 3 >>> a 5
5.8 lambda表达式只能用来创建匿名函数,不能为这样的函数起名字。(对、错) 5.9 编写函数,可以接收任意多个整数并输出其中的最大值和所有整数之和。 答:这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print()函数为print语句即可。 def demo(*v): print(v)
print(max(v)) print(sum(v)) demo(1,2,3) demo(1,2,3,4) demo(1,2,3,4,5)
5.10 编写函数,模拟内置函数sum()。
答:这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print()函数为print语句即可。 def Sum(v): s = 0
for i in v: s += i return s x = [1,2,3,4,5] print(Sum(x)) x = (1,2,3,4,5) print(Sum(x))
5.11 包含 yield 语句的函数可以用来创建生成器。 5.12 编写函数,模拟内置函数sorted()。
答:这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print()函数为print语句即可。 def Sorted(v): t = v[::] r = [] while t:
tt = min(t) r.append(tt) t.remove(tt) return r
x = [1,3,5,2,1,0,9,7] print(x)
print(Sorted(x))
第6章 面向对象程序设计
6.1 继承6.5节例2中的Person类生成Student类,填写新的函数用来设置学生专业,然后生成该类对象并显示信息。
答:Python 3.4.2代码为
import types
class Person(object): #基类必须继承于object,否则在派生类中将无法使用super()函数 def __init__(self, name = '', age = 20, sex = 'man'): self.setName(name) self.setAge(age) self.setSex(sex) def setName(self, name):
if not isinstance(name,str):
print('name must be string.') return
self.__name = name def setAge(self, age):
if not isinstance(age,int):
print('age must be integer.') return
self.__age = age def setSex(self, sex):
if sex != 'man' and sex != 'woman':
print('sex must be \ return
self.__sex = sex def show(self):
print(self.__name) print(self.__age) print(self.__sex) class Student(Person):
def __init__(self, name='', age = 30, sex = 'man', major = 'Computer'): #调用基类构造方法初始化基类的私有数据成员 super(Student, self).__init__(name, age, sex)
self.setMajor(major) #初始化派生类的数据成员 def setMajor(self, major):
if not isinstance(major, str):
print('major must be a string.') return
self.__major = major def show(self):
super(Student, self).show()
print(self.__major) if __name__ =='__main__':
zhangsan = Person('Zhang San', 19, 'man') zhangsan.show()
lisi = Student('Li Si',32, 'man', 'Math') lisi.show()
6.2 设计一个三维向量类,并实现向量的加法、减法以及向量与标量的乘法和除法运算。 答:Python 3.4.2代码如下 class Vecter3:
def __init__(self, x=0, y=0, z=0): self.X = x self.Y = y self.Z = z
def __add__(self, n): r = Vecter3()
r.X = self.X + n.X r.Y = self.Y + n.Y r.Z = self.Z + n.Z return r
def __sub__(self, n): r = Vecter3() r.X = self.X - n.X r.Y = self.Y - n.Y r.Z = self.Z - n.Z return r
def __mul__(self, n): r = Vecter3() r.X = self.X * n r.Y = self.Y * n r.Z = self.Z * n return r
def __truediv__(self, n): r = Vecter3() r.X = self.X / n r.Y = self.Y / n r.Z = self.Z / n return r
def __floordiv__(self, n): r = Vecter3() r.X = self.X // n r.Y = self.Y // n r.Z = self.Z // n
return r def show(self):
print((self.X,self.Y,self.Z)) v1 = Vecter3(1,2,3) v2 = Vecter3(4,5,6) v3 = v1+v2 v3.show() v4 = v1-v2 v4.show() v5 = v1*3 v5.show() v6 = v1/2 v6.show()
6.3 面向对象程序设计的三要素分别为 封装 、 继承 和 多态 。 6.4 简单解释Python中以下划线开头的变量名特点。 答:
在Python中,以下划线开头的变量名有特殊的含义,尤其是在类的定义中。用下划线作为变量前缀和后缀来表示类的特殊成员:
? _xxx:这样的对象叫做保护变量,不能用'from module import *'导入,只有类对象和子类对象能访问这些变量;
? __xxx__:系统定义的特殊成员名字;
? __xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。Python中没有纯粹的C++意义上的私有成员。
6.5 与运算符“**”对应的特殊方法名为 __pow__() ,与运算符“//”对应的特殊方法名为 __floordiv__() 。
6.6 假设a为类A的对象且包含一个私有数据成员“__value”,那么在类的外部通过对象a直接将其私有数据成员“__value”的值设置为3的语句可以写作 a._A__value 。