第八天 字符串 流程控制(二)

6 字符串

一、字符串

字符串就是由若干个不同的unicode字符组成的不可变序列

1 .字符串创建

#单引号字符串
str1 = ‘天要下雨,娘要嫁人,由他去吧’
str2 = str() #空串
str3 = str([10,20,30])
#双引号字符串
str2 = “天要下雨,娘要嫁人,由他去吧”
#三引号字符串 多行字符串
str3 = ‘’’
好雨知时节
当春乃发生
‘’’
str4 = “”"
随风潜⼊入夜
润物细无声
“”

2.获取字符

因为是不可变序列,所以不能修改单个字符;凡是修改字符串的操作都产生新串

str1 = ‘天要下雨,娘要嫁人,由他去吧’
print(str1[0],str1[-1]) #天 吧

3.字符串转义

  • 常见转义字符
转移字符说明转移字符说明
\’单引号\"双引号
\n换行\r回车
\ttab\\\
  • 原生字符
    如何在字符串中不把\当做转移字符,可以使用

str1 = r’c:\wh1803\course\1’
print(str1) #c:\wh1803\course\1

4.序列通用操作

#1 字符串拼接
#对于字符串字面值,只要相邻两个字符串中间没有其他字符就会自动拼接为一个字符串
str1 = ‘中美达成共识’
          ‘不打贸易战’
print(str1) #中美达成共识不打贸易战
#其他情况使用+运算符拼接字符串
str1 = ‘你好’
str2 = ’ 树先生’
print(str1 + ‘世界’)
print(str1 + str2)
#2.字符串重复
str1 = ‘汪’ * 3
print(str1) #汪汪汪
#3.成员操作
str1 = ‘天要下雨,娘要嫁人,由他去吧’
if ‘天’ in str1:
print(‘是成员’)
else:
print(‘不是成员’)
#4.字符串截取(切片)
str1 = ‘123456’
print(str1[0:2]) #‘12’
print(str1[1:]) #‘23456’
print(str1[::2]) #‘135’
print(str1[:]) #‘123456’
print(str1[::-1]) #‘654321’
#5.字符串长度
print(len(str1))

4 字符串常用函数

4.1 字符串查找和替换

str1 = ‘a fox jumped over the fence’

