第3天 | 32天学会python,数据类型之字符串

字符串

字符串的编码标准

ASCII码表使用一个字节表示一个字符,最多只能表示128个,不使用最高位

ISO-8859-1使用了最高位;0~127和ASCII码表完全兼容,最多能表示255个

Unicode编码(万国码)绝大部分国家的文字都有一个对应的编码

其他编码

GBK:国标扩,汉字占两个字节,简体中文

BIG5:繁体中文

utf-8:统一编码,汉字占三个字节

python中字符串的运算符

1、字符串和字符串之间可以使用加法运算,作用是拼接两个字符串

2、字符串和数字之间可以使用乘法运算,目的是将指定的字符串重复多次

3、字符串和数字之间做==运算结果是False;做!=运算结果是True

4、字符串之间做比较运算,会逐个比较字符串的编码值

5、不支持其他的运算符

字符串的特殊表示

1. 字符串前加f

表示字符串内支持大括号内的python表达式,如:

logger.info(f"Total time taken: {time.time() - start_time}")

2. 字符串前加r

去掉反斜杠的转移机制,如下面例子,表示单纯字符串而不表示换行

logger.info(r"Test\n\n\n")

3. 字符串前加u

一般出现在中文字符串前,防止出现乱码

4. 字符串前加b

表示这是一个byte类型对象,在网络编程中,服务器和浏览器只认bytes类型数据

字符串的表示方式

# 在python里,可以使用一对担引号、一对双引号或则一对三个引号、一对三个单引号
a = 'hello'
b = "good"
c = '呵"呵呵"'
d = '''嘿嘿嘿'''
print(a, b, c, d)  # hello good 呵"呵呵" 嘿嘿嘿

# 如果字符串里还有双引号,外面就可以使用单引号
m = 'xiaoming said:"I am xioaming"'
n = "I'm xioaming"
p = """ xiaoming said:"I am xiaoming" """
print(m, n, p)  # xiaoming said:"I am xioaming" I'm xioaming  xiaoming said:"I am xiaoming"

# 字符串里的转义字符 \
# \'    显示一个普通的单引号
# \"    显示一个普通的双引号
# \n    显示一个换行
# \t    显示一个制表符
# \\    显示一个普通的反斜线
x = 'I\'m xioaming'  # \表示的是转义字符,作用是对\后面的字符进行转义
y = "xiaoming said:\"I am xioaming\""
z = 'heelo \n world'
print(x,y,z)  # I'm xioaming xiaoming said:"I am xioaming" heelo
#  world
x1 = '你好\t世界'
print(x1)  # 你好	世界

x2 = 'good nor\\ning'
print(x2)  # good nor\ning

# 在字符串的前面添加r 在python里表示的是原生字符串(大小写都可以)
x3 = r'hello \teacher'
print(x3)  # hello \teacher

字符串的下标和切片 

# 1、下标我们称之为索引,表示第几个数据。

# 可迭代对象:str list tuple dict set range 都可以遍历,可以使用下标操作数据的有:str list tuple
# 在计算机里,下标都是从0开始的。
# 可以通过下标来获取或则修改制定位置的数据
word = 'zhangsan'  # 字符串:一个一个的字符串在一起
print(word[4])  # g
小文 = '我是小可爱'
print(小文[2])  # 小

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

# 2、切片就是从字符串里复制一段制定的内容,生成一个新的字符串
m = 'abcdefghijklmnopqrstuvwxyz'
print(m[5])  # f

# 切片语法 m[start:end:step]  # 包含start,不包含end
# step指的是步长,理解为间隔。每隔step减1 个取一次
# 步长默认为1,步长不能为0,但是可以为负数表示从右往左
print(m[2:9])  #cdefghi
print(m[2:])  # 如果只设置了start,会截取到最后
print(m[:9])  # 如果只设置了end,会从头开始“截取”

print(m[3:15:2])  # dfhjln
print(m[3 :15 :1])  # defghijklmno
# print(m[3:15:0])  报错

print(m[3 :15 :-1])  # 没有数据,因为从3倒着找不到15
print(m[15:3:-1])  # ponmlkjihgfe
print(m[::])  # abcdefghijklmnopqrstuvwxyz 从头到尾复制
print(m[::-1])  # zyxwvutsrqponmlkjihgfedcba 从右到左全部复制

# start和end是负数,表示从右边数
print (m[-9:-5]) # rstu

 查找字符串

