字符串
字符串是python中最常用的数据类型,一般用单引号或者双引号来创建字符串(必须成对)。
a = 'hello'
b = "python"
print(type(a)) #<class 'str'>
print(type(b)) #<class 'str'>
1、字符串里面输出单引号或者双引号:
#第一个单引号和第二个单引号匹配成对了,第三个单引号成单身的了,m Tom'成了多余的内容,就会报错了
s = 'I'm Tom' #SyntaxError: unterminated string literal (detected at line 20)
#使用不同的引号
s = "I'm Tom"
print(s)
#使用转义字符
s1 = 'I\'m Tom'
print(s1)
2、字符串的换行,在行尾添加\
字符串比较长,在要换行的地方添加转义字符进行换行,表达式也可以换行,这样子做的字符串输出时,是不换行的:
s = 'One day,a monkey drove \
his car near a lake.Sudden,\
he saw a tiger under a 。'
print(s) #One day,a monkey drove his car near a lake.Sudden,he saw a tiger under a 。
a = 10+3/2+\
2**3
print(a) #19.5
3、长字符串(多行字符串),用三对单引号或者三对双引号(字符串内容原样输出,支持换行):
不需要在换行的地方加\。字符串里面的换行,空格,缩进,以及单引号和双引号等都会原样输出。
若是不把长字符串的值赋给任何变量,那就相当于被注释了,不起任何作用。
s1 = '''java'''
print(type(s1)) #<class 'str'>
str2 = """hello
python
java
"""
print(str2) #字符串原样输出,换行符也输出
print(type(str2)) #<class 'str'>
str3 = 'hello' \
'word'
print(str3) #只是代码换行了。不加换行符就输出
4、原始字符串
python中比较特殊的字符串,以R或者r开始。在原始字符串中,反斜杠”\”不表示转义字符,字符串中的内容原样输出。具体的在‘Python中的原始字符串’一文中有详细介绍。
驻留机制
只保存一份相同且不可变字符串的方法。不同的值存放在字符串的驻留池中,python的驻留机制对相同的字符串只保留一份拷贝,后面再创建相同的字符串时,便不会再开辟新的内存空间,而是直接把该字符串的地址赋值给新创建的变量。
比喻说
a = 'python'
b = "python"
c = '''python'''
print(a,id(a)) #python 2354997970928
print(b,id(b)) #python 2354997970928
print(c,id(c)) #python 2354997970928
a,b,c三个变量的值相同,类型和标识也都相同。
1、驻留机制的几种情况(交互模式)
打开交互模式:win+R打开运行窗口,输入cmd,再输入python
- 字符串的长度为0或者1
Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep 5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s1 = ''
>>> s2 = ''
>>> s1 is s2
True
>>> s3 = 'a'
>>> s4 = 'a'
>>> s3 is s4
True
>>>
is是身份运算符,比较的是id。==比较的是value值。
- 符合标识符的字符串
Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep 5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> str1 = 'ab_12' #符合标识符
>>> str2 = 'ab_12'
>>> str1 == str2
True
>>> str1 is str2
True
>>> str3 = 'x*y' #不符合标识符
>>> str4 = 'x*y'
>>> str3 == str4
True
>>> str3 is str4
False
>>> id(str3)
1750506482800
>>> id(str4)
1750506482928
>>>
标识符只包含数字字母和下划线。
- 字符串只在编译时进行驻留,而非运行时
python是一种解释型语言。解释器将.py中的代码编译成.pyc文件(字节码)。
>>> s1 = 'abc'
>>> s2 = 'ab'+'c' #字符串拼接
>>> s3 = ''.join(['ab','c']) #字符串拼接
>>> s1 is s2
True
>>> s1 is s3
False
>>> s1,s2,s3
('abc', 'abc', 'abc')
>>> type(s1),type(s2),type(s3)
(<class 'str'>, <class 'str'>, <class 'str'>)
>>>
s2 = ‘ab’+’c’ 是在运行前就连接完成了。
s3 = ”.join([‘ab’,’c’]) 是在程序运行的时候,通过join()方法对列表中的数据进行拼接的。在程序运行的时候,会开辟新的内存空间,所以没有产生驻留。
- [-5,256]之间的整数数字
>>> a = -5
>>> b = -5
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a is b
False
>>>
通过sys模块的intern()方法可以进行强制驻留:
>>> import sys
>>> a = 'x*y'
>>> b = 'x*y'
>>> a is b
False
>>> a = sys.intern(b) #强制驻留,强行将两个字符串指向同一个对象
>>> a is b
True
>>>
pycharm对字符串进行了优化处理。
s1 = 'x*y'
s2 = 'x*y'
print(s1 is s2) #True
内容相同的,pycharm就强制处理,进行驻留。
2、驻留机制的优缺点
在我们需要值相同的字符串时,就可以直接从字符串池中拿出来使用,避免了频繁的创建和销毁(因为python中一切皆对象,创建和销毁对象都是需要时间的),从而提升效率和节约内存。因此拼接和修改字符串会影响性能(拼接和修改字符串都会产生新的字符串对象)。
所以在字符串拼接的时候建议使用join()方法,而不是’+’。因为join()是先计算出所有字符串的长度,然后再拷贝,它只创建一次对象,效率比’+’要高。
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
暂无评论内容