• Python数据类型之字符串


    一:概述

    Python中的字符串的一些概念

    • 可以看作是字符的集合,在数据类型里没有单个字符的数据类型,可以用单个字符表示的一个字符串数据类型
    • 字符串是一种不可变的序列类型,单个字符从左到右按照顺序排列,同时修改某个位置的字符是不被允许的
    • 在Python3中,字符串可以分为三类,str用于Unicode文本,bytes用于二进制数据,bytearray是bytes的一种可变的变体

    1.1 字符串的创建

    通过单引号,双引号,三引号来创建一个字符串对象,本质上单引号和双引号及三引号的作用是一样的。

    name1 = 'wangys'
    name2 = "wangys"
    name3 = '''wangys'''
    
    使用单引号,双引号及三引号本质是一样的,都可以创建一个字符串对象

    1.2  其他

    也可以将不同的字串进行合并,字串之间使用空格,作用类似于 +号操作

    name = 'wa' "ng" '''ys'''
    print(name)
    # wangys

    name = 'wa',"ng",'''ys''' # 如果之间使用逗号,会组成一个元祖
    print(name)
    ('wa', 'ng', 'ys')

    二: 基本操作

    • 索引
    • 分片
    • 乘法
    • 判断是否包含值
    • 长度
    • 最大值
    • 最小值

    2.1 字符串索引及切片

    •  字符串时有序字符集合,可以通过位置(索引)找到相应的元素
    • Python中字符的偏移量是左到右开始计数的,从0开始,到字符串长度-1,也可以通过负数取得,负数偏移量跟这个字符串的长度之和就是这个字符的正偏移量
    • 表示方法是一对[]括号将偏移量写入即可得到该偏移量的字符
    • 分片时使用冒号分隔,切片结果包括左边界,不包括右边界,即顾头不顾尾
    • 分片时如果忽略了边界,左边界从0开始,右边界到字符串长度-1结束即到字符串的结尾并包括这个结尾
    • 分片时如果指定了步进数,意思是每隔步进数取一个索引值
    • 切片操作不仅仅对字符串有效,对元祖及列表也是一样的
    • 如果索引过界,通过索引取值时会报错

    2.1.1  索引

    name = 'wangys'
    print(name[0])
    print(name[2])
    print(name[-1])
    print(name[-3])
    # w
    # n
    # s
    # g

     2.1.2  分片(slice)

    name = 'wangys'
    # 没有定左右边界,则包括整个字符串 print(name[:]) # wangys

    # 没有定左边界,则从0开始 print(name[:3]) # wan

    # 如果没有定右边界,则到字符串的结尾 print(name[1:]) # angys
    #左右都定了边界,顾首不顾尾
    print(name[1:-1])
    # angy

    # 左右都定了边界,顾首不顾尾 print(name[1:3]) an
    name = 'wangys'
    # 步长默认情况
    print(name[::1])
    # 返回取整个字符串
    print(name[::-1])
    # 偏移量从1到5没隔2步取一个索引
    print(name[1:5:2])
    # 偏移量从5到1 每隔2步取一个索引
    print(name[5:1:-2])

    2.2  字符串拼接“+”

    first_name = 'jack'
    second_name = 'john'
    
    name = first_name+' '+second_name
    print(name)
    # jack john


    # 仅限字符串凭借,当使用数字类型时会报错
    name = 'wangys'
    age = 18
    info = name+age
    print(info)
    # TypeError: must be str, not int
     
    name = 'wangys'
    age = '18'
    info = name+age
    print(info)
    # wangys18

    2.3 字符串多复制*

    name = 'wangys'
    ret = name*3
    print(ret)
    # wangyswangyswangys

    print('-'*8)
    --------

    2.4 计算字符串的长度

    # 使用len函数计算字符串中字符的个数
    name = 'wangys' print(len(name))
    # 6

    2.5  循环遍历整个元素

    name = 'wangys'
    for i in name:
        print(i,end=' ')
    
    # w a n g y s 

    2.6 in操作

    info = 'I love you'
    print('love' in info)
    print('you' not in info)
    # True
    # False

    2.7 max min

    • 按照ASCII计算最大和最小值
    name = 'wangys'
    print(max(name))
    print(min(name))
    #y
    # a

    三:  字符串常用的操作

    3.1  center

    • 将字符串居中显示
    • 有两个参数,第一个参数是整个字符串的长度,第二个参数是填充字符串(长度为1)
    name = 'wangys'
    print(name.center(30,'*')) # 长度30,不够使用*填充
    # ************wangys************
    
    name = 'wangys'
    print(name.center(30,'*#')) # 填充字符必须是长度为1的字符
    # TypeError: The fill character must be exactly one character long
    
    name = 'wangys'
    print(name.center(30)) # 默认用空格填充
    #             wangys          

    3.2  strip

    • strip 默认删除两边的空白,空白包括空格,制表符,换行符等.
    • 插在中间的空格不会删掉,也可以制定删除的特殊符号,但还是哪个原则,插在中间的并不删除
    • lstrip 删除左边
    • rstrip 删除右边
    name = input('请输入你的名字:')
    if name == 'wangys':
        print('你好啊')
    name = input('请输入你的名字:').strip()
    if name == 'wangys':
        print('你好啊')
    name = ' #wan#gys*'
    print(name.strip(' #*'))
    name = ' wangys '
    print(name.lstrip())
    print(name.rstrip())

    3.3  startswith/endswith

    • 以什么为开头,以什么结尾
    name = 'wangys'
    print(name.startswith('wa'))
    print(name.startswith('ng',2,5))
    print(name.endswith('ys'))

    应用:判断请求,以哪个字符串开始,或者结尾

    name = 'wangys'
    if name.startswith('wa'):
        pass
    elif name.startswith('ll'):
        pass
    import os
    files = os.listdir('.')
    # 找出已py文件结尾的文件
    py_files = [file for file in files if file.endswith('.py')]
    print(py_files)
    # 找出以py或者以sh结尾的文件 多个条件过滤时使用元祖条件(必须是元祖)
    py_sh_files = [file for file in files if file.endswith(('.py', '.sh'))]
    print(py_sh_files)

    3.4 find

    • 找匹配得子字符串得索引
    • 如果找到就将找到得第一个符合匹配得子字符串索引返回,如果找不到就返回-1
    • 可以指定起始和结束位置进行查找
    s = 'hello world'
    print(s.find('world'))
    # 6
    
    # 找到了就不会再往后找了
    s = 'hello world'
    print(s.find('o'))
    # 4
    
    # 第二个参数表示从第7个字符开始查找
    s = 'hello world'
    print(s.find('o',6))
    # 7
    
    # 表示从7到10之间得字符查找
    s = 'hello world'
    print(s.find('o',7,10))
    # 7
    
    # 如果找不到就返回-1
    s = 'hello world'
    print(s.find('o',10,18))
    # -1
    # 用户输入大字符串,循环找出用户输入的字符串的位置
    s = input('请输入大的字符串:') while True: subString = input('请输入要查询的子字符串:') if subString.lower() == 'end': break elif subString: start = 0 end = len(s) while True: startPostion = input('请输入开始查找的位置:') if startPostion == '': startPostion = start elif startPostion.isdigit(): startPostion = int(startPostion) break else: print('请输入数字') continue while True: stopPostion = input('请输入结束查找的位置:') if stopPostion == '': stopPostion = end elif stopPostion.isdigit(): stopPostion = int(stopPostion) break else: print('请输入数字') continue index = s.find(subString,startPostion,stopPostion) if index == -1: print('没找到') else: print("'{}' 在 '{}'出现的位置是{}".format(subString,s,s.find(subString,startPostion,stopPostion))) else: print('请不要输入空字符串')

    3.5 index

    • 找出子字符串的索引位置
    • 如果找不到就报错
    name = 'wangys'
    print(name.index('a'))
    print(name.index('angy'))
    print(name.index('lala'))
    
    # 1
    # 1
    # ValueError: substring not found

     3.6   split 

    • 将字符串进行切割
    • 于join方法互为逆方法,将字符串生成列表类型
    • 默认以空格,制表符,换行符作为分隔符,也可以指定切割符
    path = '/usr/local/nginx'
    listPath = path.split('/')
    print(listPath)

    s = r'\'
    windowsPath = s.join(listPath)
    print('C:'+windowsPath)

    # ['', 'usr', 'local', 'nginx']

     # C:\usr\local\nginx

    3.7  capitalize

    • 首字母大写
    name = 'wangyongsheng'
    name = name.capitalize()
    print(name)
    # Wangyongsheng

    不论字符串里是否有大写字母,都会将首字母大写,其他的都是小写

    name = "WangYS"
    name = name.capitalize()
    print(name)
    # Wangys

     

    3.8   upper/lower

    • 全部大写
    name = 'wangys'
    name = name.upper()
    print(name)
    • 全部小写
    name = 'WangYongSheng'
    name = name.lower()
    print(name)

    应用:比如说验证码校验,对用户输入不区分大小写

    code_num = 'WangYs'
    input_num = input("请输入验证码,不区分大小写:")
    if code_num.lower() == input_num.lower():
        print("输入正确")
    else:
        print("请重新输入")

    3.9  swapcase

    name = 'WangYs'
    name = name.swapcase()
    print(name)

    3.10 title

    将以空格或者其他特殊字符或者数字隔开的字符串首字母大写

    name = 'wang yong sheng'
    name = name.title()
    print(name)
    
    name = 'wang*yong-sheng'
    name = name.title()
    print(name)

    3.11  replace

    • 字符串是不可变数据类型,所谓修改并不是在本身上做修改,而是生成了一个新的字符串。
    • 可以使用replace进行修改 
    msg = 'wangys wangys'
    print(msg.replace('wangys','wc'))
    print(msg.replace('wangys','wc',1))

     # wc wc
     # wc wangys

    3.12  count 

    1: 如果多个,就返回一个数

    2:如果没有,返回0

    3:可以切片后再进行计数

    msg = 'My name is wangys'
    print(msg.count('a'))
    print(msg.count('x'))
    print(msg.count('wangys'))
    print(msg.count('a',2,5))

    3.13   isdigit/isalnum/isalpha

    • isdigit  判断字符串只有数字组成
    • isalpha 判断字符串只有字母组成
    • isalnum 判断字符串是否有数字和字母组成
    msg = 'wangys123'
    print(msg.isalnum()) #字符串由字母或数字组成
    print(msg.isalpha()) #字符串只由字母组成
    print(msg.isdigit()) #字符串只由数字组成

    四 :字符串格式化

    4.1 %s %d 

    name = input("姓名:")
    age = int(input("年龄:"))
    height = int(input("身高:"))
    
    msg = '''
    -------- Info of %s ---------
    姓名:%s
    年龄:%d岁
    身高:%scm
    ''' % (name,name,age,height)
    
    print(msg)

    4.2  {} 按照位置

    name = input("姓名:")
    age = int(input("年龄:"))
    height = int(input("身高:"))
    
    msg = '''
    -------- Info of {} ---------
    姓名:{}
    年龄:{}岁
    身高:{}cm
    '''.format(name,name,age,height)
    
    print(msg)

    4.3 {} 按照指定位置

    name = input("姓名:")
    age = int(input("年龄:"))
    height = int(input("身高:"))

    msg = '''
    -------- Info of {1} ---------
    姓名:{1}
    年龄:{2}岁
    身高:{3}cm
    '''.format(name,name,age,height)

    print(msg)

    4.4 {} 按照关键字

    name = input("姓名:")
    age = int(input("年龄:"))
    height = int(input("身高:"))
    
    msg = '''
    -------- Info of {name} ---------
    姓名:{name}
    年龄:{age}岁
    身高:{height}cm
    '''.format(name=name,age=age,height=height)
    
    print(msg)

     

    五:其他操作

    1: 利用int或者float进行类型转换

    a = 1
    b = '2'
    print(a+b) # 字符串无法跟数字相加
    TypeError: unsupported operand type(s) for +: 'int' and 'str' # 报错
    
    a = 1
    b = '2'
    b = int(b)  # 可以通过int()函数将字符串数字转换为数字,然后进行运算
    print(a+b)
    # 3

    2: len函数

    • 去字符串字符的长度
    name='wangys'
    print(len(name))

    遍历字符串

    • 根据索引
    name='wangys'
    
    count = 0
    while count < len(name):
        print(name[count])
        count +=1
    • for 循环

    for 变量 in 可迭代对象

    name = 'wangys'
    for i in name:
        print(i)

    3 join 方法

    •  该方法用于连接序列中的方法

    • 跟split方法正好相反
    • join方法只能用于字符串类型,如果是其他数据类型,则会报错
    list = ['1','2','3']
    s = '+'
    ret = s.join(list)
    print(ret)
    # 1+2+3
    
    dir = ['','usr','local','nginx']
    linux_s = '/'
    linuxPath = linux_s.join(dir)
    windows_s=r'\'
    windowsPath = windows_s.join(dir)
    print(linuxPath)
    print('C:'+windowsPath)
    # /usr/local/nginx
    # C:\usr\local\nginx
    
    
    list = [1,2,3,4,5]
    s = '+'
    print(s.join(list))
    # TypeError: sequence item 0: expected str instance, int found
  • 相关阅读:
    Socket和ServerSocket学习笔记
    跨域资源共享的10种方式
    javascript执行环境(执行期上下文)详解
    js 自动插入分号
    原型对象prototype和原型属性[[Prototype]]
    构造自己的动画函数:animation,stop功能的实现
    sizzle源码分析 (4)sizzle 技术总结及值得我们学习的地方
    sizzle源码分析 (3)sizzle 不能快速匹配时 选择器流程
    sizzle源码分析 (2)ID 类 tag querySelectorAll 快速匹配
    sizzle源码分析 (1)sizzle架构
  • 原文地址:https://www.cnblogs.com/wc89/p/10333158.html
Copyright © 2020-2023  润新知