第四章 数据类型 --- 字符串、字节


一、 字符串(str)

定义:由一组字符组成的不可变序列

    变量名 = 字符串

        --- Python3中字符串默认以Unicode形式存储。

          >>>  Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码;

          >>>  Python3的 默认编码 为UTF-8,可以识别中文字符。

>>> # Python2
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
 
>>> # Python3
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

1. 字符串的创建

(1) 单引号
(2) 双引号
(3) 三引号
    # 单引号和双引号交替使用可以用来使用输出对方。
    ''' 代表按格式输出(包含换行),该格式不是注释,但是常用来当注释使用;


2. 序列的转义

(1) 对于单引号、双引号和反斜杠的转义,表示只是为了输出

(2) \n, \t, 


3. 字符串的操作(都是新建)

(1) 运算符

    +(合并拼接)    *(重复拼接)    in(判断子串)     is(对象)     ==(内容)     

    > (从左往右,逐位判断ASCII码大小)

(2) 索引
    格式: 字符串[index]
                其中,index>0,代表从左往右,始于0
                           index<0,代表从右往左,始于-1
        > len() 返回对象元素长度
        > index 取值范围 (-len, len-1),超出范围报错
        > 字符串是不可变类型,元素无法修改
(3) 切片(获得一个区域中的多个元素)
格式: 字符串[start=0: end=len: step=1]
        start --- 起始位置(包含该位置,<0代表从右往左)
        start --- 结束位置(不包含该位置)
        step  --- 步长(非零整数,<0代表从右往左,>1代表间隔取)


#用法:
>>> s = 'abcdefghijk'
>>> s[:]	   # 整切片,不可变类型不新建,直接指向该字符串;
                   #         可变类型,新建浅拷贝对象
>>> s[0: 4]
>>> s[0: 4:-1] # step为负数,start要大于end



4. 字符串的相关方法

(1) count(sep, start, end)
            > 计数,返回sep在字符串中出现的次数
            > start, end可以省略
(2) index(sep, start, end)
         - 查找sep是否在字符串中,默认返回从左往右第一次出现的的位置
            > 如果sep也是一个字符串,那么返回子串重合位置的第一个字符位置
            > end可以省略
            > 找不到 报错
(3) find 
        - 功能同index,如果找不到返回-1。
            >  rfind,rindex 代表从右侧开始找,返回从左往右的序列号。
(4) format
        - 格式化输出
(5) join
        - 格式: str.join(iterable)
使用当前 str对可迭代对象进行填充,返回 字符串
用途: 常用来把其他可迭代对象转成字符串

print(''.join([1,2,3,4])) --- '1234'

>>> a = ['2','e','3e3']
>>> ''.join(a)
'2e3e3'
(6) replace(old, new, count(最大替换次数))
        # 注意,replace是 新创建字符串
(7) strip(chars)
         - 去掉两端的字符,
            > 默认去掉两端的空格
            > 如果有传入参数,那么逐一比较chars中的元素,从 字符串两端逐一比对去除
            > lstrip rstrip 代表从两端去除,不去空格
(8) split(sep, count)
            > 如果不传入参数,按照 空格切割,并且 去掉所有无用空格
            > 如果传入参数空格' ',那么不会去除多余中间空格和首尾空格

            > sep位于首尾,会多出''

>>> a = ' asd 32e  23e 9'
>>> a.split()                        # 不传入参数,按照空格切割,去掉多余空字符串
['asd', '32e', '23e', '9']
>>> a.split(' ')                     # 传入参数' ',按照空格切割,空格转成空在字符串,不去掉多余空字符串
['', 'asd', '32e', '', '23e', '9']
>>> a.split('9')                     # split点位于边界,会多切出空字符串''
[' asd 32e  23e ', '']
>>> a.split('gggg')                  # 如果不所在sep,那么实际上是把字符串转化成了列表
[' asd 32e  23e 9']
(9) startwith(profix, start, end)
     -  判断是否以profix开头,返回布尔类型
        profix 开头位置
        start 起始位置
        end 结束位置
(10)endswith(profix, start, end)
    - 判断是否以指定字符结尾
(11)upper() \ lower()
    - 转换成大写或者小写
(12)capitalize()
    - 首字母大写,空格不会断开
(13)partition(sep)
    -返回元组,包含三个元素,(sep前内容, sep, sep后内容)
        > 如果不存在该元素,返回 ('原串',  '',  '')
(14)isalpha()
    - 判断字符
(15)isdigit()
    - 判断数字 - 所有数字
(16)isdecimal()

    - isdigital, isdecimal, isnumerical区别见我的另一篇博客:

(17)isidentifier()

    - 判断是否合法标识符( 不包括关键字,关键字也会认为合法)
(18)islower(), isupper(), isspace()
    - 判断全部大写、小写、空格
(19)center(width, fillchr)
        > fillchr 必须是单个字符

        > 向两端填充,奇数右填,偶数左填

>>> for i in range(1,11):
...     print((i*'* ').center(30, ' '))
... 
              *               
             * *              
            * * *             
           * * * *            
          * * * * *           
         * * * * * *          
        * * * * * * *         
       * * * * * * * *        
      * * * * * * * * *       
     * * * * * * * * * *  
>>> for i in range(1,21,2):
...     print((i*'*').center(20, ' '))
... 
         *          
        ***         
       *****        
      *******       
     *********      
    ***********     
   *************    
  ***************   
 *****************  
******************* 


  • 一个map方法处理字符串的方法:
# 输入一个正整数,输出该数值的百位,十位与个位。考虑再多一位呢?
def que4():
    def split_num1(n):
        long = len(str(n))
        num_list = []
        # 也可以把n先reverse,range从小到大取值
        for i in range(long-1, -1, -1):
            num_list.append(n // (10**(i)))
            n %= 10 ** (i)
        return num_list

    def split_num3(n):
        num_list = []
        for i in reversed(range(len(str(n)))):
            num_list.append(n // 10**i % 10)
        return  num_list

    def split_num2(n):
        # map(fun, liter),返回新的liter
        li = list(map(int, str(n)))
        return li

    number = int(input('请输入一个整数:'))
    nst = int(input('你想知道这个数的第几位:'))
    print('使用map方法:\n{}'.format(split_num1(number)))
    print('{}的第{}位数是:{}'.format(number, nst, split_num1(number)[::-1][nst-1]), end='\n------------------------\n')
    print('使用//%方法1:\n{}'.format(split_num2(number)))
    print('{}的第{}位数是:{}'.format(number, nst, split_num2(number)[::-1][nst-1]), end='\n------------------------\n')
    print('使用//%方法2:\n{}'.format(split_num3(number)))
    print('{}的第{}位数是:{}'.format(number, nst, split_num3(number)[::-1][nst - 1]))
que()

运行结果:

请输入一个整数:43256456357
你想知道这个数的第几位:4
使用map方法:
[4, 3, 2, 5, 6, 4, 5, 6, 3, 5, 7]
43256456357的第4位数是:6
------------------------
使用//%方法1:
[4, 3, 2, 5, 6, 4, 5, 6, 3, 5, 7]
43256456357的第4位数是:6
------------------------
使用//%方法2:
[4, 3, 2, 5, 6, 4, 5, 6, 3, 5, 7]
43256456357的第4位数是:6


二、字节(Bytes)

      ---  > 由一些 单字符组成的序列,其中;
            > 每个字符都由A SCII码的形式存储,占据 8个数据位,共有[0-255]共256个,包含数字、英文和一些符号
            > 是不可变类·

1. 字节的创建

        --- 在类似字符串,在前面加一个,如:b'3ds' ;
            > 需要注意字节内容必须是ASCII码所包含的内容,否则报错

2. 字节的操作

        --- 同字符串
        (1) 运算符 

                +(合并拼接)  *(重复拼接)  n(判断子串)  is(对象)  ==(内容)   

                > (从左往右,逐位判断ASCII码大小)

        (2) 索引
                --- 需要注意,访问字节元素,如索引和遍历,得到的是 ASCII码
        (3) 切片
        (4) 遍历

	>>> a = b'8hy87h'
	# 索引,返回ASCII码
	>>> a[1]
	104
	>>> ord('h')
	104
	# 切片
	>>> a[2:4]
	b'y8'
	# 遍历,返回ASCII码
	>>> for i in a:
	...     print(i, end = '\t')
	... 
	56	104	121	56	55	104	>>> 

3. 字节的方法

--- 同字符串

猜你喜欢

转载自blog.csdn.net/u010359398/article/details/81009555