文章目录
python数据分析学习笔记
第7节
一、递归
递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。
- 终止条件
表示递归什么时候结束。一般用于返回值,不再调用自己。 - 递归步骤
把第 n 步的值和第 n-1 步相关联
递归简单代码:
阶乘计算
def factorial(a):
if a==1:return 1
return a*factorial(a-1)
for i in range(1,6):
print(i,'!=',factorial(i))
二、嵌套
在函数内部进行定义,一层套一层,跟套盒子套娃一样
嵌套函数:
def f1():
print('f1 running..')
def f2():
print('f2 running..')
f2()
f1()
f2,在f1的内部进行调用,先执行f1,在执行f2
嵌套的使用场景
①封装 - 数据隐藏
外部无法访问“嵌套函数”。
②贯彻 DRY(Don’t Repeat Yourself) 原则
嵌套函数,可以让我们在函数内部避免重复代码。
③闭包
三、nonlocal
nonlocal 用来声明外层的局部变量。
global 用来声明全局变量。
四、LEGB 规则
LEGB 规则查找的顺序:
Local–>Enclosed–>Global–>Built in
Local 指的就是函数或者类的方法内部
Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global 指的是模块中的全局变量
Built in 指的是 Python 为自己保留的特殊名称。
如果某个 name 映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域 (enclosed)进行搜索,如果闭包作用域也没有找到,Python 就会到全局(global)命名空 间中进行查找,最后会在内建(built-in)命名空间搜索 (如果一个名称在所有命名空间 中都没有找到,就会产生一个 NameError)。
五、面向对象(重点)
python里一切皆对象
1、面向过程(Procedure Oriented)思维
所谓面向过程,就是执行者的思维,定义要完成的任务,一步步去完成,首先干什么,其次干什么,在干什么。这就是面向过程。面向过程能操作小规模程序
2、面向对象(Object Oriented)思维
面向对象就是怎么设计这个产物或者是事物,不是怎么去完成他的步骤。面向过程能操作大规模程序
注:面向对象离不开面向过程,他们是相辅相成的,千万不要把面向过程和面向对象对立起来。
3、面向对象如何思考
先找名词(面向对象)(面向过程是找动词),然后确立这些名词那些可以坐类再根据问题需求确定的类的属性和方法,确定类之间的关系。
4、类的定义
我们把对象比作一个“饼干”,类就是制造这个饼干的“模具”。
通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起。
对象是类的具体实体,一般称为“类的实例”。类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”。
从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属 性值(不共享状态)。更具体一点:“方法代码是共享的,属性数据不共享”。
注:python中类也是对象
定义类的语法格式如下:
class 类名:
类体
典型类的定义;
class Student:
def __init__(self,name,score): #构造方法第一个参数必须为 self
self.name = name #实例属性
self.score = score
def say_score(self): #实例方法
print(self.name,'的分数是:',self.score)
s1 = Student('张三',80) #s1 是实例对象,自动调用__init__()方法
s1.say_score()
5、__init__构造方法和__new__方法
一个python对象包含:
① id(identity 识别码)
②.ype(对象类型)
③value(对象的值)
(1) 属性(attribute)
(2) 方法(method)
创建对象,我们需要定义构造函数__init__()方法。构造方法用于执行“实例对象的初始化工 作”,即对象创建后,初始化当前对象的相关属性,无返回值。
init()的要点:
①名称固定,必须为:init()
②第一个参数固定,必须为:self。 self 指的就是刚刚创建好的实例对象。
③构造函数通常用来初始化实例对象的实例属性
def __init__(self,name,score):
self.name = name #实例属性
self.score = score
④. 通过“类名(参数列表)”来调用构造函数。调用后,将创建好的对象返回给相应的变量。
⑤ __init__()方法:初始化创建好的对象,初始化指的是:“给实例属性赋值”
⑥__new__()方法: 用于创建对象,但我们一般无需重定义该方法。
⑦ 如果我们不定义__init__方法,系统会提供一个默认的__init__方法。如果我们定义了带参 的__init__方法,系统不创建默认的__init__方法。
注:
Python 中的 self 相当于 C++中的 self 指针,JAVA 和 C#中的 this 关键字。Python 中, self 必须为构造函数的第一个参数,名字可以任意修改。但一般遵守惯例,都叫做 self。
6、实例属性方法
①实例属性一般在__init__()方法中通过如下代码定义: self.实例属性名 = 初始值
②在本类的其他实例方法中,也是通过 self 进行访问: self.实例属性名
③ 创建实例对象后,通过实例对象访问:
obj01 = 类名() #创建对象,调用__init__()初始化属性 obj01.实例属性名 = 值 #可以给已有属性赋值,也可以新加属性。
实例方法是从属于实例对象的方法:
def 方法名(self [, 形参列表]):
函数体
方法调用:
对象.方法名([实参列表])
函数和方法区别
①都是用来完成一个功能的语句块,本质一样。
②方法调用时,通过对象来调用。方法从属于特定实例对象,普通函数没有这个特点。
③直观上看,方法定义时需要传递 self,函数不需要。
其他方法:
① dir(obj)可以获得对象的所有属性、方法
②obj.dict 对象的属性字典
③ pass 空语句
④isinstance(对象,类型) 判断“对象”是不是“指定类型”
7、内存分析实例对象和类对象创建过程(重点)
class Student:
company = "尚学堂" #类属性
count = 0 #类属性
def __init__(self,name,score):
self.name = name #实例属性
self.score = score
Student.count = Student.count+1
def say_score(self): #实例方法
print("我的公司是:",Student.company)
print(self.name,'的分数是:',self.score)
s1 = Student('高淇',80)
s1.say_score() #s1 是实例对象,自动调用__init__()方法
print('一共创建{0}个 Student 对象'.format(Student.count))
8、__del__方法(析构函数)和垃圾回收机制
__del__方法称为“析构方法”,用于实现对象被销毁时所需的操作。比如:释放对象 占用的资源,例如:打开的文件资源、网络连接等。
可以通过 del 语句删除对象,从而保证调用__del__方法
系统会自动提供__del__方法,一般不需要自定义析构方法。
#析构函数
class Person:
def __del__(self):
print("销毁对象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")