Python爬坑之基本数据类型

最近入了python的坑。因为本人是一名前端开发人员,所以本文就以一个前端的视角对比下JS和Python。本文是基于Python3进行说明
talk is cheap,show me the code.


先放一张图
Python基本数据结构.png

Python3 中有六个标准的数据类型:

  • Number 数字
  • Str 字符串
  • List 列表
  • Tuple 元组
  • Set 集合
  • Dict 字典

其中:

  • 不可变数据(3 个):Number(数字)String(字符串)Tuple(元组)
  • 可变数据(3 个):List(列表)Dictionary(字典)Set(集合)

Number 数字

数字有四种类型 分别是:
1.整型(int) 2.浮点型 (float) 3.布尔类型(bool) 4.复数(complex)

  • 整型和浮点型

    在python3中的整型只有一种 int, 浮点型也只有一种 float

其他语言的整数:(short) (int) (long);
其他语言的浮点数:单精度(float) 双精度(double)

>>> type(1)
<class 'int'>    # 整型
>>> type(1.0)
<class 'float'>   # 浮点型
>>> type(1+1.0)
<class 'float'>   # 浮点型
>>> type(-1)
<class 'int'>     # 整型
>>> type(-1.0)
<class 'float'>    # 浮点型
  • 布尔型
有些人可能会奇怪,尤其是前端。因为在js数值型布尔型是两个不同的类型。而在python布尔型则是属于数值型的。其实也不难理解,True就是1False就是0
python中的布尔值的首写字母一定是大写的
  >>> type(False)
  <class 'bool'>  # bool类型
  >>> type(True)
  <class 'bool'>   # bool类型
  >>> int(True)
  1              # 因为布尔类型是数字的子类型, 所以True可以转换为1
  >>> int(False)
  0
  >>> bool(0.5)   # 非0 非空的数值 都是bool真值
  True
  >>> bool(-1)
  True
  >>> bool(0)   # 数值0 都是bool假值
  False
  >>> bool('')   # 空str 都是bool假值
  False
  >>> bool([])   # 空列表 都是bool假值
  False
  >>> bool(())   # 空元祖 都是bool假值
  False
  >>> bool({})   # 空集合 都是bool假值
  False
  >>> bool(None)   # 类型NoneType 都是bool假值
  False
关于复数complex科学计算会用到,一般的运用很少。我这里只作了解。

使用小写字母 j 来表示复数

>>> 35j
  35j

Str 字符串

Python中的字符串和JS中的字符串除了操作方式之外几乎没有什么区别

字符串表示
  • 单双引号配合

     >>> "let's go baby!"   # 单双引号区分
     "let's go baby!"
     >>> 'let"s go baby~'
     'let"s go baby~'
     >>> 'let\'s go baby.'   # 转义(\)字符
     "let's go baby."
  • 三引号多行换行

        >>> '''
        python字符串换行 有点像markdown
        python字符串换行 有点像markdown
        python字符串换行 有点像markdown
        '''
        '\npython字符串换行 有点像markdown\npython字符串换行 有点像markdown\npython字符串换行 有点像markdown\n'
                        # 三引号自动换行
    
        >>> print('反斜杠n的作用\n是回车\n测试')    # 转义字符 \n
        反斜杠n的作用
        是回车
        测试
        >>>
  • 转义字符

    >>> print('hello \\n world')   # 通过双反斜杠\\ 来转义\n
      hello \n world
    
    >>> print(r'hello \n world')   # 通过前面加小写r 来来转义\n 加r之后变成原始字符串
      hello \n world
字符串运算
  >>> 'hello'+'world'  # 简单字符串拼接
  'helloworld'
  >>> 'hello'*3      # 字符串相乘 注意:Python的字符串是可以相乘的 JS中除了数值型的字符串相乘是相应的数值乘法外,其余得到的结果全是NaN
  'hellohellohello'
  >>> 'helloworld'[0]   # 通过下标获取字符串单个元素
  'h'
  >>> 'helloworld'[-1]  # 从字符串的末尾开始数
  'd'
字符串截取(切片)
  >>> 'helloworld'[0:5]  # 截取 从下标0开始向前数5位
    'hello'
  >>> 'helloworld'[0:-1]  # 截取 从下标0开始向后数1位
    'helloworl'
  >>> 'helloworld'[5:]  #  从向前数5个下标 自动截取到字符串的末尾
    'world'
  >>> 'helloworld'[-5:]  # 从向后数5个下标 自动截取到字符串的末尾
    'world'
  >>> 'helloworld'[:-5] # 从下标0开始 向后数5位
    'hello'
  >>> 'helloworld'[:5] # 从下标0开始 向前数5位
    'hello'

List 列表

基本可以理解为JS中的Array

>>> [1,2,3,4,5,6]  # 逗号分隔开
[1, 2, 3, 4, 5, 6]
>>> type([1,2,3,4,5,6])   # list类型
<class 'list'>
>>> [1,'str',2,True,3,4,False,5,6]  # 列表元素可以有多种类型
[1, 'str', 2, True, 3, 4, False, 5, 6]
>>>
列表的基本操作
  • 访问 截取

     >>> ['a', 'b', 'c', 'd'][1]   # 访问列表中的某个元素
     'b'
     >>> ['a', 'b', 'c', 'd'][0:2]   # 截取列表
     ['a', 'b']
     >>> ['a', 'b', 'c', 'd'][-1:]   # 反向截取列表
     ['d']
  • 列表的运算

      >>> ['a', 'b', 'c', 'd']+['e','f']   # 类似于JS中的 [].concat()
      ['a', 'b', 'c', 'd', 'e', 'f']
      >>> ['aaa'] * 2    # 列表的乘法  注意:JS中不支持数组的乘法哦
      ['aaa', 'aaa']
  • 判断列表中的元素是否存在

    >>> 3 in [1,2,3]   # 类似于JS中的arr.indexOf()
    True
    >>> 3 in [7,8,9]
    False
    >>> 3 not in [7,8,9]
    True

