循环
for循环
for循环一般用于预先知道循环次数n,然后执行for循环体内的语句n次,在c/c++中for循环语句是这样的:for(int i=0;i<10;i++) { cout<<i<<endl; }
而同样的代码再Python中却不太一样:
i=0 for i in range(10): print i
其中range(n)表示的是0到n-1的数,上面的range(10)也可以直接写作[0,1,2,3,4,5,6,7,8,9]或者(0,1,2,3,4,5,6,7,8,9)。
range()是一个函数,其定义为(上限本身是不包含在内的):
range(stop) range(start, stop, [step])
while循环
while循环一般用在不知道循环实际次数的情况下:while 条件 函数体
当条件返回值为真时,就会一直执行函数体的代码,直到判断条件为假时停止循环。
中断循环
中断循环有两种
1、continue:在循环的某一次执行中,如果遇到continue, 那么跳过这一次执行,进行下一次的操作
2、break :停止执行整个循环
函数
函数就是封装好了的一段代码集合,方便你重复使用,函数一般来讲有函数的参数,返回值。
前面提到的range()就是一个函数。
函数的定义
函数定义的基本格式:def 函数名([参数1,参数2,参数3...]): 函数体 .... [return (对象1,对象2,对象3...)]
可以看见函数使用def这个关键字来定义,后面紧跟函数名,参数用小括号括起来,可以没有或者多个参数,用逗号隔开,最后是返回值,返回值可以有多个(相当于返回一个tuple元组)或者没有(没有返回值就可以不写return),它可以表示该函数执行后的结果,对象在后面会详细讲解,前面已经提到过基本数据类型都可以看做对象,序列,元组也可以看做对象。
下面举一个函数例子:
(注意在Python中有一个特殊的对象,就是None对象,它相当于C中的NULL,如果函数中没有return或者return后面没有对象,则Python默认返回None对象)函数的调用和参数传递
函数的调用就是根据函数名和函数的参数进行调用,然后输出返回值或者将其返回值赋值给一个对象。
调用上面的函数:
(注意,函数声明必须在调用之前,否者会报错。)
上面的列子中Python通过位置,知道2对应的是函数定义中的第一个参数left, 3对应第二个参数right,然后把参数传递给函数square_sum。
(Python有丰富的参数传递方式,还有关键字传递、表传递、字典传递等,现在只涉及位置传递)再看两个例子:
注意这两个例子,第一个例子中实参a传递给形参integer,integer自加1,函数值返回为6,但是实参a的值却没有改变,仍然是5。第二个例子中把一个链表当做实参传递进去,函数体中将实参进行更改,可以看到实参L也发生了改变。原因是什么呢?
因为对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量(值传递); 但是对于表来说,表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量(指针传递,引用传递)。
面向对象
Python使用类class和对象object,进行面向对象的编程。
有过C++基础的人会对面向对象特别熟悉和亲切,下面介绍Python中的类的一些特点。
什么是类
类其实正如该字的意义,就是我们认为可以划分为一类的事物的总称,比如无论是奥迪 宝马 奔驰它们都属于汽车这一类;戴尔 联想 Mac都属于个人电脑这一类。因此车和电脑就可以看做一类。比如车类有自己的共同属性,轮胎 发动机 车身等等,而至于奥迪 奔驰 宝马可以看车的子类,因为不同品牌的车又在其父类车的基础上有自己特有的属性,比如奥迪的车标和宝马的就不一样等等。对象就可以对应到一辆具体的车的产品,比如你家的宝马车就是一个对象。
下面就上面的例子,我们先创建一个Car类:
(因为是父类,所以只知道车有哪些属性,但是还不知道引擎和轮胎具体是怎样的,所以初始赋值为没有。)动作
上面这个类只有属性,要知道一个类除了属性还应该有行为(动作),比如车类共有的行为是刹车或者启动,但是每一款车实现刹车或启动的方法又不一样,下面我们给车类添加一些方法:
注意:类中的这些方法无论有没有参数,其第一参数必须有,就是self,但是在后面调用的时候直接忽略该参数,它可以看作是当前类的一个实例,相当于C++中的this。子类
上面的车类其实是没有多少实际意义的,因为它的引擎、轮胎具体是什么或者是到底用钥匙启动还是按钮启动,刹车到底是不是用防抱死装置,这些都不知道, 这时候就有了宝马奔驰这些实际厂商来根据自己的理念和设计观念来实现这些具体的属性和方法,下面创建车的子类:
可以看到这时候输出来的属性和执行的方法和父类的显示的不一样,这就是子类对父类的重写,如果子类某些属性或者是方法没有被更改,则默认继承父类的。
#后面的语句是注释,不会被执行,所以这时候输出来的tire属性就显示的没有tire。调用类的其他信息
刚才提到,在定义方法时,必须有self这一参数。这个参数可以看做该类的一个内在无名对象。该对象拥有类的所有性质(如果学习过Java 或C++等语言的便会知道,self相当于this),那么我们可以通过self,调用类属性。
我们在刚刚的Bmw类中,添加一个可以更换轮胎的函数:
可以看到该方法调用了类的属性,并且修改了它的值,如果不加这个self:
同样对于方法之前也需要加self:
如果不加self它会把launch函数看作是一个外部函数,如果之前又没有定义该函数,则会报错。_init_()方法
_init_()是一个特殊方法(sepcial method)。Python有一些特殊方法。Python会特殊对待他们,特殊方法的特点就是在名字前后有两个下划线。
如果你在类中定义了__init__() 这个方法,创建对象时,Python会自动调用这个方法。这个过程也叫初始化。
我们在Bmw中添加一个初始化函数,
然后我们仅仅创建一个对象,初始化函数就会自动执行:
对象的性质
我们讲到了许多属性,但这些属性是类的属性。所有属于该类的对象会共享这些属性。比如说,鸟都有羽毛,鸡都不会飞。在一些情况下,我们定义对象的性质,用于记录该对象的特别信息。比如说,人这个类。性别是某个人的一个性质,不是所有的人类都是男,或者都是女。这个性质的值随着对象的不同而不同。李雷是人类的一个对象,性别是男;韩美美也是人类的一个对象,性别是女。当定义类的方法时,必须要传递一个self的参数。这个参数指代的就是类的一个对象。我们可以通过操纵self,来修改某个对象的性质。面向对象总结
正如我们说将,当你创建了一个表时,其实就相当于创建了list类的一个对象,既然list是一个类,那它可定也有一些方法:
运算符是特殊的方法
先看一个例子:
可以看到list中的__add__()方法和+是有相同的功能的,其实也就是C语言中的运算符重载。如果想要使用-号:
可以看到这里报错了,因为不存在这个-号,也不存在__sub__()这个函数。
我们可以自己实现__sub__()函数,从而实现-号
内置函数__sub__() 定义了“-”的操作:从第一个表中去掉第二个表中出现的元素。如果__sub__() 已经在父类中定义,你又在子类中定义了,那么子类的对象会参考子类的定义,而不会载入父类的定义。任何其他的属性也是这样。
参考资料:
https://www.shiyanlou.com/courses/214/labs/649/document
注:转载请注明原文出处:
作者:CUG_UESTC
出处:http://blog.csdn.net/qq_31192383/article/details/53725338