1.前言
前面讲了一些关于python的一些基本的语法及语句,在这个地方继续讲python的方法及其python核心概念的面向对象。我们都知道python被称为面向对象的语言,那么在这里我们将正式的接触 的python的核心。
2.函数
定义:是可调用的,执行某种行为并返回一个值。判断一个函数是否可以调用,可以使用内置的callable函数。在下面的列子中,x返回false,cal返回true。
1 def cal():
2 return 'function'
3 x=1
4
5 print(callable(x))
6 print(callable(cal))
在上面的函数中,我们可以在括号中指定参数名称,这样就能把我们需要的参数传递到方法函数中。但在传递参数过程中,我们需要注意函数的作用域,即当前函数在某一段代码中起作用,在其他中无法访问。两个相同的值的变量,在表面现象,我们看起来吃相等的,但是实际在程序中他们是不等。对于在函数中赋值,同样会存在一个这个问题。例如:
1 names=['a','b','c']
2 n=names[:]
3
4 print(n is names)
5
6 print(n==names)
在 ‘n is names’返回false,而‘n==names’返回true。表面上我们看到的时候n和names的值相等,但是n不一定就是names,这里会涉及到引用的一个问题,我们在创建一个变量时,系统会自动为他分配一个相当于是一个唯一的标识,同理,在这个地方,我们同时创建了n和names,系统会分配不同的标识,虽然n是通过names赋值的。但在这里只能说他们的值相等,而不能说n就是names。
现在我们在函数中传递的参数都叫做位置参数,因为他们的位置是不可变的,如果将位置改变之后,那在对应调用函数时,传递参数的值的位置也需要发生改变,否则会发生参数传递错误的现象。在python中,我们可以对函数的参数赋默认值,这样当在调用函数时,如果不需要参入自己想要的参数,那么可以不传。方式为在参数后面紧跟默认值。
递归
在函数中,函数可以调用其它函数,但是也可以调用自己本身。对于调用自己本身的函数,我们一般称之为为递归。
在递归函数中主要包含两部分:
1.当函数之间返回值时,有基本实例
2.递归实例,包括一个或者多个问题较小部分的递归引用
关键在于将问题分解为小部分,递归不能永远的执行下去,否则就成了所谓的死循环。因为在递归中总以最小可能性问题结束,而这些问题有存储在基本实例中。
1 '''
2 阶乘
3 '''
4 def factorial(n):
5 if n==1:
6 return n
7 else:
8 return n*factorial(n-1)
9
10 '''
11 幂
12 '''
13 def power(x,n):
14 if n==0:
15 return 1;
16 else:
17 return x*power(x,n-1)
3.面向对象
对象:可以看作数据(特性)以及由一系列以存取/操作这样数据的方法所组成的集合。使用对象替代全局变量和函数的原因有很多,其中对象最重要的优点主要在以下几方面:
1.多态,可以将不同类的对象使用同样的操作
2.封装,对外部世界隐藏对象的工作细节
3.继承:以通用的类为基础建立专门的类对象
多态:不知道变量所引用的的对象类型是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。isinstance进行类型/类的检查
方法:绑定到对象特性上面的函数
封装:向程序中的其他部分隐藏对象的具体实现细节的原则
方法和函数的区别在于第一个参数是否为self。在类中的方法,默认第一个参数为self,特指当前的引用,而方法咋没有。
4.异常
在程序中,我们经常会遇到一些临界的界点情况,比如除数为0等情况。默认的解决办法是在进行操作之前,对数据进行判断筛选,但是当情况比较多的时候,这个时候做验证时就比较麻烦,而且不易于可读。在python中,存在一种异常处理的机制,使用try .............. except来进行异常的捕获处理。在正常的程序中,我们也可以使用raise来触发一个异常,结束当前的操作。
python中自置了比较常用的几种异常,但是它的基类为exception,我们可以手动的扩展异常的类型,来丰富我们的异常处理。当然我们也可以直接使用