Python基础05-08

来源:互联网 发布:c语言 输入英文名 编辑:程序博客网 时间:2024/06/11 15:09

Python基础05 缩进和选择

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!


缩进

Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件,如果条件成立,则执行归属于if的一个代码块。

 

先看C语言的表达方式(注意,这是C,不是Python!

if ( i > 0 ){    x = 1;    y = 2;}

如果i > 0的话,我们将进行括号中所包括的两个赋值操作。括号中包含的就是块操作,它隶属于if。

 

在Python中,同样的目的,这段话是这样的

if i > 0:    x = 1    y = 2

在Python中, 去掉了i > 0周围的括号,去除了每个语句句尾的分号,表示块的花括号也消失了。

多出来了if ...之后的:(冒号), 还有就是x = 1 和 y =2前面有四个空格的缩进。通过缩进,Python识别出这两个语句是隶属于if。

 

Python这样设计的理由纯粹是为了程序好看。

 

if语句

写一个完整的程序,命名为ifDemo.py。这个程序用于实现if结构。

i = 1x = 1if i > 0:    x = x+1print x

$python ifDemo.py  # 运行

程序运行到if的时候,条件为True,因此执行x = x+1,。

print x语句没有缩进,那么就是if之外。

 

如果将第一句改成i = -1,那么if遇到假值 (False), x = x+1隶属于if, 这一句跳过。 print x没有缩进,是if之外,不跳过,继续执行。

 

这种以四个空格的缩进来表示隶属关系的书写方式,以后还会看到。强制缩进增强了程序的可读性

 

复杂一些的if选择:

复制代码
i = 1
if i > 0:
    print 'positive i' i
= i + 1elif i == 0:
    print 'i is 0' i
= i * 10else:
    print 'negative i' i
= i - 1
print 'new i:',i
复制代码

这里有三个块,分别属于if, elif, else引领。
Python检测条件,如果发现if的条件为假,那么跳过后面紧跟的块,检测下一个elif的条件; 如果还是假,那么执行else块。
通过上面的结构将程序分出三个分支。程序根据条件,只执行三个分支中的一个。



整个if可以放在另一个if语句中,也就是if结构的嵌套使用:

复制代码
i  = 5if i > 1:    print 'i bigger than 1'    print 'good'    if i > 2:        print 'i bigger than 2'        print 'even better'
复制代码

if i > 2 后面的块相对于该if缩进了四个空格,以表明其隶属于该if,而不是外层的if。

 

总结

if语句之后的冒号

以四个空格的缩进来表示隶属关系, Python中不能随意缩进

if  <条件1>:

    statement

elif <条件2>:

    statement

elif <条件3>:

    statement

else:

    statement


Python基础06 循环

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。

 

for循环

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

基本构造是

for 元素 in 序列:     statement

 

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

for a in [3,4.4,'life']:    print a

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

 

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

idx = range(5)print idx

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

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

(关于range(),还有丰富用法,有兴趣可以查阅, Python 3中, range()用法有变化,见评论区)

 

举例

for a in range(10):    print a**2

 

while循环

while的用法是

while 条件:    statement

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

 

举例

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

 

中断循环

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

break      # 停止执行整个循环

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

 

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

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

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

 

总结

range()

for 元素 in 序列:

while 条件:

continue

break


Python基础07 函数

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

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

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

 

函数的定义

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

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

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

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

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

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

c = a**2 + b**2        # 这一句是函数内部进行的运算

return c               # 返回c的值,也就是输出的功能。Python的函数允许不返回值,也就是不用return。

return可以返回多个值,以逗号分隔。相当于返回一个tuple(定值表)。

return a,b,c          # 相当于 return (a,b,c)

 

在Python中,当程序执行到return的时候,程序将停止执行函数内余下的语句。return并不是必须的,当没有return, 或者return后面没有返回值时,函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有,相当于C中的NULL。None多用于关键字参数传递的默认值。

 

函数调用和参数传递

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

print square_sum(3,4)

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

(Python有丰富的参数传递方式,还有关键字传递、表传递、字典传递等,基础教程将只涉及位置传递)

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

 

我们再看下面两个例子

复制代码
a = 1def change_integer(a):    a = a + 1    return aprint change_integer(a)print a#===(Python中 "#" 后面跟的内容是注释,不执行 )b = [1,2,3]def change_list(b):    b[0] = b[0] + 1    return bprint change_list(b)print b
复制代码

第一个例子,我们将一个整数变量传递给函数,函数对它进行操作,但原整数变量a不发生变化

第二个例子,我们将一个表传递给函数,函数进行操作,原来的表b发生变化

对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递

但是对于表来说,表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递

 

总结

def function_name(a,b,c):    statement    return something  # return不是必须的

函数的目的: 提高程序的重复可用性。

return     None

通过位置,传递参数。

基本数据类型的参数:值传递

表作为参数:指针传递


Python基础08 面向对象的基本概念

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

谢谢逆水寒龙,topmad和Liqing纠错

 

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

面向对象的最主要目的是提高程序的重复使用性我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的。了解OOP是进一步学习Python的关键。

下面是对面向对象的一种理解,基于分类。

 

相近对象,归为类

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

面向对象就是模拟了以上人类认知过程。在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) 的形式实现的。

 

可怜的summer,你就是个有毛产的蛋货,好不精致。

 

动作

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

这样的一些“行为”属性为方法(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)
复制代码

我们重新定义了鸟这个类别。鸟新增一个方法属性,就是表示移动的方法move。(我承认这个方法很傻,你可以在看过下一讲之后定义个有趣些的方法)

(它的参数中有一个self,它是为了方便我们引用对象自身。方法的第一个参数必须是self,无论是否用到。有关self的内容会在下一讲展开)

 

另外两个参数,dx, dy表示在x、y两个方向移动的距离。move方法会最终返回运算过的position。

在最后调用move方法的时候,我们只传递了dx和dy两个参数,不需要传递self参数(因为self只是为了内部使用)。

 

我的summer可以跑了。

 

子类

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

 

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

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

复制代码
class Chicken(Bird):    way_of_move = 'walk'    possible_in_KFC = Trueclass Oriole(Bird):    way_of_move = 'fly'    possible_in_KFC = Falsesummer = Chicken()print summer.have_featherprint 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)类,同样继承自鸟类。在创建一个黄鹂对象时,该对象自动拥有鸟类的属性。

 

通过继承制度,我们可以减少程序中的重复信息和重复语句。如果我们分别定义两个类,而不继承自鸟类,就必须把鸟类的属性分别输入到鸡类和黄鹂类的定义中。整个过程会变得繁琐,因此,面向对象提高了程序的可重复使用性

(回到问题1, 括号中的object,当括号中为object时,说明这个类没有父类(到头了))

 

将各种各样的东西分类,从而了解世界,从人类祖先开始,我们就在练习了这个认知过程,面向对象是符合人类思维习惯的。所谓面向过程,也就是执行完一个语句再执行下一个,更多的是机器思维。通过面向对象的编程,我们可以更方便的表达思维中的复杂想法。

 

总结

将东西根据属性归类 ( 将object归为class )

方法是一种属性,表示动作

用继承来说明父类-子类关系。子类自动具有父类的所有属性。

self代表了根据类定义而创建的对象。

 

建立对一个对象: 对象名 = 类名()

引用对象的属性: object.attribute


0 0
原创粉丝点击