python基础----Day09

内容概要:

  1. 集合
  2. 数据结构和算法
  3. 面向过程和面向对象的思想理解
  4. 面向对象的术语与名称小结

一.集合

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()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w沉默味道w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值