python-9

(续)十三、字符串详述

接上一篇博文,对字符串(主要是字符串内置函数)这一知识点进行详细叙述和回顾复习。
注释:声明一个字符串,默认可以调用内建函数(系统准备好的一些函数)

3、字符串内置函数之----大小写

主要介绍下面这几个函数的用法:

  • capitalize():将字符串的第一个字符转换为大写
  • title():返回“标题化”的字符串,就是说所有单词都是以大写开始,其余字母均为小写
  • istitle():如果字符串是标题化的,则返回True,否则返回False
  • upper() 、 isupper() 将字符串全部转成大写的表示形式
  • lower() 、islower() 将字符串全部转成小写的表示形式
    演示代码如下:
message = 'zhaorui is a beautiful girl!'

msg = message.capitalize()    #.表示调用某函数,.capitalize():将字符串的第一个字符转换为大写的表示形式
print(msg)   # 运行结果显示Zhaorui is a beautiful girl!,首字母大写了

msg1 = message.title()  # 返回的是 每个单词首字母大写的字符串
print(msg1)  # Zhaorui Is A Beautiful Girl!
result = msg1.istitle()  # 返回的结果是布尔类型的,结果是True  False  .is...的就大部分是判断
print(result)

msg2 = message.upper()  # 将字符串全部转成大写的表示形式
print(msg2)

msg3 = msg2.lower() # 将字符串全部转成小写的表示形式
print(msg3)

运行结果如下:

Zhaorui is a beautiful girl!
Zhaorui Is A Beautiful Girl!
True
ZHAORUI IS A BEAUTIFUL GIRL!
zhaorui is a beautiful girl!

接下来是一个重点,也是一个和实际生活接轨的东西,在日常网络冲浪中,各个软件的登录不乏验证码的存在,那么四位的随机验证码(包含字母和数字,且输入验证时字母不区分大小写)是怎么生成的呢?让博主带大家一起来看一看!
初步代码如下:

s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0987654321'
print(len(s))  # 求字符串长度len(str),返回值是一个整型的数值。这是python的内建函数,它不属于字符串内建函数,如果是字符串内建函数,格式是:字符串.内建函数

# 四个随机数
code = ''
import random
ran = random.randint(1, len(s))       # randint取值包前也包后
print(ran)
print(s[ran])

分析:

  • 随机验证码的产生是从26个大、小写英文字母以及10个阿拉伯数字中随机产生,故设某字符串为(62个字符)‘QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0987654321’

  • 再生成四个随机字符。这里涉及random.randint()的用法,在之前的博文python-5中练习-------2猜大小的游戏里有用到过,在其中的用法是:random.randint(参数1,参数2)。其中,参数1和参数2必须是整数,且为参数1和2之间的任意整数,该范围包含参数1,也包含参数2。
    现在ran = random.randint(1, len(s)),像这样写是因为len(str)返回值是一个整型的数值。

  • 上述程序执行时可能会出错,为什么呢?因为字符串s的长度是62,所以random.randint(1, len(s))的取值为1-62(包含1,也包含62)中的任意值,但是在切片操作中,对字符的排序从左起0开始至len(s)-1为止,即0-61之间的任意数,若random.randint(1, len(s))刚好取到62,而切片操作中不包含62这个值,代码就会报错:下标/索引错误,字符串的下标/索引超出了范围(IndexError:string index out of range)
    例如:

    s = 'abc'
    print(s[3])
    

    运行结果:

    IndexError: string index out of range
    

经以上种种分析,最终修改代码如下:

s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0987654321'
code = ''
for i in range(4):      #产生四次随机字符
    import random
    ran = random.randint(0, len(s)-1)       # randint取值包前也包后
    # print(ran)
    # print(s[ran])
    code += s[ran]  # 假设取到的字符是v,则code=code+'v'------->code='v'
print("验证码是:"+code)
#print("验证码是:", code)  与上一句功能一致,只是拼接所用方式略有不同
# 提示用户输入验证码
user_input = input('请输入验证码:')
# if user_input == code or user_input == code.lower()  or user_input == code.upper():  # 这句代码太长
#     print('验证码输入正确!')
# else:
#     print('验证码输入错误!请重新输入')
if user_input.lower() == code.lower():
    # 不如将用户输入与得到的随机验证码都转为小写再进行对比
    print('验证码输入正确!')
else:
    print('验证码输入错误!')

运行结果如下:

验证码是: BmEF
请输入验证码:bmef
验证码输入正确!
验证码是: bRto
请输入验证码:1234
验证码输入错误!

