陈斌彬的技术博客

Stay foolish,stay hungry

Pyhton 基础-2

一、循环

1、for循环

for 循环需要预先设定好循环的次数(n),然后执行隶属于 for 的语句n次。

基本构造是:

for 元素 in 序列: 
    statement

举例来说,我们编辑一个叫 forDemo.py 的文件:

img

这个循环就是每次从表 [3,4.4,‘life’] 中取出一个元素(回忆:表是一种序列),然后将这个元素赋值给a,之后执行隶属于 for 的操作(print)。

img

介绍一个新的 Python 函数 range(),来帮助你建立表。

idx = range(5)
print idx

img

可以看到 idx 是[0,1,2,3,4]

这个函数的功能是新建一个表。这个表的元素都是整数,从0开始,下一个元素比前一个大1, 直到函数中所写的上限 (不包括该上限本身)。

2、while循环

while 的用法是:

while 条件:
    statement

while 会不停地循环执行隶属于它的语句,直到条件为假(False)。

举例:

while i < 10:
    print i
    i = i + 1

3、中断循环

continue 在循环的某一次执行中,如果遇到 continue, 那么跳过这一次执行,进行下一次的操作

break 停止执行整个循环

for i in range(10):
    if i == 2: 
        continue
    print i

img

当循环执行到 i = 2 的时候,if 条件成立,触发 continue, 跳过本次执行(不执行print),继续进行下一次执行(i = 3)。

for i in range(10):
    if i == 2:        
        break
    print i

img

当循环执行到 i = 2 的时候,if 条件成立,触发 break, 整个循环停止。

二、函数

函数最重要的目的是方便我们重复使用相同的一段程序。

将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句。

1、函数的定义

首先,我们要定义一个函数, 以说明这个函数的功能。

def square_sum(a,b):
    c = a**2 + b**2
    return c

这个函数的功能是求两个数的平方和。

首先,def,这个关键字通知python:我在定义一个函数。square_sum 是函数名。

括号中的 a, b 是函数的参数,是对函数的输入。参数可以有多个,也可以完全没有(但括号要保留)。

我们已经在循环和选择中见过冒号和缩进来表示的隶属关系。

  • c = a2 + b2 # 这一句是函数内部进行的运算
  • return c # 返回c的值,也就是输出的功能。Python 的函数允许不返回值,也就是不用 return。
  • return 可以返回多个值,以逗号分隔。相当于返回一个 tuple(定值表)。
  • return a,b,c # 相当于 return (a,b,c) 在 python 中#代表注释,编译器将跳过#后的内容。
  • 在 Python 中,当程序执行到 return 的时候,程序将停止执行函数内余下的语句。return 并不是必须的,当没有 return, 或者 return 后面没有返回值时,函数将自动返回 None。None 是 Python 中的一个特别的数据类型,用来表示什么都没有,相当于 C 中的 NULL。None 多用于关键字参数传递的默认值。

2、函数调用和参数传递

定义过函数后,就可以在后面程序中使用这一函数:

print square_sum(3,4)

Python 通过位置,知道3对应的是函数定义中的第一个参数a, 4对应第二个参数b,然后把参数传递给函数 square_sum。

函数经过运算,返回值25, 这个25被 print 打印出来。

img

三、面向对象的基本概念

1、相近对象,归为类

在人类认知中,会根据属性相近把东西归类,并且给类别命名。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都在鸟类的原型基础上的。

面向对象就是模拟了以上人类认知过程。在 Python 语言,为了听起来酷,我们把上面说的“东西”称为对象(object)。

先定义鸟类:

class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'

我们定义了一个类别(class),就是鸟(Bird)。在隶属于这个类比的语句块中,我们定义了两个变量,一个是有羽毛(have_feather),一个是生殖方式(way_of_reproduction),这两个变量对应我们刚才说的属性(attribute)。我们暂时先不说明括号以及其中的内容,记为问题1。

假设我养了一只小鸡,叫 summer。它是个对象,且属于鸟类。使用前面定义的类:

summer = Bird()
print summer.way_of_reproduction

通过第一句创建对象,并说明 summer 是类别鸟中的一个对象,summer 就有了鸟的类属性,对属性的引用是通过 对象.属性(object.attribute) 的形式实现的。

2、动作

日常认知中,我们在通过属性识别类别的时候,有时根据这个东西能做什么事情来区分类别。比如说,鸟会移动。这样,鸟就和房屋的类别区分开了。这些动作会带来一定的结果,比如移动导致位置的变化。

这样的一些“行为”属性为方法(method)。Python 中通过在类的内部定义函数,来说明方法。

class Bird(object):
    have_feather = True
    way_of_reproduction = 'egg'
    def move(self, dx, dy):
        position = [0,0]
        position[0] = position[0] + dx
        position[1] = position[1] + dy
        return position

summer = Bird()
print 'after move:',summer.move(5,8)

3、子类

类别本身还可以进一步细分成子类。

比如说,鸟类可以进一步分成鸡,大雁,黄鹂。

在 OOP 中,我们通过继承(inheritance)来表达上述概念。

class Chicken(Bird):
    way_of_move = 'walk'
    possible_in_KFC = True

class Oriole(Bird):
    way_of_move = 'fly'
    possible_in_KFC = False

summer = Chicken()
print summer.have_feather
print summer.move(5,8)

四、面向对象的进一步拓展

1、调用类的其它信息

class Human(object):
    laugh = 'hahahaha'
    def show_laugh(self):
        print self.laugh
    def laugh_100th(self):
        for i in range(100):
            self.show_laugh()

li_lei = Human()          
li_lei.laugh_100th()

2、__init__() 方法

__init__() 是一个特殊方法(special method)。Python 有一些特殊方法。Python 会特殊的对待它们。特殊方法的特点是名字前后有两个下划线。

如果你在类中定义了 __init__() 这个方法,创建对象时,Python 会自动调用这个方法。这个过程也叫初始化。

class Bird(object):
    have_feather = True
    way_of_reproduction = 'egg'
    def move(self, dx, dy):
        position = [0,0]
        position[0] = position[0] + dx
        position[1] = position[1] + dy
        return position


class happyBird(Bird):
        def __init__(self,more_words):
            print 'We are happy birds.',more_words

summer = happyBird('Happy,Happy!')

这里继承了 Bird 类。屏幕上打印:

img

我们看到,尽管我们只是创建了summer对象,但 __init__() 方法被自动调用了。最后一行的语句(summer = happyBird…)先创建了对象,然后执行:

summer.__init__(more_words)

‘Happy,Happy!’ 被传递给了 __init__() 的参数 more_words