import os
import linecache
import string
"""
python 基础之数据类型学习笔记
主要内容如下:
字符串的引用的解释,修改,拼接,删除,子串的查找,分割,切片
"""
#字符串
#字符串在python 中是不可改变的值,这点与java很相似,字符串是一个引用变量,
#也就是在python的虚拟机中维护一个字符串专门的空间,对两个字符串值相同的变量,实际上同一个变量。
#字符串1
a="abcdef"
#字符串2
b="abcdef"
#查看两个字符串在内存中识别符
print(id(a))
#2937199059216
print(id(b))
#2937199059216
#"改变"字符串1
a="abcdefgh"
#查看标识符
print(id(a))
#2071341216880
#结论:字符串改变不是改变的值本身,而是改变了变量的引用对象
#字符串的编码
#字符串1
a='this is a test example.'
#字符串2
b='这是一个测试用例。'
#输出两个字符串的长度
print('a:',len(a))
#a: 23
print('b:',len(b))
#b: 9
#以上编码在我的环境下默认是用的utf-8进行编辑的,所以汉字字符是能够进行正确识别的,如果不是使用utf-8进行编码的话,
#将会出现错误。这时,需要利用字符串的encode()方法进行编码的转换。
#两个字符串的拼接
#字符串1
a='abcdefg'
#字符串2
b='hijklmn'
#第一种拼接方法:利用连接符
c=a+b
print(c)
#abcdefghijklmn
#说明:该方法在拼接数量较少时,使用比较方便,同样显示也比较直观,
#但在拼接的数量较多的时候,会消耗大量的内存,
#第二种方法:格式化的方法:
#利用%s进行格式化
d="%s%s" % (a,b)
print(d)
#abcdefghijklmn
#利用string的format方法进行格式化:
e="{a}{b}".format(a=a,b=b)
print(e)
#abcdefghijklmn
#第三种方法:利用string的join方法
f=''.join([a,b])
print(f)
#abcdefghijklmn
#字符串的修改:
a='abcDEf'
print(id(a))
# 2074274992680
a=a.replace('DE','de')
print(id(a))
# 2074274993352
print(a)
# abcdef
#虽然可以改变字符串中的值,但是从本质上来讲,修改后的字符串不是原先的字符串了,而将变量指向了一个新的字符串
#查找字符串的子串
a="I'm a student,my name is zhangsan,my hometown is New York,my phone number is 333-4445"
print(a.find('zhangsan'))
# 25
print(a.index('zhangsan'))
# 25
print(a.find('Lisi'))
# -1
# print(a.index('Lisi'))
# ValueError: substring not found
#结论:从查找的结果上来看,如果说查找的字符串中存在子串,则不会影响,但如果不存在 ,find会返回一个-1,而index则会返回一个错误。
print(a.find('my'))
#14
#find默认是查找到的子串第一次出现的位置
print(a.count('my'))
#3
#在字符串有多个子串,在查找的时候,我们可以利用对查找的起始位置进行限制
print(a.find('my',15))
#34
print(a.find('my',35))
#58
print(a.replace('my',"My"))
# I'm a student,My name is zhangsan,My hometown is New York,My phone number is 333-4445
#所有的符合条件的字符被替换
print(a.replace('my',"My",1))
# I'm a student,My name is zhangsan,my hometown is New York,my phone number is 333-4445
print(a.replace('my',"My",2))
# I'm a student,My name is zhangsan,My hometown is New York,my phone number is 333-4445
#在replace中也有一个可选参数,如果不指定,则会将所有的替换,如果指定,则只替换指定的个数,
#字符串的分割:
a="I'm a student,my name is zhangsan,my hometown is New York,my phone number is 333-4445"
#将上面的字符串按空格进行分割
b=a.split(' ')
print(type(b))
#
print(b)
# ["I'm", 'a', 'student,my', 'name', 'is', 'zhangsan,my', 'hometown', 'is', 'New', 'York,my', 'phone', 'number', 'is', '333-4445']
#可以看出,上面的字符串按空格被分割成了一个list
#将上面得到的list进行还原
c=' '.join(b) #注意join前面的字符串是一个拥有一个空格的字符串
print(c)
# I'm a student,my name is zhangsan,my hometown is New York,my phone number is 333-4445
#字符串的删除
a='test'
del a
# print(a)
#NameError: name 'a' is not defined
#说明:其本质上是删除了一个变量
#字符串的切片:
#字符串在本质上也是一种序列化的结构,所以能够使用游标的方式进行访问,所以能够进行切片的访问
#基本的使用:
a='abcdefghijklmn'
#访问固定位置:
print(len(a))
# 14
print(a[0])
# a
# print(a[14])
# IndexError: string index out of range
# 说明:字符串的游标是从0开始进行计数的,其他位置与我们实际生活中数的位置差1
#取出字符串的abc
print(a[0:3])
# abc
print(a[:3])
# abc,默认从最开始的位置开始,所以0可以省略
print(a[-14:-11])
# abc,数表示从右边开始数起,但起始的相对位置不变,第一个表示开始位置,第二个表示结束位置的下一位
#取出字符acegikm
print(a[0:14:2])
# acegikm,第三个数表示步进
print(a[::2])
# acegikm,对整个字符串来讲,开始和结束的默认位置都可以省略,也可以省略一个
print(a[0::2])
# acegikm
print(a[:14:2])
# acegikm