可见代码虽已经功能正确,却仍然存在一个小问题,就是只能验证一次无论结果对错都会退出程序。在平时我们遇到的随机验证过程中,如果输入错误,会重新再给我们一个随机验证码进行二次验证,直到验证成功方可进入登录界面。博主又进行了一些更改,实现了这个功能,代码如下:

s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0987654321'
while True:
    code = ''
    for i in range(4):
        import random
        ran = random.randint(0, len(s)-1)       # randint取值包前也包后
        # print(ran)
        # print(s[ran])
        code += s[ran]  # 假设取到的字符是v,则code=code+'v'------->code='v'
    print("验证码是:"+code)
    # 提示用户输入验证码
    user_input = input('请输入验证码:')
    if user_input.lower() == code.lower():
            print('验证码输入正确!')
            break
    else:
        continue

运行结果如下:

验证码是:418f
请输入验证码:1234
验证码是:8P3W
请输入验证码:12424
验证码是:gs1m
请输入验证码:1546
验证码是:lNGx
请输入验证码:lngx
验证码输入正确!

4、字符串内置函数之----查找替换

  • find():find(str, beg=0,end=len(string)),检查str是否包含在字符串中,如果指定范围beg和end,则检查是否包含在指定范围中,如果包含返回开始的索引值,否则返回-1
  • rfind():从你给我的右侧的字符串开始检索
  • index():跟find方法一样,只不过是如果str不在字符串中会报一个异常
  • rindex() 、 lindex()与 rfind()等同理
  • replace():replace(old, new,[max])将字符串中的str1替换成str2,如果max指定,则替换不超过max次
    演示代码如下:
s1 = 'index lucy lucky goods'
result = 'x' in s1   # in 在...里面,也可以说它是一个查找函数吧,只是返回值是布尔类型,告诉你能不能找到   find()告诉你要找的字符串位置在哪儿
print(result)
result = 'R' in s1
print(result)


position = s1.find('R')
print(position)   # 返回值是-1,则代表没有找到
position = s1.find('x')
print(position)
position = s1.find('l')
print(position)   # 如果可以找到则返回字母第一次出现的位置
# p = s1.find('l', beg=position)
# print(p)   #  运行会出错,TypeError: find() takes no keyword arguments  
# find函数没有关键字参数,只需要写出起始位置所在的索引/下标即可
p = s1.find('l', position)  # 从上一次position的位置起,还是找l出现的位置但是这里包含position的位置
print(p)
p = s1.find('l', position+1)  # 从不包含position的位置开始找,所以要加1
print(p)      # 也可以指定开始位置查找


p = s1.find('l', position+1, len(s1)-5)
print(p)
# find('要查找的字符',起始位置start,结束位置end)
p = s1.find('o', position+1, len(s1)-5)
print(p)

运行结果如下:

True
False
-1
4
6
6
11
11
-1

应用:给一个路径,截取它扩展名后缀
https://scpic.chinaz.net/files/pic/pic9/201908/zzpic19714.jpg美丽椰子树
这是博主在网上随意找的一个图片的地址,现在想把图片名拿过来怎么做? 要用截取字符串(切片)的方式去做。

代码如下:

url = 'https://scpic.chinaz.net/files/pic/pic9/201908/zzpic19714.jpg'
p = url.rfind('/')   # rfind():right find,从你给我的右侧的字符串开始检索/的位置,倒着往前检索
print(p)
filename = url[p+1:]  # 因为切片截取是包前不包后,如果从p开始就会把/也截取到
print("截取到的文件名为:", filename)
# 接下来如果想让你把文件的扩展名jpg截取下来,怎么办呢?
p = url.rfind('.')
kz = url[p+1:]
print("截取到的扩展名为:", kz)

运行结果如下:

46
截取到的文件名为: zzpic19714.jpg
截取到的扩展名为: jpg
  • index():跟find方法一样,只不过是如果str不在字符串中会报一个异常
a = 'hello'.index('x')
print(a)

运行结果如下:

ValueError: substring not found
  • replace(old, new, [max]) old、new都是必填参数,max为选填参数
s1 = 'index lucy lucky goods'
s2 = s1.replace(' ', '#')
print(s2)
# 去除空格
s3 = s1.replace(' ', '')
print(s3)
s4 = s1.replace(' ', '', 2) #替换两次
print(s4)

运行结果如下:

index#lucy#lucky#goods
indexlucyluckygoods
indexlucylucky goods

5、字符串内置函数之----编码、判断开头结尾

编码部分:

  • encode():编码 只要涉及到是中文的地方,在网络上传输会涉及到编码的问题
  • encode(encoding=‘UTF-8’,errors=‘strict’):以encoding指定的编码格式编码字符串,如果出错默认报一个ValueError的异常,除非errors指定的是’ignore’/‘replace’
  • decode():解码
    演示代码如下:
