day8 - 字符串

1.什么是字符串(str)

字符串是容器型数据类型, 将''/""/''' '''/""" """作为容器标志,容器中的元素全是字符
不可变的(不支持增删改)、有序(支持下标操作)

str1 = 'hello\n123'
str2 = "你好"
str3 = '''thanks
123
456'''
str4 = """谢谢"""
print(type(str1), type(str2), type(str3), type(str4))
print(str1)
print(str3)

2.字符串中的元素 - 字符

python中只有字符的概念,没有对应的数据类型。引号中只有一个元素的字符串可以看成一个字符
字符串又叫字符集

1)字符串中的字符 - 原则上任何可以通过键盘输入或者从其他地方赋值粘贴的所有的符号都可以作为字符
'和健身房'、'shuASSS'、'2378'、'+-===!@&*#@'、'♠'
a.普通字符: 在字符串中能够代表符号本身的字符(没有特殊意义和特殊功能的符号)
b.转义字符: 在字符串中有特殊意义和特殊功能的符号的组合,一般是以\开头的

\n  - 换行
\'  - 表示'本身
\"  - 表示"本身
\t  - 表示一个缩进(tab键)
\\  - 表示一个 \
注意: 所有的转义字符的长度都是1

c.编码字符

2)阻止转义: 在字符串的最前面加r/R可以让当前字符串中所有的转义字符失效(所有的符号在字符串中都表示这个符号本身)

\u四位的16进制数 - 编码字符(获取4位16进制数作为编码值对应的字符)

str1 = 'abc\n123'
print(str1)

str2 = 'abc\'1\"23'
print(str2)

str3 = '\tabc'
print(str3)

str4 = 'abc\\n123'
print(str4)

str5 = 'abc\u4eff'
print(str5)

str6 = R'\tabc\n\'123'
print(str6)

3.字符编码

计算机不能直接存储字符(符号),只能存储数字;
为了能够存储字符,把每一个字符关联了一个固定的数字(这个固定的数字就是对应的字符的编码)

字符和数字和一一对应关系就是编码表:ASCII码表,Unicode编码表(python)

  1. ASCII码表 - 在计算机中采用一个字节保存一个字符(总共128个字符), 字符包含了所有的字母、数字和美国常用符号
    0 ~ 9: 编码值从48开始依次增加
    大写字母的编码值 < 小写字母的编码值
    大写字母和小写字母不是紧挨着的

  2. Unicode编码表是ASCII码表的扩展, 包含了世界上所有的国家、所有的语言对应的符号(总共有65536个符号)
    ASCII码: 0 ~ 127
    中文编码值范围: 0x4e00 ~ 0x9fa5

1.编码字符: \u4位16进制编码值

str1 = 'abc\u50ff'
print(str1)

2.chr(编码值) - 获取编码值对应的字符

print(chr(97))

num = 0
for x in range(0x4e00, 0x9fa5+1):
    print(chr(x), end=' ')
    num += 1
    if num % 30 == 0:
        print()

print()
for x in range(0x0F00, 0x0FFF+1):
    print(chr(x), end=' ')

print()

for x in range(0x2400, 0x243F+1):
    print(chr(x), end=' ')

print()

3.ord(字符) - 获取指定字符对应的编码值

print(hex(ord('余')))
print(hex(ord('婷')))



1.查 - 获取字符 (和列表获取元素的方式一样)

1)获取单个字符: 字符串[下标]

2)切片: 字符串[开始下标:结束下标:步长]
3)遍历: 直接遍历元素、通过下标遍历

注意: 一个空格是一个字符; 按tab键是4个空格,对应4个字符; \t对应一个字符

获取单个字符

str1 = '\thello Python!'
print(str1[-2])    # n
print(str1[2])     # e
# print(str1[100])   # IndexError: string index out of range

切片

print(str1[2:])     # ello Python!
print(str1[1:-1:2])  # hloPto
print(str1[:3:-1])   # !nohtyP ol

遍历

for x in str1:
    print('x:', x)

枚举

for 下标,元素 in enumerate(序列):
循环体

for index, item in enumerate(str1):
    print(index, item)

2. 相关操作

  • 1)运算符:

a. +, *

str1 = 'abc'
str2 = '123'
print(str1 + " " + str2)   # abc 123
print(str1 * 3)   # abcabcabc

b. ==, !=

