一、同一运算符
同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址。
运算符 | 描述 |
---|---|
is | is是判断两个标识符是不是引用同一个对象 |
is not | is not是判断两个标识符是不是引用不同对象 |
is 与 == 区别:
1. is 用于判断两个变量引用对象是否是同一个,即比较对象的地址。
2. == 用于判断引用变量引用对象的值是否相等,默认调用对象的__eq__()
方法。
整数缓存问题:
Python仅仅对比较小的整数对象进行缓存(范围在[ -5 , 256 ]),而非是所有整数对象。需要注意的是,这仅仅是在命令行中执行。在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一些优化(范围是[ -5 , 任意正整数 ])。
说是这么说的,但是我在用Pycharm测试的时候发现,不管怎么测,即使超过了整数缓冲池的大小,仍然返回结果为True。使用的python版本是3.10.0的,Pycharm是2021.2.3。
#测试整数缓存问题
a = -5
b = -5
print(a is b) #输出True
a = -6
b = -6
print(a is b) #输出True
a = -100000000
b = -100000000
print(a is b) #输出True
a = 256
b = 256
print(a is b) #输出True
a = 100000000
b = 100000000
print(a is b) #输出True
但用Python自带的Idea测试,这话没毛病,可能是Pycharm做了优化吧。
Python 3.10.0 (tags/v3.10.0:b494f59, Oct 4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = -5
>>> b = -5
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a is b
False
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
二、字符串
① 定义
字符串的本质:字符序列。python的字符串是 不可变 的,无法对原字符做任何修改。可以将字符串的一部分复制到新创建的字符串,达到“ 看起来修改 ”的效果。◎●机智●◎
Python不支持单字符类型,单字符也是作为一个字符串使用。
② 字符串的编码
Python3直接支持Unicode,可以表示世界上任何书面语言的字符。Python3的字符默认是16位Unicode编码,ASCII码是Unicode编码的子集。
使用 内置函数 ord() 可以把字符串转成对应的Unicode码;
使用 内置函数 chr() 可以把十进制数字转换成对应的字符。
③ 创建字符串
我们可以通过单引号或双引号创建字符串。两者配合使用,效果更加。
#创建字符串测试
a = "han han yuan"
print(a) #输出:han han yuan
b = '憨憨缘'
print(b) #输出:憨憨缘
c = "I‘m 憨憨缘"
print(c) #输出:I'm 憨憨缘
d = 'I\'m 憨憨缘'
print(d) #输出:I'm 憨憨缘
我们还可以使用连续的三个 单引号 或 双引号,可以帮助我们创建多行字符串。
str = '''name:"憨憨缘" age:"22" have girlfriend:"yes" '''
print(str) #输出:name:"憨憨缘" age:"22" have girlfriend:"yes"
④ 空字符串与 len() 函数
Python允许 空字符串 存在,不包含任何字符且长度为0。
len() 函数 用于计算字符串包含多少字符。
#空字符串 len()函数 的测试
a = ""
print(len(a)) #输出:0
name = "憨憨缘"
print(len(name)) #输出:3
⑤ 转义字符
我们可以使用“\ + 特殊字符”,实现某些难以用字符表示的效果。比如:换行等。常见的转义字符如下:
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\’ | 单引号 |
\ " | 双引号 |
\b | 退格(Backspace) |
\n | 换行 |
\t | 横向制表符 |
\r | 回车 |
⑥ 从控制台读取字符串
可以使用 input() 从控制台读取键盘输入的内容。
#测试控制台输入显示
#写法一
print("请输入:",end="") # end="" 作用:控制 打印不换行
a = input() #输入:憨憨缘
print(a + ",你好") #输出:憨憨缘,你好
#写法二
print(input("请输入:") + ",你好") #①显示:请输入: ②输入:憨憨缘 ③输出:憨憨缘,你好
⑦ str() 实现数字转型字符串
str() 函数可以将其他类型数据转换成字符串。
# 其他类型 转 字符串 输出 测试
a = 125
b = str(a)
print("a'type:", type(a), "\nb'type:", type(b), b)
# 输出
# a'type: <class 'int'>
# b'type: <class 'str'> 125
c = 56.12
d = str(c)
print("c'type:", type(c), "\nd'type:", type(d), d)
# 输出
# c'type: <class 'float'>
# d'type: <class 'str'> 56.12
e = 1.26e2
f = str(e)
print("e'type:", type(e), "\nf'type:", type(f), f)
# 输出
# e'type: <class 'float'>
# f'type: <class 'str'> 126.0
⑧ 使用[ ]提取字符
字符串的本质就是字符序列。
a = "abcdefghijklmnopqrstuvwxyz"
print(a[0],a[25]) #输出:a z
⑨ replace() 实现字符串替换
使用replace()函数时,实际上只是创建了新的字符串对象,并指向它,原对象并未改变。在Python中,字符串是不可被改变的。
# replace()函数的使用
a = "abcdefghijklmnopqrstuvwxyz"
print(a.replace("b","憨")) # 输出:a憨cdefghijklmnopqrstuvwxyz
print(a) # 输出:abcdefghijklmnopqrstuvwxyz
b = a.replace("b","憨")
print(b) # 输出:a憨cdefghijklmnopqrstuvwxyz
print(b is a.replace("b","憨")) # 输出:False
print(b == a.replace("b","憨")) # 输出:True
print(id(a)) # 输出:2011065801328
print(id(a.replace("b","憨"))) # 输出:2011065903280
print(id(b)) # 输出:2011065902384
注:可以发现,b 和 a.replace(“b”,“憨”)不是同一个对象。a.replace(“b”,“憨”)其实是一个临时地址,暂存数据用的。
⑩ 字符串切片 slice 操作
切片 slice 可以快速提取字符串。标准格式为:
[起始偏移量 start : 终止偏移量 end : 步长 step]
三个量均为正数时 a = “abcdefghijklmnopqrstuvwxyz” |
---|
操作和说明 | 示例 | 结果 |
---|---|---|
[:] 提取整个字符串 | a[:] | abcdefghijklmnopqrstuvwxyz |
[start:] 从start索引开始到结尾 | a[2:] | cdefghijklmnopqrstuvwxyz |
[:end] 从头开始到end-1 | a[:2] | ab |
[start:end] 从start到end-1 | (a[1:2] | b |
[start: end: step] | a[1:5:2] | bd |
# slice函数的使用
a = "abcdefghijklmnopqrstuvwxyz"
print(a[:]) # 输出:abcdefghijklmnopqrstuvwxyz
print(a[2:]) # 输出:cdefghijklmnopqrstuvwxyz
print(a[:2]) # 输出:ab
print(a[1:2]) # 输出:b
print(a[1:5:2]) # 输出:bd
三个量为负数时 a = “abcdefghijklmnopqrstuvwxyz” |
---|
操作和说明 | 示例 | 结果 |
---|---|---|
[-start:] 倒数的第start开始到结尾 | a[-3:] | xyz |
[-start:-end] 从倒数的第start索引开始到倒数的第end位 | a[-8:-3] | stuvw |
[::-step] 步长为负,从右到左提取 | a[::-1] | zyxwvutsrqponmlkjihgfedcba |
a = "abcdefghijklmnopqrstuvwxyz"
print(a[-3:]) # 输出:xyz
print(a[-8:-3]) # 输出:stuvw
print(a[::-1]) # 输出:zyxwvutsrqponmlkjihgfedcba
⑪ split() 分割和 join() 合并
split() 可以基于指定分隔符将字符串 分隔成 多个子字符串(储存到列表中)。如果不指定分隔符,则默认使用空白字符(换行符/空格/制表符)。
join() 的作用和 split() 作用相反,用于将一系列子字符串 连接 起来。
# split()函数 与 join()函数 的使用
a = "I love you"
print(a.split()) # 输出:['I', 'love', 'you']
b = a.split()
print(b[0],b[1],b[2]) # 输出:I love you
print(b) # 输出:['I', 'love', 'you']
c = ''
print(c.join(b)) # 输出:Iloveyou
# 也可以写成这样
# print(''.join(b))
d = ' '
print(d.join(b)) # 输出:I love you
# 也可以写成这样
# print(' '.join(b))
e = '\n'
print(e.join(b))
# 也可以写成这样
# print('\n'.join(b))
# 输出:
# I
# love
# you
str = "to be not to be"
print(str.split('to')) # 输出:['', ' be not ', ' be']
使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。推荐使用join()函数,因为jion()函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
# 测试 使用字符串拼接符+ 与 使用join()函数 运行时间对比
import time
time_start1 = time.time()
a = ""
for i in range(1000000):
a += "hanhanyuan"
time_end1 = time.time()
print("运行时间:" + str(time_end1 - time_start1))
# 输出:运行时间:3.7516746520996094
time_start2 = time.time()
arr = []
for i in range(1000000):
arr.append("hanhanyuan")
str1 = "".join(arr)
time_end2 = time.time()
print("运行时间:" + str(time_end2 - time_start2))
# 输出:运行时间:0.12798738479614258