第7章 使用函数和模块来重用你的代码
7.1 使用函数
函数是一段代码,它让Python做某些事情,他们是重用代码的一种方式——你可以在程序里多次使用函数。
7.1.1 函数的组成部分
一个函数有三部分组成:名字、参数、函数体。
>>> def testfunc(myname):
print('hello %s' % myname)
>>> testfunc('Tao1024')
hello Tao1024
>>> testfunc('麦典威')
hello 麦典威
函数常常需要返回一个值,这就用到了return语句。
例如你可以写个函数来计算存下来多少钱
>>> def savings(pocket_money, paper_route, spending):
return pocket_money + paper_route-spending
>>> print(savings(10,10,5))
15
7.1.2 变量和作用域
在函数体内的变量,当函数之行结束后就不能再用了,因为它只在函数中存在。这就是“作用域”。
>>> def variable_test():
first_variable = 10
second_variable = 20
return first_variable*second_variable
>>> print(variable_test())
200
>>> print(first_variable)
Traceback (most recent call last):
File "", line 1, in
print(first_variable)
NameError: name 'first_variable' is not defined
如果一个变量定义在函数之外,那么它的作用域则不一样。
>>> another_variable = 100
>>> def variable_test():
first_variable = 10
second_variable = 20
return first_variable*second_variable*another_variable
>>> print(variable_test())
20000
>>> print(another_variable)
100
假设你要用可乐罐建造一个太空舱,你觉得每个星期可以压平两个罐子,但你要用大约500个罐子才能造出船身。我们可以很容易地写出一个函数来帮我们计算,如果每周压两个罐子的话,总共需要多少时间来压平500个罐子。
>>> def spaceship_building(cans):
total_cans = 0
for week in range(1,53):
total_cans = total_cans + cans
print('Week %s = %s cans' % (week, total_cans))
>>> spaceship_buidling(2)
>>> spaceship_building(13)
这个函数可以用每周不同的罐数来反复重用,比你每次试着用不同的数字来把for循环重新输入要高效得多。
7.2 使用模块
模块用来吧函数、变量,以及其他东西组织成更大的、更强的程序。有些模块内置在Python中,还有一些可以单独下载。比如,帮助你写游戏软件的模块(内置的tkinter,非内置的PyGame)、用来操纵图像的模块(PIL,Python图像库)、用来画3D立体画的模块(Panda3D)。
使用模块要用 import 命令来引入
>>> import time
>>> print(time.asctime())
Sat Mar 31 14:36:17 2018
>>> import sys
>>> print(sys.stdin.readline())
hello
hello
>>> def silly_age_joke():
print('How old are you?')
age = int(sys.stdin.readline())
if age >= 10 and age <= 13:
print('What is 13 + 49 + 84 +155 + 97? A headache! ')
else:
print('Huh?')
>>> silly_age_joke()
How old are you?
12
What is 13 + 49 + 84 +155 + 97? A headache!
第8章 如何使用类和对象
8.1 把事物拆分成类
对象是由“类”定义的,一个对象是一个类家族中的一员,我们可以创建任意数量的这个类的对象。
先来创建一个类。当我们想提供一个类或者函数,却暂时不想填入具体信息的时候就可以使用pass
>>> class Things:
pass
8.1.1 父母与孩子
如果一个类是另一个类家族中的一部分,那么它是另一个类的孩子,另一个类是它的父亲。要告诉一个类是另一个类的孩子,就在新类的名字后用括号加上父亲类的名字
>>> class Things:
pass
>>> class Animate(Things):
pass
>>> class Inanimate(Things):
pass
8.1.2 增加属于类的对象
假设有一个长颈鹿,它的名字叫Reginald,我们知道它属于Giraffes类,但要用什么样的程序语来描述一只叫Reginal的长颈鹿呢?
>>> class Giraffes():
pass
>>> reginald = Giraffes()
8.1.3 定义类中的函数
>>> class ThisIsMySillyClass:
def this_is_a_class_function():
print('I am a class function')
def this_is_also_a_class_function():
print('I am also a class function. See?')
8.1.4 用函数来表示类的特征
类的“特征”就是一个类家族中的所有成员(包括他的子类)共同的特点。比如所有动物都有呼吸、移动、吃饭的特征。
>>> class Animals():
def breathe(self):
pass
def move(self):
pass
def eat_food(self):
pass
self这个参数是用来从类中的一个函数调用类中(包括父类)的另一个函数的。
8.1.5 为什么要使用类和对象
假如我们有两只长颈鹿,reginald和harold,我们想让reginald移动,而harold留在原地吃东西,则可以编写以下程序
>>> class Animals():
def breathe(self):
print('breathing')
def move(self):
print('moving')
def eat_food(self):
print('eating food')
>>> class Mammals(Animals):
def feed_young_with_milk(self):
print('feeding young')
>>> class Giraffes(Mammals):
def eat_leaves_from_trees(self):
print('eating leaves')
>>> reginald = Giraffes()
>>> harold = Giraffes()
>>> reginald.move()
moving
>>> harold.eat_leaves_from_trees()
eating leaves
8.1.6 画图中的对象与类
>>> import turtle
>>> avery = turtle.Pen()
>>> kate = turtle.Pen()
>>> avery.forward(50)
>>> avery.right(90)
>>> avery.forward(20)
>>> kate.left(90)
>>> kate.forward(100)
每次调用turtle.Pen()来创建一个海龟,它都是一个新的、独立的对象。每个对象仍是Pen类的一个实例,每个对象可以调用同样的函数。
8.2 对象和类的另一些实用功能
类和对象是给函数分组的好办法,帮助我们把程序分成小段来分别思考。例如,一个相当大的软件应用程序,比如文字处理软件或者3D计算机游戏,对大多数人来说,几乎不可能整个地来理解这么大的程序,因为代码实在太多了,但是如果把这个 庞大的程序分成小的片段,那么每一块理解起来就更容易来。
8.2.1 函数继承
任何在父类中定义的函数在子类中都可以用
8.2.2 从函数里调用其他函数
>>> class Animals():
def breathe(self):
print('breathing')
def move(self):
print('moving')
def eat_food(self):
print('eating food')
>>> class Mammals(Animals):
def feed_young_with_milk(self):
print('feeding young')
>>> class Giraffes(Mammals):
def find_food(self):
self.move()
print('I have found food')
self.eat_food()
>>> reginald = Giraffes()
>>> reginald.find_food()
moving
I have found food
eating food
8.3 初始化对象
当我们创建对象时,有时会设置一些值以便将来使用,这些值叫“属性”。当我们初始化对象时,我们是在为将来做准备。init函数是在对象被创建的同时就设置它的属性的一种方法,Python会在我们创建对象时自动调用这个函数。
>>> gertrude = Giraffes(100)
>>> ozwald = Giraffes(200)
>>> print(gertrude.giraffe_sports)
100
>>> print(ozwald.giraffe_sports)
200