Tuple 元组

元组的定义和列表基本一致。但是主要有两个特点 1 元祖使用()小括号来表示 2 元祖不可变

>>> type((1,2,3))   # tuple元祖类型
<class 'tuple'>
>>> (1,2,3,4,5,6)   # 逗号隔开
(1, 2, 3, 4, 5, 6)
>>> (1,True,'str',2)   # 元素可以有多种类型
(1, True, 'str', 2)
>>> (1, 2, 3, 4, 5, 6)[0]   # 通过下标访问元素
1
>>> (1, 2, 3, 4, 5, 6)[0:3]   # 元祖截取
(1, 2, 3)
>>> (1,2,3)+(4,5,6)   # 元祖相加 和list操作一样 类似JSON数组操作[].concat
(1, 2, 3, 4, 5, 6)
>>> (1,2,3)*2   # 元组乘法 同列表
(1, 2, 3, 1, 2, 3)
>>>
  • 列表和元祖的区别
    tuple 不可变,所以代码更安全。如果可能,能用 tuple 代替 list 就尽量用 tuple

Set 集合

特点
  • 集合无序的 序列是有序的

       >>> {1,2,3,4,5,6}    # 用大括号来定义集合
       {1, 2, 3, 4, 5, 6}
       >>> type({1,2,3,4,5,6})   # 集合是 set类型
       <class 'set'>
       >>> {1,2,3,4,5,6}[0]   # 会报错 因为集合是无序的 所以无法通过下标来访问集合中的元素
  • 集合是不重复的 会自动过滤掉重复的元素

    >>> {1,1,1,2,2,2,5,6,6,7,8,7,7,7}   # 自动过滤重复元素
    {1, 2, 5, 6, 7, 8}
集合的运算
  • 差集 交集 并集

    >>> type(set())   # set()用来定义一个空的集合 如果直接用{}来定义空集合,那么此时它的类型不是set 而是dict
    <class 'set'>
    >>> len({1,2,3})   # len() 求集合的长度
    3
    >>> 1 in {1,2,3}   # 判断某个元素是否存在于集合中
    True
    >>> 1 not in {1,2,3}  # 判断某个元素是否不存在于集合中
    False
    >>> {1,2,3,4,5,6} - {3,4}  # 差集: 剔除两个集合中共有的元素
    {1, 2, 5, 6}
    >>> {1,2,3,4,5,6} & {3,4,7}   # 交集: 求两个集合中的共有的元素
    {3, 4}
    >>> {1,2,3,4,5,6} | {3,4,7}   # 并集: 求两个集合中所有的不重复的元素
    {1, 2, 3, 4, 5, 6, 7}

Dict 字典

特点
1. key/value 形式 (类似于 JS 中对象的key/value)
2. 字典的 key 不能重复
3. 字典的 key 必须是不可变的类型 `int str tuple`
字典的相关操作
>>> {1:1,2:2,3:3}   # key/value形式定义字典
{1: 1, 2: 2, 3: 3}
>>> type({1:1,2:2,3:3})  # dict类型
<class 'dict'>
>>> {(1,2,3):'元祖是不可变的',2:2,3:3}   # 元祖是可以作为key的 因为元祖具有不可变的特性
{(1, 2, 3): '元祖是不可变的', 2: 2, 3: 3}
>>> {'name':'tiger', 'age':'25'}['name']   # 字典通过key去访问vlue 和JS中的对象基本一致
'tiger'
>>> {'name':'tiger', 'age':'25', 'name':'pig'}   # 字典的key不能重复  key重复了虽然不会报错 但是后面的key会覆盖掉前面的key
{'age':'25', 'name':'pig'}

总结

此时,再回看一遍文章开头放的图 脑中对Python基本数据结构就比较清晰了:
Python基本数据结构.png

首先,我们把Python的基本数据结构分为两类: 数字数字类型又分为了整型 浮点型 布尔型复数型,这些概念刚才也讲过了,相对简单,就不多赘述。主要说下的概念:


  • 组类型又可以分为序列 集合字典

    • 序列

      • 特点: 序列是有序的,可以通过下标或者索引去访问其中的元素,比如说 列表 元祖字符串它们都是序列,都可以通过索引去访问其中的元素。但注意其中的字符串元祖是不可变的。
    • 集合

      • 特点: 集合是无序且元素是不能重复的,所以不能通过下标或者索引去访问其中的元素,当然也不能切片
    • 字典

      • 可以简单的将其理解为JS中的对象,可通过key去访问其value。其中key必须是不可变的,比如 数字 字符串 甚至元祖都可以作为字典的key,因为元祖同样具有不可变性。

Funky_Tiger
443 声望33 粉丝

刷题,交流,offer,内推,涨薪,相亲,前端资源共享...