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))
# <class 'list'>

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