x = 'abcdefghijklmndsfasdfaadfadl'

# 获取字符串的长度
print(len(x))  # 28

# 查找内容相关的方法  find/index/rfind/rindex  获取指定字符的下标
print(x.find('l'))  # 11
print(x.index('l'))  # 11
# find和index区别:find在字符串中没有的字符时返回-1;index是报错
print(x.find('p'))  # -1 字符串中没有'p'返回-1
# print(x.index('p'))  # 字符串中没有'p'报错

# 指定范围查找
print(x.find('l', 4, 9))  # -1 查找下标4-9的范围(包括4不包括9)字符串中'l',没有'l'返回-1

# 获取下标最大值的指定字符
print(x.rfind('l'))  # 27
print(x.rindex('l'))  # 27

 判断字符串

# starswith/endswitf/isalpha/isdigit/isalnum/isspace
# is开头的是判断,结果是一个布尔类型(汉字判断的话不是数字但是字母)
print('hello'.startswith('he'))  # True 判断字符串是否是'he'开头
print('hello'.endswith('o'))  # True 判断字符串是否是'o'结尾
print('你是风儿我是沙,风沙缠绵绕天涯'.startswith('你是')) #True
print('你是风儿我是沙,风沙缠绵绕天涯'.endswith('涯'))  # True
# 判断字符串是否全部为字母,不接受任何参数
print('he45llo'.isalpha())  # False
# 判断字符串是否全部为数字,不接受任何参数
print('good'.isdigit())  # False
print('123'.isdigit())  # True
print('3.14'.isdigit())  # False 只认数字,'.'不是数字

# alnum 判断所有字符串是否是数字或字母,不接受任何参数
print('ab12hello'.isalnum())  # True
print('hello'.isalnum())  # True
print('1234'.isalnum())  #True
print('he4-1'.isalnum())  # False 减号不是满足字母和数字
# 判断是否全部为空格,不接受任何参数
print('   '.isspace())  # True
# 判断所有字符是否是小写
print('abc'.islower()) # True
# 判断所有字符都是大写
print('ABC'.isupper())  # True
# 判断所有单词都是首字母大写,像标题
print('Hello Worlld'.istitle())  # True

# 计次字符串
字符串 = '今天天气好晴朗,处处好风光呀好风光'
print(字符串.count(('好')))  # 3

# 替换字符串
word = 'hello'
word.replace('l', 'x') # replce 将字符串里'l'替换成'x'
print(word) # 字符串是不可变数据类型,所以打印的还是hello
m = word.replace('l','x')
print(m)  #hexxo 原来的字符串不会改变,而是生成一个新的字符串来保存替换后的结果

in运算符(判断字符串中是否有某个字符)

word = 'hello'
x = 'o'
# 判断用户输入的字符在字符串中是否存在
# for...in命令
for 变量 in word:
    if 变量 == x:
        print('您输入的内容存在')
        break
else:
    print('您输入的内容不存在')

# find函数
if word.find(x) == -1:
    print('您输入的内容不存在')
else:
    print('您输入的内容存在')

# if...in命令
if x in word:
    print('存在的')
else:
    print('不存在的')

字符串计次

好在字符串中出现3次

# 计次字符串
字符串 = '今天天气好晴朗,处处好风光呀好风光'
print(字符串.count(('好')))  # 3

 修改字符串

# 1、 修改大小写

# capitalize 让第一个单词的首字母大写
print('hello world.good morning\nyes'.capitalize())  # Hello world.good morning换行yes
# title 每个单词的首字母大写
print('good morning'.title())  # Good Morning
# upper 全大写
print('hello'.upper())  # HELLO
# lower 全小写
print('WoRLd'.lower())  # world 面向对象里,我们称之为方法

'''实际应用场景:
while True:
    内容 = input('请输入内容:(输入exit退出)')
    print('您输入了', 内容)
    if 内容.lower() == 'exit':  # 如果不加lower,客户输入的大写Exit就退出失败了
        break
'''
# 2、填充字符串
# 让字符串以指定长度显示,如果长度不够,默认在右边使用空格补齐;如果本身已经超过指定长度就不再填充了

