Day4-1字符串

字符串

字符串的表示方式

在python中可以使用一对单引号,一对双引号,一对三个单引号,一对三个双引号表示字符串

a = 'hello'
b = "world"
c = '''jiajia'''
d = """yeah"""
print(a,b,c,d)

如果字符串中含有单引号,外面就用双引号

a = "I'm xiaoming"
print(a)

如果字符串中含有双引号,外面就用单引号

b = 'xiaoming said:"i am xiaoming"'
print(b)

如果字符串中既含有单引号,又含有双引号,外面使用三引号

c = """xiaoming said:
"I'm xiaoming" """
print(c)

三引号可以用来换行

转义字符

在python中,我们使用\作为转义字符。\n表示换行,\t表示制表符。

a = 'I\'m xiaoming' # 对单引号进行转义
print(a)
b = "xiaoming said:\"I am xiaoming\""
print(b)
# \n表示换行
a = 'hello\nworld'
print(a)
# \t表示制表符,一个Tab键
b = 'hello\tworld'
print(b)
# \\表示对转义再进行转义,表示一个普通的反斜线
c = 'hello\\tworld'
print(c)
# 在字符串前面加r表示原生字符串
d = r'goodmor\ning'
print(d)
# \r表示将当前的位置移到本行开头
print('hello\rworld') # world

遍历

所谓遍历,可以理解为按照一定的规则(一般情况下就是数据的下标),访问每一个数据。不是所有的数据都能够被遍历,字符串是可迭代对象,能够进行遍历。

可以使用while和for语句,对字符串里的元素进行遍历。

# 使用for
a = 'hello'
for i in a:
    print(i)
# 使用while
i = 0 
a = 'hello'
while i < len(a):
    print(a[i])
    i += 1

字符串的索引(下标)和切片

字符串:一个一个的字符串在一起,所以我们可以通过索引和切片来对应到指定的字符。

下标:又称之为索引,表示第几个数据。

在计算机里,下标都是从0开始。程序员数羊,少一只!

str list tuple 可以通过下标来获取或者操作数据。

word = 'zhangsan' 
print(word[4]) # g
# 字符串是不可变数据类型
# 对于字符串的任何操作,都不会改变原有的字符串
word[4] = 'x' # 会报错

切片:就是从字符串里复制一段指定的内容,生成一个新的字符串。

m = 'abcdefghigklmnopqrsquvwxyz'
print(m[5]) # f m[index]  获取指定下标上的数据
print(m[-1])# z 表示倒数第一个数据
# 切片语法 m[start:end:step] step指的是步长,间隔。
print(m[2:9])# cdefghi  左闭右开
print(m[2:]) # cdefghigklmnopqrsquvwxyz  如果只设置了start,会“截取”到最后
print(m[:9]) # abcdefghi  如果值设置了end,会从头开始“截取”
print(m[3:15:2])# dfhgln
print(m[3:15:1])# defghigklmno 默认步长为1
#步长不能是0,但可以是负数
print(3:15:0) # 会报错
print(m[3:15:-1]) # 没有数据
print(m[15:3:-1]) # ponmlkgihgfe 表示从右往左获取
print(m[::]) # abcdefghigklmnopqrsquvwxyz 从头到尾复制一份
print(m[::-1])# zyxwvuqsrqponmlkgihgfedcba 倒着复制一份
# start和end如果是负数表示从右边往左边数
print(m[-9:-5])# rsqu

内容分隔

内容分隔主要涉及split,rsplit,splitlines,partition,rpartition.

split

以指定字符串为分隔符切片,如果 maxsplit有指定值,则仅分隔 maxsplit+1 个子字符串。返回的结果是一个列表。

x = 'zhangsan-lisi-wangwu-jerrry'
y = x.split('-')
print(x) # zhangsan-lisi-wangwu-jerrry
print(y) # ['zhangsan', 'lisi', 'wangwu', 'jerrry']
z = x.split('-',2)
print(z) # ['zhangsan', 'lisi', 'wangwu-jerrry']

rsplit

用法和split基本一致,只不过是从右往左分隔。

x = 'zhangsan-lisi-wangwu-jerry'
y = x.rsplit('-') 
print(y) # ['zhangsan', 'lisi', 'wangwu', 'jerry']
z = x.rsplit('-',2) 
print(z) # ['zhangsan-lisi', 'wangwu', 'jerry']

splitlines

按照行分隔,返回一个包含各行作为元素的列表。

str = 'hello\nworld'
print(str.splitlines()) # ['hello','world']

partition

指定一个字符串作为分隔符,分成三部分,分隔符前,分隔符,分隔符后,三部分组成一个元组。

print('queyqyeuXoiXqeqo'.partition('X')) # ('queyqyeu', 'X', 'oiXqeqo')

rpartition

类似于 partition()函数,不过是从右边开始.

