Day009 - 字符串和字符

字符串和字符

字符串定义

  • 容器型数据类型;
  • 将**’ ‘" "’’’ ‘’’""" “”“作为容器标志(’’’ ‘’’”"" “”"**换行可以不使用转义字符,可直接用回车);
  • 引号中的每个符号就是该字符串的元素;
  • 字符串不可变不支持增删改);字符串有序支持下标操作);
  • 元素:引号中的单独的每个符号都是字符串的元素(又叫字符),可以是任何符号
str1 = '900,100'
str2 = '''
abc
123
'''
print(str2)

空串

str8 = ''  # "" """"""
print(str8, type(str8), len(str8))  # <class 'str'> 0

字符

普通字符

  • 表示符号本身意义

转义字符

  • 具有特殊功能字符组合
  • 在特定符号前加****让符号具备特殊的功能;
  • 任意一个转义字符的长度为1

常用转义字符

  1. \n - 换行
  2. **\t ** - 水平制表符(相当于tab键的功能)
  3. \’ - 表示普通的单引号
  4. \" - 表示普通的双引号
  5. \\ - 表示一个普通的反斜杠
  6. \u - 4位的十六进制数(编码字符)
str3 = '\tabc\n123'
print(str3)
str4 = 'it`s me\'hahahah\''  # 使用转义字符展示单引号
str5 = "it`s me'hahahah'"  # 外层用双引号消除歧义
print(str4, str5)

str6 = 'abc\\name'
str7 = 'abc\name'
print(str6, str7)

# \u
str9 = 'abc\u5fdf'
print(str9)  # abc忟

r/R语法

  • 在字符串前面加r,那么字符串中所有的转义字符的功能都会消失;
str_r = 'abc123'
str_r1 = r'\'ttl\''
print(str_r, str_r1, str_r + str_r1)  # abc123 \'ttl\' abc123\'ttl\'

字符编码

编码

  • 计算机之呢过直接存储数字(而且保存的数字的二进制的补码),文字符号是无法直接存储到计算机中的。
  • 为了让计算机具备存储文字符号能力,给所有的文字符号对应一个固定的数字,每次存储符号对应的数字,符号对应的数字就是编码值。

编码表

ASCII码表
  • 总共有128个字符(美国符号)
  • 数字与字母位置
    • 数字在字母前面
    • 大小字母在小写字母前面
    • 大写字母与小写字母并不连续,中间有其他符号;
  • 数字字符:0~9 - 十进制|48~57
  • 大写字母字符:A~Z - 十进制|65~90
  • 小写字母字符:a~z - 十进制|97~122
Unicode编码表
  • 对ASCII编码表的扩展,包含了世界上所有的语言符号(又称:万国码),总共65536个
  • 中文范围:4e00 ~ 9fa5(16进制)

编码值在Python中的使用

  • chr 函数:chr(编码值) - 获取编码值对应的字符
  • ord 函数:ord(字符) - 获取字符的编码值
  • 编码字符:\u+4位编码值 - 表示这个编码值对应的字符
  • 注意:python中需要字符的地方都必须使用长度为1的字符串赋值
chr
print(chr(97))  # a
print(chr(35), chr(0x23))  # (# #)
print(chr(0x4e00), chr(0x9fa5))  # 一 龥
  • 练习1:打印中文字符

    num = 0
    for x in range(0x4e00, 0x9fa5+1):
        print(chr(x), end=' ')
        num += 1
        if num % 30 == 0:
            print()
    
  • 练习2:打印八卦阵图符号

    num = 0
    for x in range(0x4dc0, 0x4dff + 1):
        print(chr(x), end=' ')
        num += 1
        if num % 30 == 0:
            print()
    
ord
print(ord('傻'), ord('逼'))  # 20667 36924

# 练习:将大写字母转换成对应的小写字母
c = 'M'
print(chr(ord(c) + 32))  # m

字符串相关操作

查 - 获取字符串的字符

  • 字符串获取字符的语法和列表获取元素的语法一模一样

  • 如果字符串有转义字符需注意转义字符整体长度为1

str1 = '\tabc\n123\'+_'
print(str1[1], str1[-1])
print(str1[5:8], str1[5:-3])
print(str1[::-1])

数学运算符:+、*

print('hello' + 'world!')  # helloworld!
print('hello' * 2)  # hellohello
  • 练习

    1. 提取字符中小写字母
    str2 = 'ss试试看78,mvn0-k=上课23'
    new_str2 = ''
    for x in str2:
        if 97 <= ord(x) <= 122:
            new_str2 += x
    print(new_str2)  # ssmvnk
    
    print(''.join([x for x in str2 if 97 <= ord(x) <= 122]))  # ssmvnk
    

比较运算符

比较是否相等:==、!=

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

比较大小:>、<、>=、<=

  • 判断是否是数字字符:‘0’ <= char <= '9’

  • 判断是否是小写字母:‘a’ <= char <= 'z’

  • 判断是否是大写字母:‘A’ <= char <= 'Z’

  • 判断是否是字母:‘A’ <= char <= ‘Z’ or ‘a’ <= char <= 'z’

  • 判断是否是中文:’\u4e00’ <= char <= '\u9fa5’

  • 两个字符串比较大小,比较的是第一对不相等的字符的编码值的大小

print('Mnxy' > 'ab')  # False
print('你好吗' > 'hello')  # True
print('123' > 'KM123')  # False
  • 练习

    1. 统计中文字符个数

    2. 打印字符串中所有的数字字符

    3. 提取字符串中所有的字母

      str3 = '你好loe--23=sks;M9JHkyu是-12山卡拉'
      cn_count = 0
      num_1 = ''
      alphabet = ''
      for x in str3:
          if '\u4e00' <= x <= '\u9fa5':
              cn_count += 1
          elif 'A' <= x <= 'Z' or 'a' <= x <= 'z':
              alphabet += x
          elif '0' <= x <= '9':
              num_1 += x
      print(cn_count, num_1, alphabet)
      

in 和 not in

  • 判断字符串2中是否包含字符串1(判断字符串1是否是字符串2的子串)
print('1' in 'abc123')  # True
print('abc' in 'abc123')  # True
print(10 in [10, 20, 30])  # True
print([10, 20] in [10, 20, 30])  # False
print('ac' in 'abc123')  # False

相关函数

len(字符串)

str(数据)

  • 将数据转换成字符串(任何类型的数据都可以转换成字符串)
  • 转换的时候在数据的打印值外面加引号

eval(字符串)

  • 相当于str反向操作,返回传入字符串的表达式的结果
str(100)  # '100'
str(13.9)  # '13.9'
str([10, 20, 30])  # '[10, 20, 30]'
print(len(str([10, 20, 30])))  # 12 注意打印标准写法后符号后有空格,也算字符;
str(lambda x: x * 2)  # '<function <lambda> at 0x0000000002558F70>'

print(eval('100'))  # 100
print(eval('[10,20,30]'))  # [10, 20, 30]

result1 = eval('10')
print(result1, type(result1))  # 10 <class 'int'>

result2 = eval('[10,20,30]')
print(result2, type(result2))  # [10, 20, 30] <class 'list'>

result3 = eval('10 + 20')
print(result3, type(result3))  # 30 <class 'int'>

abc = 200
print(eval('abc'))  # 200

a = b = 10
print(eval('a + b'))  # 20

字符串相关方法

join

  • 字符串.join(序列)

  • 将序列中的元素使用指定的字符拼接成一个字符串(序列中的元素必须是字符串);

    list1 = ['abc', 'def', '999']
    result = ''.join(list1)
    print(result)  # abcdef999
    result1 = '+'.join(list1)
    print(result1)  # abc+def+999
    result2 = '123'.join('abc')
    print(result2)  # a123b123c
    
    # 练习1:将list2中所有元素拼接成一个字符串
    list2 = ['abc', 100, True, 'hello']
    result3 = ''.join([str(x) for x in list2])
    print(result3)  # abc100Truehello
    # 练习2:将list2中所有的字符串拼接成一个字符串
    list2 = ['abc', 100, True, 'hello']
    print(''.join([x for x in list2 if type(x) == str]))  # abchello
    

count

  • 字符串1.count(字符串2)

  • 统计字符串1中字符串2出现的次数;

    message = 'how are you? i am fine! thank you! and you?'
    result4 = message.count('you')
    print(result4)  # 3
    

index/find

  • 字符串1.index(字符串2)

    • 获取字符串2第一次出现在字符串1中的位置(下标值),字符串2不存在时报错
  • 字符串1.find(字符串2)

    • 获取字符串2第一次出现在字符串1中的位置(下标值),字符串2不存在时返回-1
  • rindex/rfind

    • 从右往左查找,找到最后一个匹配字符串返回下标值
result5 = message.index('you')
print(result5)  # 8
result6 = message.find('youm')
print(result6)  # -1
result7 = message.rindex('you')
print(result7)  # 39

split

  • 字符串1.split(字符串2)

    • 将字符串1中所有的字符串2作为切割点对字符串1进行切割
  • 字符串1.split(字符串2,N)

    • 将字符串1中所有的字符串2作为切割点对字符串1进行切割,最多切N次
  • 注意:无论怎么分布,切割后的段数都是切割点的数量加1

message = 'mnabc123abcxyzabcoop'
result8 = message.split('abc')
print(result8)  # ['mn', '123', 'xyz', 'oop']

message = 'abcmnabc123abcxyzabcoopabc'
result9 = message.split('abc')
print(result9, len(result9))  # ['', 'mn', '123', 'xyz', 'oop', ''] 6

message = 'mnabc123abcxyzabcoop'
result10 = message.split('abc', 1)
print(result10)  # ['mn', '123abcxyzabcoop']

replace

  • 字符串1.replace(字符串2,字符串3)

    • 将字符串1中的字符窜2替换成字符串3
  • 字符串1.replace(字符串2,字符串3,N)

    • 将字符串1中的字符窜2替换成字符串3,替换N次
message = 'how are you? i am fine! thank you! and you?'
result11 = message.replace('you', 'me')
print(result11)  # how are me? i am fine! thank me! and me?

message = 'how are you? i am fine! thank you! and you?'
result12 = message.replace('you', 'me', 2)
print(result12)  # how are me? i am fine! thank me! and you?

center\rjust\ljust\zfill

  • 字符串1.center(长度, 字符)

    • 将字符串1转换成指定长度新字符串,不够用指定的字符填充,原字符串居中显示
  • 字符串1.rjust(长度, 字符)

    • 将字符串1转换成指定长度新字符串,不够用指定的字符填充,原字符串居右显示
  • 字符串1.ljust(长度, 字符)

    • 将字符串1转换成指定长度新字符串,不够用指定的字符填充,原字符串居左显示
  • 字符串1.zfill(长度)

    • 将字符串1转换成指定长度新字符串,不够用’0’填充(字符串1.rjust(长度, ‘0’))
str1 = 'abc'
print(str1.center(9, '0'))  # 000abc000
print(str1.center(8, 'x'))  # xxabcxxx
print(str1.ljust(9, '0'))  # abc000000
print(str1.rjust(9, '0'))  # 000000abc

strip/rstrip/lstrip

  • strip - 去掉字符串两边的空白
  • lstrip - 去掉字符串左边的空白
  • rstrip - 去掉字符串右边的空白
str2 = '\t     abc 123     \n'
print(str2)  #      abc 123
print(str2.strip())  # abc 123
print(str2.lstrip())  # abc 123
print(str2.rstrip())  #      abc 123

upper/lower/swapcase

  • upper() - 全大写

  • lower() - 全小写

  • swapcase() - 交换大小写

title/capitalize

  • title() - 标题的每个单词都大写

  • capitalize() - 首个单词大写

is系列

  • isalnum() - 是否是字母和数字组成,无法排除中文。

  • isalpha() - 是否是字母

  • isdecimal() - 是否只包含十进制数字

  • isdigit() - 是否全部数字(0-9)

  • isidentifier() - 是不是字母和下划线开头,其他都是字母、数字、下划线

  • islower() - 是否都是小写

  • isupper() - 是否都是大写

  • isspace() - 是否只包含空白字符

字符串判断

  • endswith(suffix[,start[,end]]) - 在指定区间[start,end),字符串是否是suffix结尾

  • startswith(prefix[,start[,end]]) -> bool - 在指定区间[start,end),字符串是否是prefix开头

partition类

  • partition(sep) -> (head,sep,tail)

    • 从左至右,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组;
    • 如没有有找到分隔符,就返回头、两个空元素的三元组;
    • sep分割字符串必须指定
  • rpartition(sep) -> (head,sep,tail)

    • 从右至左,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组;
    • 如没有有找到分隔符,就返回头、两个空元素的三元组;
    • sep分割字符串必须指定

课后作业

  1. 输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)

    例如: 输入**'abcd1234 ’ ** 输出**‘bd24’**

    # str1 = 'sdfasfddgdfihwo3847asd,c;ad,faf'
    str1 = input('请输入字符串:')
    print(str1[1::2])
    print(''.join([str1[x] for x in range(len(str1)) if x % 2 == 1]))
    
  2. 输入用户名,判断用户名是否合法(用户名长度6~10位)

    str2 = input('请输入用户名:')
    if 6 <= len(str2) <= 10:
        print('用户名合法')
    else:
        print('用户名不合法')
        
        
    print(''.join(['用户名合法' if 6 <= len(str2) <= 10 else '用户名不合法']))
    
  3. 输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)

    例如: ‘abc’ — 合法 ‘123’ — 合法 ‘abc123a’ — 合法

    str3 = input('请输入用户名:')
    flag = True
    for x in str3:
        if 'A' <= x <= 'Z' or 'a' <= x <= 'z' or '0' <= x <= '9':
            pass
        else:
            flag = False
    if flag:
        print('用户名合法')
    else:
        print('用户名不合法')
    
  4. 输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)

    例如: ‘abc’ — 不合法 ‘123’ — 不合法 ‘abc123’ — 不合法 ‘Abc123ahs’ — 合法

    str4 = input('请输入用户名:')
    if 'A' <= str4[0] <= 'Z':
        flag = True
        for x in str4[1:]:
            if 'A' <= x <= 'Z' or 'a' <= x <= 'z' or '0' <= x <= '9':
                pass
            else:
                flag = False
        if flag:
            print('用户名合法')
        elif not flag:
            print('用户名不合法')
    else:
        print('用户名不合法')
    
  5. 输入一个字符串,将字符串中所有的数字字符取出来产生一个新的字符串

    例如:输入**‘abc1shj23kls99+2kkk’** 输出:'123992’

    str5 = input('请输入字符串:')
    print(''.join([x for x in str5 if x.isdigit()]))
    print(''.join([x for x in str5 if x.isnumeric()]))
    
  6. 输入一个字符串,将字符串中所有的小写字母变成对应的大写字母输出 (用upper方法和自己写算法两种方式实现)

    例如: 输入**‘a2h2klm12+’ ** 输出 'A2H2KLM12+'

    str6 = input('请输入字符串:')
    print(str6.upper())
    print(''.join([chr(ord(x1) - 32) if 'a' <= x1 <= 'z' else x1 for x1 in str6]))
    
  7. 输入一个小于1000的数字,产生对应的学号

    例如: 输入**‘23’,输出’py1901023’** 输入**‘9’, 输出’py1901009’** 输入**‘123’,输出’py1901123’**

    str7 = input('请输入数字:')
    print('py1901' + str7.zfill(3))
    print('py1901' + str7.rjust(3, '0'))
    
  8. 输入一个字符串,统计字符串中非数字字母的字符的个数

    例如: 输入**‘anc2+93-sj胡说’** 输出:4 输入**’===’** 输出:3

    str8 = 'anc2+93-sj胡说'
    str8 = input('请输入字符串:')
    count = 0
    for i in str8:
        if 'A' <= i <= 'Z' or 'a' <= i <= 'z' or '0' <= i <= '9':
            pass
        else:
            count += 1
    print(count)
    
  9. 输入字符串,将字符串的开头和结尾变成’+’,产生一个新的字符串

    例如: 输入字符串**‘abc123’, 输出’+bc12+’**

    str9 = input('请输入字符串:')
    print('+' + str9[1:-1] + '+')
    
  10. 输入字符串,获取字符串的中间字符

例如: 输入**‘abc1234’** 输出:‘1’ 输入**‘abc123’** 输出**‘c1’**

str10 = input('请输入字符串:')
len1 = len(str10)
len2 = len1 // 2
if len1 % 2 == 1:
    print(str10[len2])
else:
    print(str10[len2 - 1] + str10[len2])
  1. 写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)

例如: 字符串1为:how are you? Im fine, Thank you! , 字符串2为:you, 打印8

# str111 = 'how are you? Im fine, Thank you!'
# str112 = 'you'
str111 = input('请输入字符串1:')
str112 = input('请输入字符串2:')
if str112 in str111:
    new_str111 = str111.split(str112, 1)
    print(len(new_str111[0]))
else:
    print('字符串2不在字符串1中')
  1. 获取两个字符串中公共的字符

例如: 字符串1为:abc123, 字符串2为: huak3 , 打印:公共字符有:a3

str121 = 'abc!12@3'
str122 = 'h@ua!k3'
print(''.join([i for i in str122 if i in str121]))
print(''.join([i for i in str122 if str121.find(i) != -1]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值