print('abc' == 'abc')   # True
print('abc' == 'acb')   # False

c. >, <, >=, <=

字符串1 > 字符串2
字符串比较大小比较的是字符串编码值的大小

判断字符是否是小写字母: 'a'<= char <= 'z'
判断字符是否是大写字母: 'A'<= char <= 'Z'
判断字符是否是字母: 'A' <= char <= 'Z' or 'a'<= char <= 'z'
判断字符是否是中文: '\u4e00' <= char <= '\u9fa5'
判断字符是否是数字: '0' <= char <= '9'
"""
print('abcdef' > 'bc')   # False
print('Z' < 'a')    # True
print('abaaaa' < 'aczzzzzz')   # True

char = input('请输入一个字符:')
if '\u4e00' <= char <= '\u9fa5':
    print(char, '是中文')
else:
    print(char, '不是中文')

# 练习: 输入一个字符串,判断这个字符串是否是中文字符串(全是中文)
value = input('请输入:')
for char in value:
    if not '\u4e00' <= char <= '\u9fa5':
        print('非中文字符串')
        break
else:
    print('是中文字符串')
    1. in / not in

字符串1 in 字符串2 -> 判断字符串2中是否包含字符串1

str3 = 'abc 123'
print('b' in str3)   # True  10 in [10, 20, 30]
print('abc' in str3)  # True  [10, 20] in [10, 20, 30]  -> False
print('ac' in str3)   # False
  • 3)相关函数: len, str, sorted, reversed

a.len(字符串)

print(len('\tabc\n123\u4eee'))    # 9
print(len(' abc123'))       # 7
print(len(' '))      # ' ' -> 1; '' -> 0

b.str(数据) - 所有数据都可以转换成字符串; 直接将数据的打印值加引号

a = 100
str(a)          # '100'
str(True)       # 'True'
list1 = [10, 20, 30]
str4 = str(list1)     # '[10, 20, 30]'
print(len(str4), str4[0])     # 12  [

c.sorted(字符串)

str5 = 'pythonH12QWz'
list2 = sorted(str5)
print(list2)   # ['1', '2', 'H', 'Q', 'W', 'h', 'n', 'o', 'p', 't', 'y', 'z']
print(''.join(list2))   # 12HQWhnoptyz



1.格式占位符

a.语法: 包含格式占位符的字符串 % (值1, 值2, 值3,...)
b.说明:
格式占位符 - 格式占位符有哪些是固定,使用的时候和字符串中变化的数据的类型相关
%s - 字符串(任何类型都可以使用%s占位)
%d - 整数;
%-Nd - 整数; N约束数字最后的长度,如果不够后面补空格
%Nd - 整数; N约束数字最后的长度,如果不够前面补空格
%f - 浮点数;小数点后面保留6位小数
%.Nf - 浮点数, N约束小数点N后的小数位数(会四舍五入)
%c - 字符

% - 固定写法
() - 固定写法;如果值的个数是1可以省略
值 - 任何有结果的表达式; 值的个数和类型和前面占位符的个数以及类型保持一致

# name = input('请输入姓名:')
name = '张三'
# age = int(input('请输入年龄:'))
age = 20
# 你好,我是xxx,今年x岁
# 方法一:
print('你好,我是'+name+',今年'+str(age)+'岁')
print('你好,我是%s,今年%4d岁, 工资:%.2f, %s, %f, %c, %c' % (name, age, 3.1495926, 2.348, 1.25, 'Z', 97))

2.format

一个带有{}的字符串.format(值1, 值2, 值3,...)

用法1: 让空的{}个数和format中值的个数保持

print('我是{}, 今年{}岁'.format('余婷', 18))

用法2: {N} - N从0开始依次增加,分别表示format中第0个值,第1个值,...

print('我是{0},年是:{1}, 今年{1}岁'.format('余婷', 18))
print('数据1:{1}, 数据2:{0}, 数据3:{1}'.format(10, 20))   # 数据1:20, 数据2:10, 数据3:20

用法3: [key]

 '{key1}, {key2}'.format(key1=值1, key2=值2)   -> '值1, 值2'
print('我是{name},年龄是:{age}, 今年{age}岁'.format(age=20, name='张三'))

用法4: 用列表元素给占位符赋值(了解)

list1 = [10, 20, 30, 40]
print('{0[1]},{0[0]},{0[3]}'.format(list1))
print('{1[0]}, {1[1]}, {1[1]}, {0}'.format('张三', list1))
print('{list[1]},{list[2]},{list[3]}'.format(name='张三', list=list1))

用法5: 用字典的值给占位符赋值(了解)

student = {'name': '小明', 'age': 20, 'id': '001', 'score': 100}
print('{name}今年{age}岁,学号:{id}, 考了{score}'.format(**student))
# format(**student) --> format(name='小明', age=20, id='001', score=100)

其他的写法:

  • 约束小数位数
print('圆周率:{:.2f}'.format(3.1415926))   # 约束小数位数
  • 约束整数宽度
print('整数:{:0>4d}。'.format(25))    # 整数:0025
print('整数:{:0<4d}。'.format(25))    # 整数:2500。
print('整数:{:+>4d}。'.format(25))    # 整数:++25。
  • 分隔
print('大的整数:{:,}'.format(100000000))   # 大的整数:100,000,000
  • 百分比
print('百分比:{:.2%}'.format(0.25))   # 百分比:25.00%



1.字符串.capitalize() - 将字符串的首字母变成大写字母

str1 = 'python'
new_str1 = str1.capitalize()
print(new_str1)

A的unicode码是97
a的unicode码是65

char = 'j'
print(chr(ord(char)-32))

2.center/ljust/rjust/zfill

字符串.center(宽度, 填充字符) # xabcx
字符串.ljust(宽度, 填充字符) # abcxx
字符串.rjust(宽度, 填充字符) # xxabc
字符串.zfill(宽度) == 字符串.rjust(宽度, '0')

print('abc'.center(7, '+'))   # ++abc++
print('abc'.ljust(7, '+'))    # abc++++
print('abc'.rjust(7, '+'))    # ++++abc
print('abc'.zfill(7))         # 0000abc
# 001, 004, 009, 023, 045, 102
num = 21
print(str(num).zfill(3))

3.

字符串1.count(字符串2) -> 统计字符串1中字符串2出现的次数

字符串1.count(字符串2,开始下标,结束下标) - 统计字符串1开始下标到结束下标范围内字符串2出现的次数

str2 = 'how are you? i am fine! thank you!'
print(str2.count('you'))   # 2
print(str2.count('a'))     # 3

print(str2.count('you', 0, 15))   # 1
print(str2.count('you', 0, 4))    # 0

4.

str1 = 'you'
str2 = 'how are you'
# 判断str2是否以str1结尾
print(str2[-len(str1):] == str1)

5.字符串查找

字符串1.find(字符串2) - 获取字符串2第一次在字符串1出现的位置(用大于等于0的下标值表示);
字符串2不存在结果是-1
字符串1.index(字符串2) - 获取字符串2第一次在字符串1出现的位置(用大于等于0的下标值表示);
字符串2不存在会报错

str2 = 'how are you? i am fine! thank you!'
print(str2.index('you'))   # 8
print(str2.find('you123'))    # 8
print(str2.find('you123'))   # -1
# print(str2.index('you123'))  # ValueError: substring not found

6.join

字符串.join(序列) - 将序列中的元素用字符串连接在一起产生一个新的字符串;
序列中的元素是字符串

str3 = '+'.join('abc')
print(str3)    # a+b+c

str4 = ''.join(['name', 'age', 'gender'])
print(str4)

str5 = ''.join({'a': 1, 'b': 1})
print(str5)    # ab

7.字符串替换

  1. 字符串1.replace(字符串2, 字符串3) -> 将字符串1中所有的字符串2都替换成字符串3

字符串1.maketrans(字符串2,字符串3) -> 创建字符串2和字符串3一一对应的映射表
字符串1.translate(替换的映射表)

str2 = 'how are you? i am fine! thank you!'
new_str2 = str2.replace('you', 'me')
print(new_str2)   # how are me? i am fine! thank me!

创建映射表

table = str.maketrans('a!', 'b+')
new_str2 = str2.translate(table)   # 将字符串str2中所有的a都替换成b, 所有的!都替换成+
print(new_str2)

8.字符串切割

字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割点切成多分

str2 = 'how are you? i am fine! thank you!'
print(str2.split(' '))  # ['how', 'are', 'you?', 'i', 'am', 'fine!', 'thank', 'you!']

你可能感兴趣的:(day8 - 字符串)