方法名说明示例
str.count(sub,start=0,end=len(string))查找子串sub出现的次数;start从指定下标开始查,end结束下标str1.count(‘f’)
str.find(str, beg=0, end=len(string))从左向右检测字符串中是否包含子字符串 str,如果包含返回下标,否则返回-1。beg和end是可选参数,指定查找范围str1.find(‘fox’)
str.index(sub[, start[, end]])作用类似find,但子串sub不存在会报错ValueErrorstr1.index(‘fox’)
str.replace(old, new[, count])返回一个新字符串,原串中的old被替换为new,可选参数count指定替换次数。str1.replace(‘a’,‘many’)
4.2 字符串分隔和组合
方法名说明示例
str.split([sep[,num=count(sep)]])将字符串拆分为以sep为分隔符的列表,如果指定num,则最多拆分num次str1.split(’ ')
str.partition(seq)将字符串拆分为一个有三个元素的元组(seq前的字符串,seq,seq后的字符串)。
str.splitlines([keepends])拆分一个包含多行的字符串,以每行为一个元素返回一个列表。keepends是一个True字符或非零整数,表示保留行尾标志(即换行符)
str.join(seq)以指定字符串str作为分隔符,将seq对象中所有的元素(字符串表示)合并为.一个新的字符串;seq可以是字符串、列表等
4.3 字符串判断
方法说明示例
str.isalpha()判断字符串是否由字母构成并且只包含字母,是返回True,否返回Falsestr1.isalpha()
str.isalnum()检测字符串是否由字.母和数字组成,如果都是数字或字.母返回True,否则返回False
str.isdigit()检测字符串是否由数字构成,可检测byte类型
str.isdecimal()检测字符串是否由数字构成
str.isnumeric()检测字符串是否由数字构成, 可以检测汉字数字:十
str.isspace()检测字符串是否只有空格或tab构成
str.islower()检测字符串中的字母字符是否全部由小写字母组成
str.isupper()检测字符串中的字母字符是否全部由大写字母组成
str.startswith(suffix[,start[, end]])用于判断字符串是否以指定子字符串开头,如果是则返回True,否则返回False。
str.endswith(suffix[,start[, end]])用于判断字符串是否以指定子字符串结尾,如果是则返回True,否则返回False。
4. 4字符串转换
方法说明示例
str.lower()字符串转小写
str.upper()字符串转大写
str.swapcase()把字符串中的大小写字母互换,大写转换成小写,小写转换成大写。不去管非字母类字符。
str.capitalize()将字符串的第一个字符转换为大写, 其余转换为小写
str.title()字符串中每个单词的首字母大写,其余小写。
str.lstrip([chars])str.lstrip([chars]) 去除字符串左边指定的字符,默认是去除空格
str.rstrip([chars])去除字符串右边指定的字符,默认是去除空格
str.strip([chars])去除字符串两边指定的字符,默认是去除空格
4.5 其它方法

#1. 将其他类型转换为字符串
print(str(90)) #‘90’
print(str([20,30])) #’[20,30]’
#2 ord(x) 返回一个字符所对应的码值
print(ord(‘a’)) #97
print(ord(‘中’)) #20013
#3 chr(x) 输入一个unicode码,返回一个对应的字符。
print(chr(20013)) #中

5. 字符串格式化

  • 用%格式化

%[flags][width][.precision]typecode
flags:对其方式,-左对齐 +右对齐(默认),0表示用0填充(只针对数值型),默认是用空格填充
width:所占宽度,单位是列
.precision: 精度,如果带小数点,可以指定带几位小数,指定后会四舍五入
typecode: d 将数值转换为整型显示;f 将数值转换为浮点数显示 s将数值转换为字符串显示
#大家好,我叫 王尼玛,我今年年35岁了,我有5000000.69
print(“⼤大家好,我叫%+6s,我今年年%d岁了,我有%10.2f” % (‘王尼玛’,35,5000000.687))

  • 用format格式化在这里插入图片描述

[[fill]align][sign][#][width][.precision][type]
fill: 填充字符,可选
align: 对齐方式 <左对齐 >右对齐 ^居中对齐
sign:显示符号,+正数显示正号,负数显示符号;-正数不显示符号,负数显示符号
#: 对于2、8、16进制会显示0b 0o 0x
width: 宽度
, 千分位分隔符
.precision:精度
type: s字符串串 d整型 f浮点数
tp1 = “I am {}, age {}, {}”.format(“seven”, 18, ‘alex’)
tp2 = “I am {name}, age {age}, really
{name}”.format(name=“seven”, age=18)
tp3 = “I am {: s}, age {:d}, money {:.0f}”.format(“seven”, 18,
88888.1)
print(tp1) #I am seven, age 18, alex
print(tp2) #I am seven, age 18, really seven
print(tp3) #I am seven, age 18, money 88888

二、字节

在python3中最重要的特性是对文本和二进制数据做了更加清晰的区分,文本总是Unicode,由字符类型表示,而二进制数据则由byte类型表示,python3不会以任意隐式方式混用字节型和字符型,也因此在python3中不能拼接字符串和字节包(python2中可以,会自动进行转换),也不能在字节包中搜索字符串,也不能将字符串传入参数为字节包的函数。

Bytes 对象是由单个字节作为基本元素(8位,取值范围 0-255)组成的序列,为不可变对象。 bytes对象只负责以二进制字节序列的形式记录所需记录的对象,至于该对象到底表示什么(比如到底是什么字符)则由相应的编码格式解码所决定。Python3中,bytes通常用于网络数据传输、二进制图片和文件的保存等等。可以通过调用bytes()生成bytes实例,其值形式为 b’xxxxx’,其中 ‘xxxxx’ 为一至多个转义的十六进制字符串(单个 x 的形式为:\x12,其中\x为小写的十六进制转义字符,12为二位十六进制数)组成的序列,每个十六进制数代表一个字节(八位二进制数,取值范围0-255),对于同一个字符串如果采用不同的编码方式生成bytes对象,就会形成不同的值.

在这里插入图片描述

1 创建字节

#创建字节
b1 = b’hello’
b2 = b"ello"
b3 = b’’‘hello’’’
b4 = bytes(‘中.文’,‘utf-8’)

2 字符串和字节的转换

#字符串转字节
s1 = “中文”
s2 = s1.encode(‘utf-8’) #str.encode()
print(type(s2)) #<class ‘bytes’>
print(s2) #b’\xe4\xb8\xad\xe6\x96\x87’
#字节转字符串
s3 = s2.decode(‘utf-8’) #bytes.decode()
print(type(s3)) #<class ‘str’>
print(s3) #中文

作业

# 编程
# 【初级】
# 1. 输入一个字符串,自己统计该字符串有多少个字符,不允许用len函数

s1 = input('请输入一个字符串:')
j = 0
for i in s1:
    j += 1
print('共有{:d}个字符串' .format(j))

# 2.任给一个字符串,请验证是否是手机号,手机号为11位数字,开头三位必须
# 是130,151,186
# - 使用列表存储130,151,186;使用in判断
# - 使用切片左取3位

tel1 = '130,151,186'
while True:
    tel = input('请输入手机号码:')
    if len(tel) == 11:
        if tel[0:3] in tel1:
            break
print('手机号码已输入')

# 3.将字符串串’1234567890’转换成‘ 1,234,567,890’输出,每3位⽤用逗号隔开。

str1 = int('1234567890')
print('str1={:,}'.format(str1))

# 4.输入两个字符串,从第一字符串中删除第二个字符串中所有的字符

str1 = input('输入第一个字符串:')
str2 = input('输入第二个字符串:')
str3 = ''
for i in str1:
    if i not in str2:
        str3 += i
print(str3)

# 方法二:
for i in str2:
    str1 = str1.replace(i,'')
print(str1)

# 5.任意输入一段文字,统计有多少个单词(用空格隔开)、多少个数字、多少字母、多少空格。

str1 = 'i am a students 2 class 50 classmate'

word = len(str1.split(' '))  #统计有多少个单词
space = str1.count(' ')   #统计多少个空格
letter, num = 0,0
for i in str1:
    if i.isdigit():       #多少数字
        num += 1
    if i.isalpha():       #多少字母
        letter += 1
print('包含{}个单词,{}个数字,{}个字母,{}个空格'.format(word,num,letter,space))

# 6. 已知字符串串 a = "aAsmr3idd4bgs7Dlsf9eAF",要求如下:
# a.将a字符串的数字取出,并输出成一个新的字符串串

a = "aAsmr3idd4bgs7Dlsf9eAF"
b = []
for i in a:
    if i.isalpha():
        b.append(i)
print(''.join(b))

# b.请统计a字符串出现的每个字母的出现次数(忽略大小写,a与A是同一个字
# 母),并输出成一个字典。例例 {'a':4,'b':2}

print(set(a))
result = {ch:a.count(ch) for ch in set(a)}
print(result)

# c.输出a字符串出现频率最高的字母

print(max(result.keys()))

# d.请判断 'boy'里出现的每一个字母,是否都出现在a字符串里。如果出现,则输出True,否则,则输出False
str2 = 'za'
list = []
for j in str2:
    if j in a:
        list.append('true')
    else:list.append('false')

str3 = ','.join(list)
if 'false'in str3:
    print(False)
else:print(True)

# 【中级】
# 1.input函数每次只能输入一个字符串,请实现如下输入格式:1,20,30 。然后
# 将获得的字符串分割,得到:三个整数:1 20 30,然后赋值给三个变量。

str1 = input('请输入数字格式如1,20,30:')
a, b, c = str1.split(',')
print(a,b,c)

# 2.求字符串最后一个单词的长度,单词之间用空格分割。

str1 = 'i am a students'
list1 = str1.split(' ')   #字符串转列表
print(list1)
print(list1[-1])
print(len(list1[-1]))    #获取字符串最后一个值的长度

# 3.输入一个字符串,压缩字符串如下aabbbccccd变成a2b3c4d1

a = 'aabbbccccd'
list1 = []
result = {ch:str(a.count(ch)) for ch in a}
print(result)
for x, y in result.items():
    list1.append(x)
    list1.append(y)
    print(x,y)
print(list1)
print(''.join(list1))

# 4.给定一个句子(只包含字母和空格),将句子中的单词位置反转,单词用空
# 格分割, 单词之间只有一个空格,前后没有空格。例如:
# “hello xiao mi”-> “mi xiao hello”

str1 = 'hello xiao mi'    #'mi xiao hello'
list1 = []
list1 = str1.split(' ')
print(list1)
str2 = ' '.join(list1[-1::-1])
print(str2)

# 5.将s = “ajldjlajfdljfddd",去重并从小到大排序输出"adfjl"

s = 'ajldjlajfdljfddd'
list1 = []
for i in s:
    if i not in list1:
        list1.append(i)
list1.sort()
print(''.join(list1))

# 6.使用密码表加密
# 密码表加密是一种十分常用的密码加密方法,加密的原理是根据明文和密
# 码表,加密形成密文,根据密文和密码表解密,读出明文。密码表可以是如下表所示:
# 自己设计密码表,任意输入一个字符串,然后显示其密文。运行输入如下所示:
# 密码表内容为:
# 明文表:abcdefghijklmnopqrstuvwxyz1234567890
# 密文表:18ac4y7bxuiep23hjs5ofwv0zdl9gkm6nqrt
# 请输入明文:abcdefghijklmnopqrstuvwxyz1234567890
# 加密后密文:18ac4y7bxuiep23hjs5ofwv0zdl9gkm6nqrt

a = 'abcdefghijklmnopqrstuvwxyz1234567890'
b = '18ac4y7bxuiep23hjs5ofwv0zdl9gkm6nqrt'
res = zip(a,b)
print(list(res))    #[(1, 2), (2, 3), (3, 4)]
#可以使用for-in 遍历
dict1 = {}
dict1 = {x:y for x,y in zip(list(a),list(b))}
str1 = input('请输入明文:')
str2 = [dict1[x] for x in str1]
print('加密后密文:',''.join(str2))

# 【选做】
# 1.凯撒密码:
# 凯撒密码的使用最早可以追溯到古罗马时期,《高卢战记》有描述恺撒曾
# 经 使用密码来传递信息,即所谓的“恺撒密码”,它是一种替代密码。通过
# 将字母按顺序推后起 n 位起到加密作用,如将字母 A 换作字母 D,将字母
# B 换作字母 E。因据说恺撒是率先使用加密函的古代将领之一,因此这种加
# 密方法被称为恺撒密码。这是一种简单的加密方法,这种密码的密度是很
# 低的,只需简单地统计字频就可以破译。现今又叫“移位密码”,只不过移动
# 的位数不确定而已。已知下面的文字是经过“凯撒”密码加密的,请将其解
# 密,将解密后的内容输出到屏幕上。
# Rqfh pruh lqwr wkh euhdfk,ghdu iulhqgv,rqfh pruh;
# Ru forvh wkh zdoo xs zlwk rxu Hqjolvk ghdg.
# Lq shdfh wkhuh'v qrwklqj vr ehfrphv d pdq
# Dv prghvw uwlooqhvv dqg kxplolwb:

a = 'abcdefghijklmnopqrstuvwxyz,.: '
b = 'defghijklmnopqrstuvwxyzabc,.: '
res = zip(a,b)
dict1 = {x:y for x,y in zip(list(a),list(b))}
str1 = 'rqfh pruh lqwr wkh euhdfk,ghdu iulhqgv,rqfh pruh' \
       'ru forvh wkh zdoo xs zlwk rxu hqjolvk ghdg.' \
       'lq shdfh wkhuhv qrwklqj vr ehfrphv d pdq' \
       'dv prghvw uwlooqhvv dqg kxplolwb:'
print(str1)
str2 = [dict1[x] for x in str1]
print('加密后密文:',''.join(str2))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值