msg = '假期结束啦,开学要努力丫!'  # 该条message是中文内容
result = msg.encode('utf-8')
print(result)
dec = result.decode('utf-8')
print(dec)

result = msg.encode('gbk')
print(result)
dec = result.decode('gbk')
print(dec)

result = msg.encode('gb2312')
print(result)
dec = result.decode('gb2312')
print(dec)

运行结果如下:

b'\xe5\x81\x87\xe6\x9c\x9f\xe7\xbb\x93\xe6\x9d\x9f\xe5\x95\xa6\xef\xbc\x8c\xe5\xbc\x80\xe5\xad\xa6\xe8\xa6\x81\xe5\x8a\xaa\xe5\x8a\x9b\xe4\xb8\xab\xef\xbc\x81'
假期结束啦,开学要努力丫!
b'\xbc\xd9\xc6\xda\xbd\xe1\xca\xf8\xc0\xb2\xa3\xac\xbf\xaa\xd1\xa7\xd2\xaa\xc5\xac\xc1\xa6\xd1\xbe\xa3\xa1'
假期结束啦,开学要努力丫!
b'\xbc\xd9\xc6\xda\xbd\xe1\xca\xf8\xc0\xb2\xa3\xac\xbf\xaa\xd1\xa7\xd2\xaa\xc5\xac\xc1\xa6\xd1\xbe\xa3\xa1'
假期结束啦,开学要努力丫!

注释:

  • gbk:中文

  • gb2312:简体中文

  • unicode:想把各种编码统一化,具有普适性,但是unicode的功能还不够,所以出现了UTF-8,使其能达到国际标准

  • 所有的运行结果均以b开头,实际上是将中文转变成了字节(binary)的表示形式

  • 用什么进行编码的(编码之后的形式是字节,编码过后的结果便可以在网络上进行传输了),解码时就要用什么解码(解码是针对字节解码)


字符串内建函数:startswith() endswith() 返回值都是布尔类型True False

  • startswith()判断是否是以xxx开头的
  • endswith()判断是否是以xxx结尾的
    演示代码如下:
filename = '文章.doc'
result = filename.endswith('.txt')  # 判断filename是否是以txt结尾的
print(result)

filename = '文章.doc'
result = filename.endswith('.doc')  # 判断filename是否是以doc结尾的
print(result)

s = 'hello'
result = s.startswith('h')
print(result)

s = 'hello'
result = s.startswith('he')
print(result)

s = 'hello'
result = s.startswith('H')
print(result)

运行结果如下:

False
True
True
True
False

在开发过程当中的应用:完成图片上传的验证功能
先选择电脑某路径下的一个图片,得到其路径在找到文件名,通过文件名判断是否是图片类型,从路径的斜杠后面开始切片
假设选择的路径为:D:\照片\屏幕截图 2021-04-11 100703.png
分析:
1、上传文件路径,用rfind函数找到\的位置
2、从斜杠后面开始切片,通过切片截取出文件名
3、用文件名判断是否是图片类型

演示代码如下:

# path = 'D:\照片\屏幕截图 2021-04-11 100703.png'
path = input('请选择需要上传的文件或输入文件所在路径:')
position = path.rfind('\\')  # 从右往左找,找到单斜杠的位置
'''
解释一下为什么rfind里面写双斜杠呢?
position = path.rfind('\'),如果写成单斜杠,就会被转义掉
'''
# result = path[position:]
# print(result)  如果从position开始切片,则运行结果为:\屏幕截图 2021-04-11 100703.png,切片范围包前不包后,故会包含\
filename = path[position+1:]
print(filename)
judge = filename.endswith('.png' or '.jpg' or '.gif' or '.bmp')
print(judge)   # 用.endswith判断是否是图片类型

judge = filename.endswith(’.png’ or ‘.jpg’ or ‘.gif’ or ‘.bmp’),由于博主暂时还没有接触到正则表达式的知识,所以暂且这句话这么写!
运行结果如下:

请选择需要上传的文件或输入文件所在路径:D:\照片\屏幕截图 2021-04-11 100703.png
屏幕截图 2021-04-11 100703.png
True

来做一个练习回顾一下 字符串内置函数判断开头结尾的开发应用叭。
要求:
1、给定一个路径,上传文件(记事本txt或者是图片jpg,png)
2、如果不是指定格式的,允许重新指定上传文件(如何实现重新上传的功能?自然考虑到用while循环,但是在哪里加break呢)
3、如果符合上传的规定则提示上传成功

代码如下:

