python基础(二)

循环

for循环

基本构造是:

for 元素 in 序列: 
    statement

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

i=range(4)
print i

结果是[0,1,2,3]

while循环

while的用法是:

while 条件:
   statement

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

中断循环
  • continue 在循环的某一次执行中,如果遇到continue, 那么跳过这一次执行,进行下一次的操作
  • break 停止执行整个循环

函数

函数定义

比如:

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多用于关键字参数传递的默认值。
    #### 函数调用和参数传递
    定义函数后,可以像以下方式使用:
print square_sum(3,4)

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

python有着丰富的参数传递方式,还有关键字传递,表传递,字典传递。以后教程会涉及
观察以下的例子:

a = 1

def change_integer(a):
    a = a + 1
    return a

print change_integer(a)      #注意观察结果
print a      #注意观察结果

#===(Python中 "#" 后面跟的内容是注释,不执行 )

b = [1,2,3]

def change_list(b):
    b[0] = b[0] + 1
    return b

print change_list(b)      #注意观察结果
print b      #注意观察结果
第一个例子,我们将一个整数变量传递给函数,函数对它进行操作,但原整数变量a不发生变化。

第二个例子,我们将一个表传递给函数,函数进行操作,原来的表b发生变化。
对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)

但是对于表来说,表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递),指针是C/C++语言中的重要概念,有关指针的概念可以到网上搜索相关资料。

面向对象的基本概念

Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。

相近对象,归为类
class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'
  • 假设我养了一只小鸡,叫summer。它是个对象,且属于鸟类。使用前面定义的类:
summer = Bird()
print summer.way_of_reproduction

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

动作

这样的一些“行为”属性为方法(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)
  • 它的参数中有一个self,它是为了方便我们引用对象自身。方法的第一个参数必须是self,无论是否用到
  • 在最后调用move方法的时候,我们只传递了dx和dy两个参数,不需要传递self参数(因为self只是为了内部使用)
子类

在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)

新定义的鸡(Chicken)类的,增加了两个属性:移动方式(way_of_move),可能在KFC找到(possible_in_KFC)。

在类定义时,括号里为了Bird。这说明,Chicken是属于鸟类(Bird)的一个子类,即Chicken继承自Bird。自然而然,Bird就是Chicken的父类。Chicken将享有Bird的所有属性。尽管我只声明了summer是鸡类,它通过继承享有了父类的属性(无论是变量属性have_feather还是方法属性move)

新定义的黄鹂(Oriole)类,同样继承自鸟类。在创建一个黄鹂对象时,该对象自动拥有鸟类的属性。父类Bird括号中的object,当括号中为object时,说明这个类没有父类。

面向对象的进一步拓展

调用类的其它信息

刚才提到,在定义方法时,必须有self这一参数。这个参数表示某个对象。对象拥有类的所有性质(如果学习过Java 或C++等语言的便会知道,self相当于this),那么我们可以通过self,调用类属性。

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()

这里有一个类属性laugh。在方法show_laugh()中,通过self.laugh,调用了该属性的值。

还可以用相同的方式调用其它方法。方法show_laugh(),在方法laugh_100th中()被调用。

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

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

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

summer = happyBird('Happy,Happy!')

打印出:

We are happy birds.Happy,Happy!

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

summer.__init__(more_words)

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

对象的性质
  • 我们讲到了许多属性,但这些属性是类的属性。所有属于该类的对象会共享这些属性。比如说,鸟都有羽毛,鸡都不会飞。

  • 在一些情况下,我们定义对象的性质,用于记录该对象的特别信息。比如说,人这个类。性别是某个人的一个性质,不是所有的人类都是男,或者都是女。这个性质的值随着对象的不同而不同。李雷是人类的一个对象,性别是男;韩美美也是人类的一个对象,性别是女。

  • 当定义类的方法时,必须要传递一个self的参数。这个参数指代的就是类的一个对象。我们可以通过操纵self,来修改某个对象的性质。比如用类来新建一个对象,即下面例子中的li_lei, 那么li_lei就被self表示。我们通过赋值给self.attribute,给li_lei这一对象增加一些性质,比如说性别的男女。self会传递给各个方法。在方法内部,可以通过引用self.attribute,查询或修改对象的性质。

  • 这样,在类属性的之外,又给每个对象增添了各自特色的性质,从而能描述多样的世界。

class Human(object):
    def __init__(self, input_gender):
        self.gender = input_gender
    def printGender(self):
        print self.gender

li_lei = Human('male') # 这里,'male'作为参数传递给__init__()方法的input_gender变量。
print li_lei.gender   #这一行结果与下一行对比
li_lei.printGender()   #这一行结果与上一行对比

在初始化中,将参数input_gender,赋值给对象的性质,即self.gender。

li_lei拥有了对象性质gender。gender不是一个类属性。Python在建立了li_lei这一对象之后,使用li_lei.gender这一对象性质,专门储存属于对象li_lei的特有信息。

对象的性质也可以被其它方法调用,调用方法与类属性的调用相似,正如在printGender()方法中的调用。

反过头来看看

  • 介绍两个内置函数:dir()和help()
    dir()用来查询一个类或者对象所有属性
  • help()用来查询类的说明文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值