x = 'jiajiaXhhhXhaha'
print(x.rpartition('X')) # ('jiajiaXhhh', 'X', 'haha')
# 获取文件后缀名
file_name = '2021.1.25珍贵录像.mp4'
print(file_name.rpartition('.')) # ('2021.1.25珍贵录像', '.', 'mp4')

判断

python提供了非常丰富的方法,可以用来对一个字符串进行判断。

startswith

判断字符串是否以指定内容开始。

print('hello'.startswith('h')) # True

endswith

判断字符串是否以指定内容结束。

print('hello'.endswith('lo')) # True

isalpha

判断字符串是否是纯字母。

print('hello world'.isalpha()) # False 有空格
print('hello'.isalpha()) # True

isdigit

判断一个字符串是否是纯数字,只要出现非0~9的数字,结果就是False.

print('12234'.isdigit()) # True
print('1.23'.isdigit())  # False
print('-1234'.isdigit()) # False
num = input('请输入一个数字')
if num.isdigit():
    num = int(num)
else:
    print('请输入数字')

isalnum

判断是否由数字和字母组成。只要出现了非数字和字母,就返回False.

print('hello123'.isalnum()) # True
print('hello_jiajia'.isalnum()) # False

isspace

如果字符串只包含空格,则返回True,否则为False.

print(''.isspace()) # False 空字符串
print('  '.isspace()) # True
print('hello world'.isspace()) # False

统计

count

统计指定内容在字符串出现的次数.

x = '我是家家,家家是我,嘿嘿嘿!'
print(x.count('家')) # 4

替换

replace

用来替换字符串

word = 'hello'
word1 = word.replace('l','x') # 将l替换成x
print(word) # hello # 字符串是不可变数据类型
print(word1) # hexxo # 原来的字符串不会变,而是生成一个新的字符串保存替换后的结果。

len

len函数可以获取字符串的长度.

x = 'abcdefghigklmnl'
print(len(x)) # 15  使用内置函数len 可以获取字符串的长度

查找

find

查找指定内容在字符串中是否存在,如果存在就返回该内容在字符串中第一次出现的开始位置索引值,如果不存在,则返回-1.

x = 'abcdefghigklmnl'
print(x.find('l',14,16)) # 14 从[14,16]中查找
print(x.find('l')) # 11
print(x.find('p')) # -1

rfind

类似于 find()函数,不过是从右边开始查找.

x = 'abcdefghigklmnl'
print(x.rfind('l')) # 14

index

跟find()方法一样,只不过,find方法未找到时,返回-1,而str未找到时,会报一个异常.

x = 'abcdefghigklmnl'
print(x.index('l')) # 11
print(x.index('p')) # 会报错

rindex

类似于 index(),不过是从右边开始.

x = 'abcdefghigklmnl'
print(x.rindex('l')) # 14

修改大小写

print('hello'.capitalize()) # Hello 首字母大写
print('hello'.upper()) #  HELLO 全部大写
print('HeLLo'.lower()) # hello 全部小写
print('good morning'.title()) # Good Morning 每一个单词首字母大写
while True:
    content = input('请输入内容')
    print('您输入的内容是:',content)
    if content.lower() == 'exit':
        break

空格处理

ljust

返回指定长度的字符串,并在右侧使用空白字符补全(左对齐)。

print('hello'.ljust(10))# hello      右侧五个空格
print('hello'.ljust(10,'$')) # hello$$$$$

rjust

返回指定长度的字符串,并在左侧使用空白字符补全(右对齐)。

print('hello'.rjust(10)) #      hello 左侧五个空格
print('hello'.rjust(10,'$')) # $$$$$hello

center

返回指定长度的字符串,并在两端使用空白字符补全(居中对齐)

print('hello'.center(10)) #   hello   
print('hello'.center(10,'$')) # $$hello$$$

lstrip

删除左边的空白字符。

print('   appl  e'.lstrip()) # appl  e

rstrip

删除右边的空白字符

print('   bana  na     '.rstrip()) #    bana  na

strip

删除两端的空白字符。

print('   mango    '.strip()) # mango

字符串的拼接

把参数进行遍历,取出参数里的每一项,然后再在后面加上指定字符串

语法格式:S.join(iterable)

x = ['apple','banana','orange','pear']
print('_'.join(x)) # apple_banana_orange_pear
print('$'.join('hello')) # h$e$l$l$o

作用:可以把列表或者元组快速的转变成为字符串,并且以指定的字符分隔。

成员运算符

成员运算符包括in和not in,用来判断一个内容在可迭代对象是否存在。

word = 'hello'
x = input('请输入内容')
for i in word:
    if x == i:
        print('您输入的内容存在')
        break
else:
    print('您输入的内容不存在')
word = 'hello'
x = input('请输入内容')
if word.find(x) == -1:
    print('您输入的内容不存在')
else:
    print('您输入的内容存在')
word = 'hello'
x = input('请输入内容')
if x in word:
    print('您输入的内容存在')
else:
    print('您输入的内容不存在')
word = 'hello'
x = input('请输入内容')
if x not in word:
    print('您输入的内容不存在')