# path = 'D:\照片\屏幕截图 2021-04-11 100703.png'
while True:
    path = input('请选择需要上传的文件或输入文件所在路径:')
    position = path.rfind('\\')  # 从右往左找,找到单斜杠的位置
    filename = path[position+1:]
    # print(filename)
    judge = filename.endswith('.png' or '.jpg' or '.gif' or '.txt')
    if judge:  # 用.endswith判断是否是图片类型
        print('格式正确,允许上传!')
        break
    else:
        print('上传文件不符合,请重新选择')
        continue

运行结果如下:

请选择需要上传的文件或输入文件所在路径:D:\照片\屏幕截图 2021-04-11 100703.pn
上传文件不符合,请重新选择
请选择需要上传的文件或输入文件所在路径:D:\照片\屏幕截图 2021-04-11 100703.png
格式正确,允许上传!

切记:只要有while True出现的地方,循环里面一定要有break!适时地结束循环,否则就是死循环了

6、字符串内置函数之----判断是否是数字

  • isalpha():是否是字母
  • isdigit():是否是数字
s = 'abcdefg'
result = s.isalpha()
print('result=', result)

s = 'abcde12'
result = s.isalpha()
print('result=', result)

s = '123456'
result = s.isdigit()
print('result=', result)

s = 'lo123'  # 前两个字符是love的lo,不是数字1,0
result = s.isalpha()
print('result=', result)

result= True
result= False
result= True
result= False

应用:

sum = 0
for i in range(3):     # 0,1,2
    num = input("请输入数字:")
    if num.isdigit():
        sum += int(num)
    else:
        continue
print(sum)

运行结果如下:
只显示是数字的的加和

请输入数字:11qqweq
请输入数字:12
请输入数字:3
15

现在如果判断不是数字就重新从0开始遍历,再输入三次数字,怎么实现呢?

sum = 0
i = 1
while i <= 3:
    num = input("请输入数字:")
    if num.isdigit():
        sum += int(num)
        i += 1
        print('第{}个数字累加成功'.format(i-1))
    else:
        print('不是数字,请重新输入')
print(sum)

运行结果如下:

请输入数字:1
第1个数字累加成功
请输入数字:4
第2个数字累加成功
请输入数字:5
第3个数字累加成功
10

或者:

请输入数字:12
第1个数字累加成功
请输入数字:1o
不是数字,请重新输入
请输入数字:23
第2个数字累加成功
请输入数字:7
第3个数字累加成功
42

7、字符串内置函数之----合并拆分

  • .join():将字符串以指定连接符连接
  • .lstrip() :截掉字符串左边的指定字符
  • .rstrip():截掉字符串右边的指定字符
  • .strip() :截掉字符串两边的指定字符
  • .split(‘分隔符’,次数):分割字符串,将分割后的字符串保存到列表中
  • .count(‘argument’): 求字符串中指定参数的个数
    演示代码:
new_str = '-'.join('abc')
print(new_str)  # 将abc用-连接成一个新的字符串

# python 列表 list=['a', 'v', 'o', '9']

list1 = ['a', 'v', 'o', '9']
result = ''.join(list1)  # 空字符串类似于拼接
print(result)

result = ' '.join(list1)  # 以空格为连接符
print(result)
print(type(result))  # 返回的是字符串类型

运行结果如下:

a-b-c
avo9
a v o 9
<class 'str'>

演示代码:

s = '   hello     '
s = s.lstrip()
print(s)  # 截掉左边空格
print(s, '8')
print(s + '8')  # 给结果拼接一个8,然后就可以看出hello右侧的空格还在

s = s.rstrip()
print(s + '8')

s = '   hello     '
s = s.strip()
print(s)  # 截掉两边空格

运行结果如下:

hello     
hello      8
hello     8
hello8
hello

演示代码:

# split('分隔符',次数):分割字符串,将分割后的字符串保存到列表中
s = 'nice to meet you'
result = s.split(' ')
print(result)   # 呈现出列表的形式(把分割的东西放进一个列表里面啦)
result = s.split(' ', 2)    # 表示按照空格作为分隔符,分割字符串两次
# result = s.split(' ', num=2)    # 表示按照空格作为分隔符,分割字符串两次
# TypeError: 'num' is an invalid keyword argument for split()
print(result)

# .count(' '): 求字符串中空格的个数
# .count('argument'): 求字符串中指定参数的个数
n = s.count(' ')
print('空格的个数是', n)

s = 'aasdfghgfdszxc'
print(s.count('s'))

运行结果如下:

['nice', 'to', 'meet', 'you']
['nice', 'to', 'meet you']
空格的个数是 3
2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值