内容概要:
- 集合
- 数据结构和算法
- 面向过程和面向对象的思想理解
- 面向对象的术语与名称小结
一.集合
1.什么是集合?
百度百科:由一个或多个确定的元素所构成的整体
python中:集合是没有 value 的字典
2.集合的特点:
- Python 语言提供的内置数据结构
- 与列表、字典一样都属于可变类型的序列
- 集合是无序可变序列,元素不能重复, 实际上, 集合底层是字典实现, 集合的所有元素都是字典中的
键对象
, 因此是唯一且不能重复的.
3.集合元素的储存
集合中元素在存储的时候, python中的 set 集合内部会对元素实现位置算法的运算.
例如:
set1 = {3, 5, 1, 2, 6, 8, 9 ,7, 4}
print(set1)
运行得到:
发现输出结果自动排序了
如果不是数字呢?
set1 = {'陆小果', '天下无贼', '认贼作父', '贼眉鼠眼'}
print(set1)
第一次运行:
第二次运行:
发现输出的人名顺序不同…
这是由于python底层算法的缘故,底层以时间为变量(时间时刻变化),输出的结果因此不同
4.集合中的数学计算(交集、并集…)
- 交集: intersection 或者 & (与符号)
if __name__ == '__main__':
num_set1 = {10, 20, 30}
num_set2 = {20, 30, 40}
r1 = num_set.intersection(num_set2)
print(r1)
print('-'*10)
r2 = num_set1 & num_set2
print(r2)
- 并集:union 或者 | (或符号)
if __name__ == '__main__':
num_set1 = {10, 20, 30}
num_set2 = {20, 30, 40}
r1 = num_set1.union(num_set2)
# r1 = num_set1 | num_set2
- 差集:difference 或者 - (减符号)
if __name__ == '__main__':
num_set1 = {10, 20, 30}
num_set2 = {20, 30, 40}
r1 = num_set1.difference(num_set2)
# r1 = num_set1 - num_set2
- 对称差集: symmetric_difference 或者 ^ (异或符号)
if __name__ == '__main__':
num_set1 = {10, 20, 30}
num_set2 = {20, 30, 40}
r1 = num_set1.symmetric_difference(num_set2)
# r1 = num_set1 ^ num_set2
二.数据结构和算法
python的程序 = 数据结构 + 算法 (别忘了去图书馆找找有木有数据结构和算法的书嫖一本)
数据结构 : 线性列表, 单链表, 双链表, 循环链表, 二叉树, B树, B+树, B-树, 图, 映射表 …
算法: 排序算法(十种), 数据压缩算法, 数结构相关的算法(前序遍历, 中序遍历, 后续遍历), 深度优先
算法, 广度优先算法 …
python语言提供的数据结构有: list, dict,tuple,set
具体见知乎:什么是数据结构与算法
ps:其实目前我啥也不懂
三.面向过程和面向对象的思想理解
(找对象不积极,思想有问题)😆
编程界的两大阵营:面向过程(c…)、面向对象(python…):
python中一切皆对象
python中行为:
List 列表 : list.append(), list.pop(), list.insert(), list.extend() …
Str 字符串 : str.index(), str.lower(), str.split(), str.join()
对象执行行为后要接收其结果,因此我们之前写的代码都为:
result = list.append(['××'])
上面均为一些面向对象的理解,下面开始正式介绍python面向对象编程
1.类和对象
面向对象的思想中提出两个概念, 即 类和对象. 类是对某一类事物的抽象描述.而对象用于
表示现实中该类事物的个体.对象是根据类创建的.并且通过一个类可以创建多个对象.
类的定义 : 类是对象的抽象,它用于描述一组对象的共同特征和行为.类中可以定义成员变量和成员
方法.其中成员变量用于描述对象的特征,也被称作属性,成员方法用于描述对象的行为.可简称为方
法
例如, 在真实世界的校园里有学生和老师, 学生有学号, 姓名, 所在班级等数据 (数据), 还
有学习, 提问, 吃饭和走路等动作 (方法), 如果我们要开发一个校园管理系统, 那么在构建
软件系统时, 也会有学生和老师等 类
, 张同学, 李同学是学生类的个体, 被称为 对象
, 对象(object)也称为实例对象 (instance).
总结:
类是统称,是抽象的,不能直接使用. 对象是具体存在的.可以直接使用
(学生 - > ‘王泓哲’)
2.自定义类和对象
如果在程序开发中,涉及到一些对象,而 python 语言没有为我们提供该怎么办???
解决:学习如何自定义类,再自定义对象.
类是对象的模板,必须先有类再有对象,
因此:
首先将数据和行为捆绑在一起,设计到类中
未来就可以使用这个类创造出对象
再使用对象执行这些数据和行为
设计类的三要素:类名、数据、行为
1.类名 : 描述的一个抽象类, 需要类名, 类名定义的规范, 首字母大写.
2.数据 : 这类事物具有哪些共有的属性 / 数据. (与生俱来)
3.行为 : 这类事物具有哪些行为 / 功能 / 方法. (表示可以执行的)
下面开始实践环节:
#需求:
'''
1.类名:car
2.数据:brand, color, wheel_number
3.行为:run()
'''
#设计一个car类, 注意: 所有类的名称都应该使用大写字母开头
class Car:
# 数据
# 规范:所有对象的数据全部都要写在init()方法中
# 方法类似与函数,只有函数可以直接调用,而方法必须使用对象才能调用
def _init_(self, brand, color, wheel_number): # self表示的是栈区中的内存空间
#对象数据的赋值
self.brand = brand
self.color = color
self.wheel_number = wheel_number
#行为:
def run(self):
print(f'{self.wheel_number}个轮子的{self.brand}牌{self.color}的车正在飞奔')
#行为的内部全部需要使用 self.数据 的方法来获取对象的数据
#需求:通过类模板来创建不同的对象
#格式:对象名称 = 类名(数据1, 数据2, 数据3)
if __name__ == '__main__':
car1 = Car('兰博基尼', '白色', 4)
car1.run()
上述代码详解:
图片:
语言描述:
首先识别 主方法/主函数 if name == ‘main’: 主方法入栈(push)
接着遇到car1 = Car(),类第一次被调用时,Car这个类就会被储存到代码区中(code_zone)
然后Car(*, *, *) 一个类名+(),init方法会被调用,init方法入栈,在栈区中被执行
self表示存储对象数据的堆区的内存空间地址
self.brand = brand 将输入的brand存储在堆区的内存空间中
self.color = color 将输入的color存储在堆区的内存空间中 (都是局部变量)
self.wheel_number = wheel_number 将输入的wheel_number存储在堆区的内存空间中
全部数据储存完毕后,init方法执行完毕,会将self的地址返回给对象(car1),因此这两个地址相同car1.run() 紧接着,car1调用run方法, 类行为中也有self,这个self,谁调用它,它就指向谁,car1调用run,因此指向car1,这两个的地址也是相同的
因此在run方法中,访问的self都是car1的数据
run()方法结束,弹栈(pop)
每一个对象在堆区中都有一块独立的内存空间
3.对数据(属性)进行控制
需求:Student类的age需要控制在1-18
方法一:
#定义Student类
class Student:
def __init__(self, name, age, gender)
self.name = name
if 1 < age < 18: #在这里进行条件判断
self.age = age
else:
pass
self.gender = gender
def run(self):
print(f'大家好,我叫{self.name},我今年{self.age}岁了,性别:{self.gender},爱好女')
stu1 = Student('网红鸡', 18, '下头男')
存在问题:在self.ag处进行条件判断不规范
方法二:
#定义Student类
class Student:
def __init__(self, name, age, gender)
self.name = name
self.age = age
self.gender = gender
def run(self):
print(f'大家好,我叫{self.name},我今年{self.age}岁了,性别:{self.gender},爱好女')
@property #获取数据
def age(self):
return self.__age
@age.setter #设置数据
def age(self, age):
if 1 <= age <= 18:
self.__age = age
else:
self.age = 1
stu1 = Student('网红鸡', 18, '下头男')
四.面向对象术语与名称的小结
1.init()方法: 实现对象数据的初始化,被称为初始化方法/构造方法(constructor method)
2.对象方法:第一个默认参数是self,不能删除不能省略
3.实例:就是通过类这个模板创建出来的对象,称为实例
4.成员变量:self地址中存储的数据被称为成员变量,成员指的是对象,成员变量也被称为对象变量,存储在堆区中(heap),堆区中的数据不会弹栈销毁.如果一个对象没有任何引用了,python的垃圾回收机制会自动回收堆区中的空间,让出空间让其他对象继续使用.
5.实例方法:就是对象方法,对象也被称为实例对象
五.函数与方法的区别
1.函数:直接调用传参即可 study(book)
2.方法:必须使用具体的对象才能实现调用 stu1.study()