else:
    print('您输入的内容存在')

字符集

计算机只能处理数字(其实就是数字0和数字1),如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码。

ASCII码表使用7位二进制表示一个字符,它的区间范围时0~127,一共只能表示128个字符,仅能支持英语。随着计算机科学的发展,西欧语言、希腊语、泰语、阿拉伯语、希伯来语等语言的字符也被添加到码表中,形成了一个新的码表ISO8859-1(又被称为Latin1)码表。ISO8859-1使用8位二进制表示一个字符串,完全兼容ASCII码表。

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

字符和编码之间相互转换

使用chr和ord方法,可以实现字符和编码之间的相互转换。

chr可以将编码转化为字符。ord可以将字符转化为编码。

a = '你'
print(ord(a)) # 20320
print(bin(ord(a))) # 0b100111101100000
alpha = chr(65)
print(alpha) # A

编码规则

用Unicode为每种语言的每个字符都设定了唯一的二进制编码,但是它还是存在一定的问题,不够完美。

例如,汉字 “你” 转换成为一个字符结果是0x4f60,转换成为二进制就是 01001111 01100000,此时就有两个问题:

  1. 1001111 01100000 到底是一个汉字 “你” ,还是两个 Latin1 字符?
  2. 如果Unicode进行了规定,每个字符都使用n个八位来表示,对于Latin1字符来说,又会浪费很多存储空间。

为了解决这个问题,就出现了一些编码规则,按照一定的编码规则对Unicode数字进行计算,得出新的编码。在中国常用的字符编码有 GBK,Big5utf8这三种编码规则。

使用字符串的encode方法,可以将字符串按照指定的编码格式转换称为二进制;使用decode方法,可以将一个二进制数据按照指定的编码格式转换成为字符串。

a = '你'
b = '你'.encode('GBK')
print(b) # b'\xc4\xe3'
print(b.decode('GBK')) # 你
a = '你好'
b = a.encode('utf8')
print(b) # b'\xe4\xbd\xa0\xe5\xa5\xbd'
c = b.decode('GBK')
print(c) # 浣犲ソ

为什么会出现乱码?

因为我们在编码的时候采用一套字符集,但是在解码的时候使用另一套字符集解码。

utf8使用三个字节表示一个汉字,GBK使用两个字节表示一个汉字。上述’你好’采用utf8编码时表示6个字节,所以用GBK进行解码时,它将两个字节为一个整体进行解码,那么解出来就是它对应的三个字,按照它的编码规则显示出来就是我们所看到的乱码了.

格式化输出

python中可以采用**%format**进行格式化输出。

name = 'zhangsan'
age = 18 
addr = '上海'
print('我叫',name,',年龄是',age,',住在',addr,sep = '')
# 可以使用%表示占位符格式化输出字符串
name = 'zhangsan'
age = 18 
addr = '上海'
earning = 999.886
# %s表示字符串占位符 %d表示整数占位符 %f表示浮点数占位符
print('我叫%s,今年%d岁,住在%s,每年挣%f元' % (name,age,addr,earning))
# %3d表示打印部分占三位,不足用空格补齐
print('我叫%s,今年%3d岁,住在%s,每年挣%f元' % (name,age,addr,earning))
# %0nd表示打印显示n位,如果不足在前面用0补齐
print('大家好!我是%03d男嘉宾' % 5)
# %-nd 表示打印显示n位,如果不足在后面用空格补齐
print('大家好!我是%-3d男嘉宾' % 5)
# %.nf 表示小数点后保留n位
print('我叫%s,今年%d岁,住在%s,每年挣%.2f元' % (name,age,addr,earning))
# %X表示将数字转化成16进制 %x转化成字母时是小写的
a = 255
print('%X' % a) # FF
print('%x' % a) # ff
# 使用format进行格式化输出
# {} 也可以用来占位
name = 'zhangsan'
age = 18
addr = '上海'
earning = 999.886
# 前后一一对应
print('大家好,我叫{},我今年{}岁,我住在{},我每个月挣{}元'.format(name,age,addr,earning))
# {}里有数字,根据数字的顺序进行填入。数字从0开始
print('大家好,我叫{2},我今年{3}岁,我住在{1},我每个月挣{0}元'.format(earning,addr,name,age))
# {}里的数字和字母混用
print('大家好,我叫{name},我今年{1}岁,我住在{addr},我每个月挣{0}元'.format(999.886,18,name = 'zhangsan',addr = '上海'))
# {}不能和{数字}混用
d = ['zhangsan',14,'上海','999.886']
print('大家好,我叫{},我今年{}岁,我住在{},我每个月挣{}元'.format(d[0],d[1],d[2],d[3]))
print('大家好,我叫{},我今年{}岁,我住在{},我每个月挣{}元'.format(*d))
dictionary = {'name' : 'zhangsan','age': 18,'addr' : '上海'}
print('大家好,我叫{name},我今年{age}岁,我住在{addr}'.format(**dictionary))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值