《趣学Python——教孩子学编程》学习笔记第7-8章

96
麦典威
2018.04.04 00:11 字数 1252

第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 "<pyshell#6>", line 1, in <module>
    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)
image

每次调用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