python全栈_006_Python3基本数据类型--字符串

把字符连成串,在Python中使用', ",''',"""引起来的内容被称为字符串。

在Python中字符串是一种不可变数据类型,即不可修改变量对应内存中的内容,对字符串变量重新赋不同的值会重新创建对象,分配内存:

s = 'abcd'
#s[0] = 'A'  # 不能执行这样的操作,字符串为不可变数据类型
print(s[0])  # 只可以通过下标访问,不能通过下标修改其值
print(s,id(s))
s = 'abce'  # 重新赋值,重新创建了一个对象,分配了新的内存
print(s,id(s))

s = s + 'a' # 字符串的连接,也会重新创建对象
print(s,id(s))

s = s * 2 # 重复字符串,也会重新创建对象
print(s,id(s))

1 :切片和索引

1.1: 索引

   索引就是下标. 切记, 下标从0开始:

#    01234
s = 'Hello'
print(s[0])
print(s[1])
print(s[2])
print(s[3])
print(s[4])
#print(s[5])   #  没有5, 越界了了. 会报错 string index out of range
print(s[-1])   # -1 表示倒数第一个。
print(s[-2])   # -2 表示倒数第二个。

1.2:切片:

  我们可以使用下标来截取部分字符串的内容
  语法: str[start: end]
  规则: 顾头不顾尾, 从start开始截取. 截取到end位置. 但不包括end (start<= x < end)

s = '中华人民共和国'
print(s[0:3]) # 输出 中华人
print(s[2:6]) # 输出 人民共和
print(s[2:7]) # 输出 人民共和国
print(s[2:20]) # 输出 人民共和国 ,如果右边已经超过了最大值,相当于获取到最后;
print(s[2:]) # 输出 人民共和国 ,如果想获取到最后,那么最后一个值可以不给。

print(s[3:2])  # 取不到任何结果,默认的方向是从左往右切,从3向右数,你怎么数也数不到2
print(s[-1:-4]) # 取不到任何结果,默认的方向是从左往右切,从-1向右数,你怎么数也数不到-5

print(s[-4:-1]) # 输出 民共和  ,顾头不顾尾,取不到最后一个
print(s[-4:])   # 输出 民共和国 ,什么不写就是最后一个了

print(s[1:])   # 输出"华人民共和国" ,去掉第一个字符
print(s[:-1])  # 输出"中华人民共和" ,取到倒数第一个,即去掉倒数一个字符
print(s[:])    # 原样输出,输出 中华人民共和国

  跳着截取

  步长: 如果是整数, 则从左往右取. 如果是负数. 则从右往左取. 默认是1
  切片语法: start
  str[start:end:step]
  start: 起始位置
  end: 结束位置
  step:步长

'''
str[start:end:step]
  start: 起始位置
  end: 结束位置
  step:步长,默认为1 ,(不能为0)

执行过程(个人理解,未验证):
    cur = start
    if step > 0
        while cur < end:
            取 s[cur]
            cur += step
    elif
        while cur > end:
            取 s[cur]
            cur += step
'''
s = '坚持走符合国情的人权发展道路促进人的全面发展'
print(s[1:7:2]) # 输出 第1 3 5 位的,输出 "持符国"
print(s[:7:2])  # 输出 第0 2 4 6 位的,输出 "坚走合情"
print(s[6::2])  # 从6开始到最后,每两个取一个;输出"情人发道促人全发"
print(s[-7::2]) # 从-7开始取到最后,每两个取一个;输出"进的面展"
print(s[-1:-7]) # -1:-7 什么都没有,因为从左到右获取(-1,0,1,2,不可能到达-7;)
print(s[-1:-7:-1]) # -1 -2 -3 -4 -5 -6 ,输出 "展发面全的人"
print(s[5:2]) # 什么都没有,
print(s[5:2:-1]) # 5 4 3,输出 "国合符"

s = 'hello'
print(s[2:])     # step > 0,到最末尾,输出"llo"
print(s[2::-1])  # step < 0,到最开始,输出"leh"
print(s[::])     # 输出 "hello"
print(s[::-1])   # 输出 "olleh"  

2:字符串的相关操作方法

  字符串是不可变数据类型, 所以任何操作对原字符串是不会有任何影响的;所有操作都是产生新字符串返回;

2.1:大小写转来转去

#1:首字母大写
s = 'all for One, one For all.'
print("1:",s)
s.capitalize()  #首字母大写
print("2:",s)  # 输出不会有任何变化,因为Python中字符串为不可变类型,需要把转换结果重新赋值给字符串变量

s1 = s.capitalize()  # 重新创建了一个对象,
print("3:",s1)


#2:大小写的转换
### 全部转换为小写字母
ret = s.lower()
print("4:",ret)

### 全部转换为大写字母
ret = s.upper()
print("5:",ret)

# 应用,检验用户输入的检验
'''
varify_code = "aDdwS"
user_varify_code = input("请输入验证码:")
if varify_code.upper() == user_varify_code.upper():
    print("验证成功")
else:
    print("验证失败")
'''

### 大小写互相转换
ret = s.swapcase()
print("6:",ret)

### 转换为小写字符,
ret = s.casefold()   # lower() 对某些字符支持不够好;casefold() 支持所有字符
print("7:",ret)

#每个被特殊字符隔开的字母首字母大写
s2 = "the longest day has*an end."
ret = s2.title()
print("8:",ret)

#中文也是特殊字符
s2 = "the中国longest day"
ret = s2.title()
print("9:",ret)

2.2:切来切去

s = '刘德华'
ret = s.center(10,"*")  # 拉长成10, 把原字符串放中间.其余位置补*
print("1:",ret)

s = 'all for One, one 	For all.'
print("2:",s)
print("2:",s.expandtabs()) # 可以改变	的长度,默认长度更改为8

#去空格
s = '  all for One, one  For all   '
ret = s.strip()
print("4:",ret)

s = '  all for One, one  For all   '
ret = s.lstrip()  # 去掉左边空格
print("5:",ret)

s = '  all for One, one  For all   '
ret = s.rstrip() # 去掉右边空格
print("6:",ret)

'''
#应用:模拟用户登录. 忽略用户输入的空格
username = input("请输入用户名:").strip()
password = input("请输入密码:").strip()
if username == 'admin' and password == 'admin123':
    print("登录成功")
else:
    print("登录失败")
'''

#strip()也可以去掉指定的元素
s = "abcdadalacbabc;askda;abc"
print("7:",s.strip("abc"))
print("8:",s.lstrip("abc"))
print("9:",s.rstrip("abc"))

#字符串替换
s = 'all for One, one  For all'
ret = s.replace('al','hello') # 字符串为不可变数据类型,所有操作都是产生新字符串返回
print("10:",ret)

ret = s.replace('o','uuu',2) # 替换2个
print("11:",ret)

# 字符切割
s = 'all for One, one For all'
lst = s.split(' ')
print(lst)

lst = s.split(',')
print(lst)

lst = s.split('oo')
print(lst)

lst = s.split('all')  #['', ' for One, one For ', '']  如果切割符在左右两端. 那么一定会出现空字符串
print(lst)

2.3:格式化输出

#格式化输出
s = "我叫%s,今年%d岁了,我喜欢%s"%('joshou',19,'刘德华')
print(s)
s1 = "我叫{},今年{}岁了,我喜欢{}".format('joshou',19,'刘德华')  # 指定格式化
print(s1)

s2 = "我叫{0},今年{1}岁了,我喜欢{2}".format('joshou',19,'刘德华') # 指定位置
print(s2)

s2 = "我叫{1},今年{2}岁了,我喜欢{0} 我喜欢{0}".format('刘德华','joshou',19)  # 指定位置
print(s2)

s2 = "我叫{name},今年{age}岁了,我喜欢{singer} 我喜欢{singer}".format(singer = '刘德华',name = 'joshou',age = 19) # 指定关键字
print(s2)

2.4:查找

# 是否以xxxx开头
s = "我叫iSwqr,haha,我喜欢python, java, cpp等编程语言."
ret = s.startswith("iSwqr") # 判断是否以"iSwqr"开头
print(ret)  # False

ret = s.startswith("我叫iSwqr") # 判断是否以"我叫iSwqr"开头
print(ret)  # True

#是否以xxxx结尾
ret = s.endswith("语言") # 判断是否以"语言"结尾
print(ret)  # False

ret = s.endswith("语言.") # 判断是否以"语言."结尾
print(ret)  # True

# 出现的次数
ret = s.count('a')
print(ret) # 4

ret = s.count('haha')
print(ret) # 1

# 查找 (没有找到返回-1,找到返回首次出现的位置)
ret = s.find('iSwqr')  # 查找'iSwqr'首次出现的位置
print(ret)  # 2

ret = s.find('ha')   # 查找'ha'首次出现的位置
print(ret)  # 8

ret = s.find('hello')   # 查找'hello'首次出现的位置,如果没有找到返回-1
print(ret)  # -1

ret = s.find('ha',1,7)   # 切片找,
print(ret)  # -1

ret = s.index('iSwqr')  # 求索引位置。注意:如果找不到索引,程序会报错
print(ret)  # 2

2.5:条件判断

s1 = '123.45'
s2 = 'abcd'
s3 = '_abcd!@#'
s4 = 'abcd1234'
s5 = '1234'
#是否由字母和数字组成(全字母,全数字,或者字母数字的组合)
print('=1:===isalnum()===')
print(s1.isalnum()) # False
print(s2.isalnum()) # True
print(s3.isalnum()) # False
print(s4.isalnum()) # True
print(s5.isalnum()) # True

#是否由字母组成
print('=2:===isalpha()===')
print(s1.isalpha()) # False
print(s2.isalpha()) # True
print(s3.isalpha()) # False
print(s4.isalpha()) # False
print(s5.isalpha()) # False

#是否由数字组成,不包括小数点:
print('=3:===isdigit()===')
print(s1.isdigit()) # False
print(s2.isdigit()) # False
print(s3.isdigit()) # False
print(s4.isdigit()) # False
print(s5.isdigit()) # True

print('=4:===isdecimal()===')
s1 = '1253.16'
s5 = '1253'
print(s1.isdecimal())  # False
print(s5.isdecimal())  # True

print('=5:===isnumeric()===')
s1 = '1253.16'
s5 = '1253'
print(s1.isnumeric())
print(s5.isnumeric())
s6= '二十'
print(s6.isnumeric())  # True,isnumeric()能识别中文的数值

2.6:求字符串的长度

s = '算你狠,haha'
ret = len(s) # len = 8
print(ret,s)

s1 = s.encode('utf-8')
ret = len(s1)  # 3 * 3 + 5
print(ret,s1) # len = 14

s2 = s.encode('gbk')
ret = len(s2)  # 2*3 + 5
print(ret,s2)  # len = 11

2.7:迭代


  我们可以使用for循环来便利(获取)字符串中的每一个字符
  语法:
  for 变量 in 可迭代对象:
    pass
  可迭代对象: 可以一个一个往外取值的对象


s = '算你狠,haha'
for c in s:
    print(c,end = ' ')

print('')

index = 0
while index < len(s):
    print(s[index],end= ' ')
    index += 1

'''
in有两种用法:
1. 在for中:是把每一个元素获取到,然后赋值给前面的变量。
2. 不在for中: 判断xxx是否出现在str中.
'''

print('')
print('xsd' in s)  # False
print('haha' in s) # True






原文地址:https://www.cnblogs.com/ixuby/p/10094857.html