# ljust(width,fillchar)长度,填充字符
print('Monday'.ljust(10))  # Monday   以10的长度显示不够的话默认用空格填充
print('Monday'.ljust(10, '+'))  # Monday++++
print('Tuesday'.rjust(12, '-'))  # -----Tuesday
# center 让字符串居中,两边填充
print('Wednesday'.center(20, '*'))  # *****Wednesday******
# 3、删除
print('   apple   '.lstrip())  # apple   # 删除字符串左边的空格
print('+++apple+++'.lstrip('+'))  # apple+++
print('   pear   '.rstrip())  # pear删除字符串右边的空格
print('   banana   '.strip())  # 删除两边的空格

# 以某种固定格式显示的字符串,我们可以将它切割成为一个列表
x = 'zhangsan,lisi,wangwu,jack,tony,henny,chris'
名字 = x.split(',')
print(名字)  # ['zhangsan', 'lisi', 'wangwu', 'jack', 'tony', 'henny', 'chris']

# 将列表转换成为字符串
水果 = ['apple', 'pear', 'peach', 'banana', 'orange', 'grape']
print('*'.join(水果))  # apple*pear*peach*banana*orange*grape
print('-'.join('hello'))  # h-e-l-l-o
print('+'.join(('yes', 'ok')))  # yes+ok 元组

分割字符串 

# split splitlines partition rpartition
# 字符串类型的数据
x = 'zhangsan,lisi,wangwu,jerry,henry,merry,jack,tony'
# split方法,可以将一个字符串切割成一个列表
y = x.split(',')
print(x)  # zhangsan,lisi,wangwu,jerry,henry,merry,jack,tony  字符串是不可改变数据类型
print(y)  # ['zhangsan', 'lisi', 'wangwu', 'jerry', 'henry', 'merry', 'jack', 'tony']
# 分割2次
z = x.split(',', 2)
print(z)  # ['zhangsan', 'lisi', 'wangwu,jerry,henry,merry,jack,tony']
# rsplit方法,从右往左进行分割,但是顺序依然是从左往右
变量 = x.rsplit(',', 2)
print(变量)  # ['zhangsan,lisi,wangwu,jerry,henry,merry', 'jack', 'tony']

# splitlines方法,按换行切割成一个列表,不接受参数
名字 = '张三\n李四\n王五'
print(名字.splitlines())  # ['张三', '李四', '王五']

# partition方法,指定一个字符串作为分割符,分为三部分;返回一个元组
print('abcdefhijklmnkopqr'.partition('k'))  # ('abcdefhij', 'k', 'lmnkopqr')
print('abcdefhijklmnkopqr'.rpartition('k'))  # ('abcdefhijklmn', 'k', 'opqr') 从右边的'k'分割
# 实际应用场景:
视频文件 = '2022.7.30prthon学习视频.mp4'
print(视频文件.partition('.'))  # ('2022', '.', '7.30prthon学习视频.mp4')
print(视频文件.rpartition('.'))  # ('2022.7.30prthon学习视频', '.', 'mp4')

替换字符串 

# 替换字符串
word = 'hello'
word.replace('l', 'x') # replce 将字符串里'l'替换成'x'
print(word) # 字符串是不可变数据类型,所以打印的还是hello
m = word.replace('l','x')
print(m)  #hexxo 原来的字符串不会改变,而是生成一个新的字符串来保存替换后的结果

字符串编码格式 

# unicode 字符--> 数字编码存在一个对应的关系
# 使用内置函数 chr 和 ord 能够查看数字和字符的对应关系;ord获取字符对应的编码; chr根据编码获取对应的字符
print(ord('a'))  # 97
print(chr(65))  # A
print(ord('凡'))  # 20961
print(ord('は'))  # 12399
print(chr(22269))  # 国

# GBK UTF-8 BIG5
# 使用内置函数encode,可以将字符串转换为指定编码集结果
print('你'.encode('gbk'))  # b'\xc4\xe3'-->十进制50403  二进制11000100 11100011
print('你'.encode('utf8'))  # b'\xe4\xbd\xa0'-->十进制14990752  二进制11100100 10111101 10100000
# 如果有一个编码集的结果,想把它转换成为对应的字符,使用decode
十六进制 = b'\xe4\xbd\xa0'
print(十六进制.decode('utf8'))  # 你

# 文本乱码原因(了解)
y = '你好'.encode('utf8')  # utf8是3个字节
print(y)  # b'\xe4\xbd\xa0\xe5\xa5\xbd'

