文章目录
文章免费配套资料:Python2与Python3区别的思维导图
一、对象
1.1 对象的简介
Python中,一切皆对象。每个对象由:标识(identity)
、类型(type)
、value(值)
组成。
标识符
用于唯一标识对象,通常对应于对象在计算机内存中的地址
。使用内置函数id(obj)类型
用于表示对象存储的"数据" 的类型
。类型可以限制对象的取值范围以及可执行的操作。可以使用type(obj)
获得对象的所属类型值
表示对象所存储的数据的信息。使用 print(obj) 可以直接打印出值
对象的本质就是:一个内存块,拥有特定的值,支持特定类型的相关操作
a = 3
b = '我爱你'
- 在内存中表现为
1.2 类对象与实例对象的内存分析
1.3 @property 装饰器
@property 可以将一个方法的调用方式变成 “属性调用”
class Employee:
def __init__(self,name,salary):
self.__name = name
self.__salary = salary
# @property 可以使标注的函数的调用方式变为属性形式的调用
# 调用方式:instance.method() ---> instance.method
@property
def salary(self):
return self.__salary
# @salary.setter 可以使标注的带一个参数函数的调用方式变为属性形式的调用
# 调用方式:instance.method(param1) ---> instance.method = 1
@salary.setter
def salary(self,salary)
if 1000 < salary<50000:
self.__salary = salary
else:
print("录入错误!薪水在 1000 --- 500000 这个范围")
"""
一般的 setter 与 getter 方法
def get_salary(self):
return self.__salary
def set_salary(self,salary):
if 1000 < salary<50000:
self.__salary = salary
else:
print("录入错误!薪水在 1000 --- 500000 这个范围")
"""
二、引用
在Python中,变量
也称为:对象的引用
。因为,变量存储的就是对象的地址,变量通过地址引用了 “对象”
变量位于:栈
内存(压栈出栈等细节,后续再介绍)
对象位于:堆
内存
-
Python 是动态类型语言
变量不需要显式声明类型。格努变量引用的对象,Python 解释器自动确定数据类型 -
Python 是强类型语言
每个对象都有数据类型,只支持该类型支持的操作
a=3
b='我爱你'
- 在内存中表现为
三、变量的声明和赋值
变量的声明和赋值用于将一个变量绑定到一个对象上,格式如下:
变量名 = 表达式
- 注意:由于变量的类型是由其赋值的数据所决定的,因此在使用变量之前必须初始化变量
四、链式复制、系列解包、常量
4.1 链式复制
链式复制用于同一个对象复制给多个变量
x=y=123
相当于:x=123;y=123
4.2 系列解包赋值
https://baijiahao.baidu.com/s?id=1619881782612555450&wfr=spider&for=pc ---- Python中 * 和 ** 的打包和解包,你真的理解了吗?
系列数据赋值给对应相同个数的变量(个数必须保持一致)
a,b,c=4,5,6
相当于 a=4;b=5;c=6
4.3 常量
Python 不支持常量,即没有语法规则限制改变一个常量的值。我们只能约定常量的命名规则,以及在程序的逻辑上不对常量的值作出修改
五、整数缓存问题
Python仅仅对比较小的整数对象进行缓存(范围为[-5,-256]
)缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在 Pycharm 或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化(范围是[-5,任意正整数])
六、字符串相关
6.1 字符串驻留机制
字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。Python 支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_)、字母和数字)会启用字符串驻留机制
a = 'abd_33'
b = 'abd_33'
a is b # True
c = 'dd#'
d = 'dd#'
# 由于 c 与 d 指向的字符串对象不符合标识符规则,因此不启用驻留机制
c is d # False
str1 = 'aa'
str2 = 'bb'
str1+str2 is 'aabb' # False
str1 + str2 == 'aabb' # True
- 字符串只在
编译时
进行驻留,而非运行时。因此
a = 'ab' + 'c' is 'abc'
print(a) # 输出 True
ab = 'ab'
b = ab + 'c' is 'abc'
print(b) # 输出 False
第一个’ab’+‘c’是在compile-time(编译期)求值的,被替换成了’abc’,所以输出为True;第二个示例,ab+'c’是在run-time(运行期)拼接的,导致没有被自动intern
参看:https://www.jb51.net/article/164190.htm ---- Python中的 is 和 == 以及字符串驻留机制详解
https://www.jianshu.com/p/9660f399ac98 ---- Python的字符串驻留机制
6.2 对比字符串中的 + 与 join 方法
- 使用 + 首先需要知道的是,在python中字符串属于
不可变对象
。 当用操作符+
连接字符串的时候,由于字符串是不可变对象,其工作原理实际上是这样的:如果要连接如下字符串:S1+S2+S3+…+SN,执行一次+操作便会在内存中申请一块新的内存空间
,并将上一次操作的结果和本次操作的右操作数复制到新申请的内存空间,即当执行S1+S2的时候会申请一块内存,并将S1、S2复制到该内存中,依次类推,这样就要进行N-1
次内存空间的申请了,非常影响效率。 - 使用 join 当使用join时,
会一开始就计算出所需要的总的内存空间
,也就是说只需要进行一次内存空间的申请,相比 使用 + ,效率提升巨大。
参看:python字符串拼接+和join的区别详解 ---- https://www.jb51.net/article/201267.htm