print(y.decode('gbk'))  # 浣犲ソ y是使用utf8编码的'你好',现在使用gbk解码出来就是b'\xe4\xbd  xa0\xe5  xa5\xbd' gbk是两个字节
print(y.decode('utf8'))  # 你好
x = b'\xe4\xbd\xa0\xe5'
print(x.decode('gbk'))  # 浣犲ソ

 字符串占位符

%

# 在字符串里可以使用%占位符
名字 = '小明'
年龄 = 18
# %s 表示的是字符串的占位符
# %d 表示整数的占位符
# %f 表示浮点数的占位符
print('大家好,我的名字是%s,我今年%d岁了,我今天挣了%f元钱!'%(名字,年龄,3.14))  # 大家好,我的名字是小明,我今年18岁了,我今天挣了3.140000元钱!
# %2d或%nd等等 表示打印时显示n位,如果不够再前面使用空格补全
print('各位嘉宾好,我是%8d号男嘉宾' % 15)  # 各位嘉宾好,我是      15号男嘉宾
print('各位嘉宾好,我是%-3d号男嘉宾' % 8)  # 各位嘉宾好,我是8  号男嘉宾  -3d指向后显示3位字符,不够空格补全
print('各位嘉宾好,我是%011d号男嘉宾' % 78)  # 各位嘉宾好,我是00000000078号男嘉宾
# %.nf 表示保留小数点后n位
print('我今天挣了%.2f元钱' % 3.14892653)  # 我今天挣了3.15元钱
# %x 表示将数字使用十六进制输出
a = 255
print(a)  # 289
print('%x' % a)  # ff
print('%X' % a)  # FF
# %%取消占位符功能
print('我今年%d岁了,我叫%%s' % 年龄)  # 我今年18岁了,我叫%s

# 在字符串中使用占位符
a = '各位嘉宾好,我是%d号男嘉宾' % 年龄
print(a)  # 各位嘉宾好,我是18号男嘉宾



.format

# {}也是占位符---最常用的因为不限制格式
x = '大家好,我是{},今我年{}岁了'.format('张三', 18)
print(x)  # 大家好,我是张三,今我年18岁了

# {数字}:根据数字顺序来进行填入。数字从0开始
y = '大家好,我是{1},我今年{0}岁了'.format(20, 'jerry')
print(y)

# {变量}
z = '大家好,我是{名字},我今年{年龄}岁了,我来自{地区}'.format(名字='小明', 年龄=19, 地区='河南')
print(z)

# 混合使用{数字}{变量}
a = '大家好,我是{名字},我今年{1}岁了,我来自{0}'.format('周口', 23, 名字='小红')
print(a)

# 列表形式
d = ['张三', 18, '上海', 180]  # 列表
b = '大家好,我是{},我今年{}岁了,我来自{},身高{}cm'.format(*d)
print(b)

# 字典形式
info = {'name': 'chris', 'age': 23, 'addr': '北京', 'height': 190}
c = '大家好,我是{name},我来自{addr},身高{height}cm,我今年{age}岁了'.format(**info)
print(c)  # 大家好,我是chris,我来自北京,身高190cm,我今年23岁了

JSON字符串 

# JSON的使用,把列表/元组/字典等转换成为JSON字符串
# JDON实际应用场景:和前端或别的语言交互时人家有可能都不认识字典,所以统一成JSON字符串大家都认识
import json

person = {'name':'zhangsan','age':18,'gender':'female'}
甲 = json.dumps(person)  # dumps将字典/列表/集合/元组等转换成为JSON字符串
print(甲, type(甲))  # {"name": "zhangsan", "age": 18, "gender": "female"} <class 'str'>

print(json.dumps(['hello', 'good', 'yes', True]))  # ["hello", "good", "yes", true]
print(json.dumps(('hello', 'good', 'yes', False)))  # ["hello", "good", "yes", false]
# Python             JSON
# 字符串              字符串
# 字典                对象
# 列表/元组            数组
# True               true
# False              false
# 那怎么把JSON字符串转换成字典呢?答:eval和json.loads
# JSON中的数组转换成Python是列表,不是元组
乙 = '{"name":"lisi","age":20,"gender":"male"}'
丙 = eval(乙)
print(丙,type(丙))  # {'name': 'lisi', 'age': 20, 'gender': 'male'} <class 'dict'>

丁 = '["hello","good"]'
戊 = json.loads(丁)
print(戊,type(戊))  # ['hello', 'good'] <class 'list'>







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值