python基础——重访类型分类

  • 对象根据分类来共享操作:例如,字符串、列表和元组都共享诸如合并、长度和索引等序列操作。
  • 只有可变对象(列表、字典和集合)可以原处修改;我们不能原处修改数字,字符串、元组。
  • 文件导出的方法,可变性并不真的适用于他们——当处理文件的时候,它们的状态可能会修改,但是,这与Python的核心类型可变性限制不完全相同。
  • “数字”包含了所有数字类型:整数、浮点数、复数、小数和分数。
  • 字符串包括str、以及bytes和Unicode;3.0+的bytearray字符串类型是可变的。
  • 集合类似于一个无值的字典的键,但是它们不能映射为值,并且没有顺序,因此,集合不是一个映射类型或一个序列类型,frozenset是集合的一个不可变的版本。
  • 除了类型分类操作,所有的类型都有可调用的方法,这些方法通常特定于他们的类型。

对象分类

对象类型 分类 是否可变
数字 数值
字符串 序列
列表 序列
字典 映射
元组 序列
文件 扩展 N/A
sets 集合
frozenset 集合
bytearray 序列

对象的灵活性

一般来说:

  • 列表、字典和元组可以包含任何种类的对象。
  • 裂变、字典和元组可以任意嵌套。
  • 列表和字典可以动态地扩大和缩小。

字典的值可以是列表,这一列表可能包含元组,而元组可能包含了字典。

如下为L = [‘abc’,[(1,2),([3],4)],5]嵌套的偏移值:

从语法上说,嵌套对象在内部被表示为对不同内存区域的引用(也就是指针),如下可知,不管是变量还是列表,都是引用内存中的值。

>>> a = 1
>>> b = 2
>>> c = 3
>>> d = 4
>>> e = 5
>>> L = ['abc',[(1,2),([3],4)],5] >>> id(1)
2008373520
>>> id(a)
2008373520
>>> id(L[1][0][0])
2008373520 >>> id(2)
2008373536
>>> id(b)
2008373536
>>> id(L[1][0][1])
2008373536 >>> id(3)
2008373552
>>> id(c)
2008373552
>>> id(L[1][1][0][0])
2008373552 >>> id(4)
2008373568
>>> id(L[1][1][1])
2008373568
>>> id(d)
2008373568 >>> id(5)
2008373584
>>> id(e)
2008373584
>>> id(L[2])
2008373584

拷贝需要注意的是:无条件值得分片以及字典copy方法只能做顶层赋值。也就是说,不能够赋值嵌套的数据结构(如果有的话)。如果需要一个深层嵌套的数据结构的完整的、完全独立的拷贝,那么就要使用标准的copy模块——包括import copy语句,并编辑 x = copy.deepcopy(y)对任意嵌套对象y做完整的复制。这一语句能够递归地遍历对象来复制他们所有的组成部分。然而这时相当罕见的情况(这也是为什么这么做比较费劲的原因所在)。

比较、相等性和真值

所有的Python对象也可以支持比较操作——测试相等性、相对大小等。Python的比较总是检查复合对象的所有部分,直到可以得出结果为止。事实上,当嵌套对象存在时,Python能够自动遍历数据结构,并从左到右递归应用比较,要多深就走多深。过程中首次发现的差值将决定比较的结果。

>>> L1 = [1,('a',3)]
>>> L2 = [1,('a',3)]
>>> L1 == L2,L1 is L2
(True, False)
>>> id(L1),id(L2)
(5788816, 7391072)
  • “==”操作符测试值得相等性。Python运行相等测试,递归比较所有内嵌对象。
  • “is”表达式测试对象的一致性。Python测试二者是否是同一个对象(也就是说同一内存地址中)。
>>> s1 = 'spam'
>>> s2 = 'spam'
>>> s1 == s2,s1 is s2
(True, True)
>>> id(s1),id(s2)
(5800128, 5800128)

由于字符串不可变的,对象缓存机制和程序代码无关——无论有多少变量与它们有关,字符串是无法在原处修改的。

一般来说,python中不同的类型的比较方法如下:

  • 数字通过相对大小进行比较
  • 字符串是按照ASCII字典顺序,一个字符接一个字符地对比进行比较(‘abc’<’ac’)
  • 列表和元组从左到右对每部分的内容进行比较。
  • 字典通过排序之后的(键、值)列表进行比较。字典的相对大小比较在3.0+不支持。
  • 数字混合类型比较(例如:1<’spam’)在python3.0+是错误的。

字典在3.0+的比较

>>> d1 = {'a':1,'b':2}
>>> d2 = {'a':1,'b':3}
>>> d1 == d2
False
>>> d1 < d2 #直接比较将会报错
TypeError: unorderable types: dict() < dict()
>>> list(d1.items())
[('b', 2), ('a', 1)]
>>> sorted(d1.items())
[('a', 1), ('b', 2)]
>>> sorted(d1.items()) < sorted(d2.items())
True
>>> sorted(d1.items()) > sorted(d2.items())
False >>> d3 = d1
>>> d3 == d1,d3 is d1
(True, True)
>>> d4 = d1.copy() #浅copy
>>> d4 == d1,d4 is d1
(True, False)

python中真和假的含义

在Python中,与大多数程序设计语言一样,整数0代表假,整数1代表真。除此之外,python也把任意的空数据结构视为假,把任何非空数据结构视为真。更一般地,真和假的概念是python中每个对象的固有属性,每个对象不是真就是假。

  • 数字如果非零,则为真。
  • 其他对象如果非空,则为真。
  • Python特殊对象None,总被认为是假。(同C语言的NULL指针类似)

对象真值的例子

对象
‘spam’ True
“” False
[] False
{} False
1 True
0.0 False
None False
>>> L = [None] * 100
>>> L
[None, None, None, None, None,...]

记住,None不是意味着“未定义”。也就是说None是某些内容,而不是没有内容——它是一个真正的对象,并且由一块内存,由python给定一个内置的名称。

bool类型

python的布尔类型bool只不过是扩展了Python中真、假的概念。

  • 当明确地用在真值测试时,True和False这些文字就变成了1和0,但他们使得程序员的意图更明确。
  • 交互模式下运行的布尔测试的结果打印成True和False的字样,而不是1和0,以使得程序的结果更明确。

像if这样逻辑语句中,没必要只用布尔类型。所有的对象本质上依然是真或假,即使使用其他类型,所有的布尔概念依然是可用的。python提供了一个内置函数bool,它可以用来测试一个对象的布尔值(它是否为True,也就是说非零或非空):

>>> bool(1)
True
>>> bool('spam')
True
>>> bool({})
False

Type对象

事实上,即使是类型本身在Python中也是对象类型。

严格地说,对内置函数type(x)能够返回对象x的类型对象。类型对象可以用if语句来进行手动类型比较。有关类型的名称:dict、list、str、tuple、int、float、complex、byte、type、set和file(在2.0+中file也是类型名称,是open的同义词,但在3.0+中并非如此)。

#测试类型
>>> type([1]) == type([])
True
>>> type([1]) == list
True
>>> isinstance([1],list)
True
>>> import types
>>> def f():pass
...
>>> type(f) == types.FunctionType
True

按类别组织的Python的主要内置对象类型,Python中所有的一切都是某种类型的对象,即便是某个对象的类型。任何对象的类型都是类型为“type”的对象。3.0+中,一个类实例的类型就是该实例产生自哪个类。

Python中的其他类型

赋值生成引用,而不是拷贝

>>> L = [1,2,3]
>>> M = ['x',L,'y']
>>> M
['x', [1, 2, 3], 'y']
>>> L[1] = 0
>>> M
['x', [1, 0, 3], 'y']
>>> M = ['x',L[:],'y'] #拷贝后
>>> M
['x', [1, 2, 3], 'y']
>>> L[1] = 0
>>> L
[1, 0, 3]
>>> M
['x', [1, 2, 3], 'y']

重复能够增加层次深度

序列重复就好像是多次将一个序列加到自己身上,多次重复实际上是多次引用。

>>> L = [4,5,6]
>>> X = L * 4
>>> Y = [L] * 4
>>> X
[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
>>> Y
[[4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 6]]
>>> L[1] = 0
>>> X
[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6]
>>> Y
[[4, 0, 6], [4, 0, 6], [4, 0, 6], [4, 0, 6]]

留意循环数据结构

如果遇到一个复合对象包含指向自身的引用,称之为循环对象。无论何时Python在对象中检测到循环,都会打印成[…]循环之处,而不会陷入无限循环

>>> L = ['grail']
>>> L.append(L)
>>> L
['grail', [...]]

python基础——重访类型分类的更多相关文章

  1. python基础--数值类型和序列类型

    Python中数值类型:int(整数),float(浮点数),True/False(布尔值,首字母必须大写) int:1    #任意整数 float:2.3   #小数 python赋值: a = ...

  2. python基础_类型_str

    #python不用考虑变量,可随时变换,自动分配内存,比如a = 'jjj'后a = 123是可以的 #str 文本 字符串 #常用函数 a = ' abcefg \n' a.strip() #去掉前 ...

  3. python基础===列表类型的所有方法

    链表类型有很多方法,这里是链表类型的所有方法: append(x) 把一个元素添加到链表的结尾,相当于a[len(a):] = [x] extend(L) 通过添加指定链表的所有元素来扩充链表,相当于 ...

  4. python基础---集合类型(Sets)

    集合类型(Sets) 集合对象是不同的(不可重复)hashable对象的无序集合.常见用法包括:成员关系测试.移除序列中的重复.以及科学计算,例如交集.并集.差分和对称差分.通俗点来说,集合是一个无序 ...

  5. python的标准类型分类

    数据属性 储存模型 更新模型 访问模型 数字 标量/原子类型 不可变类型 直接存取 字符串 标量/原子类型 不可变类型 顺序 列表 容器  可变类型 顺序  元组 容器 不可变类型 顺序 字典 容器 ...

  6. python基础-数字类型及内置方法

    --数字类型及内置方法 整型-int 用途:多用于年龄.电话.QQ号等变量 定义方法 age = 18 # age = int(18) 常用方式:多用于数学计算 # int(x)将x转换成整数,是向下 ...

  7. python基础:各种类型的转换

    1.str转dict #借助eval,dict str="{"data":"123","result":"ok" ...

  8. python基础_类型_tuple

    #tuple 元祖,这个没什么特别的,和list差不多,不能删除,不能增加元素,其他功能差不多 #元祖用圆括号扩起来,逗号分隔 a = ('a','b','c') #这玩意一般会用来排除重复,还是很好 ...

  9. python基础_类型_dict

    #dict字典,其实与其叫字典不如叫key-value更合适,不知道这个名是怎么来的,这个可以用来搞用户名和密码,不过搞这个不用数据库是不是显得太low了 #用花括号{}扩起来,逗号分隔每个元素,每个 ...

随机推荐

  1. 【甘道夫】NN HA 对于 Client 透明的实验

    之前转载过一篇[伊利丹]写的NN HA实验记录.该博客描写叙述了主备NN透明切换的过程,也就是说,当主NN挂掉后,自己主动将备NN切换为主NN了,Hadoop集群正常执行. 今天我继续做了一个实验.目 ...

  2. 【UVA1309】Sudoku(DLX)

    点此看题面 大致题意: 让你填完整一个\(16*16\)的数独. 解题思路 我们知道,数独问题显然可以用\(DLX\)解决. 考虑对于一个数独,它要满足的要求为:每个位置都必须有数,每一行都必须有全部 ...

  3. position中需要注意的地方

    relative是相对元素本身位置进行移位,但不会改变本身位置的大小 本身的位置 移位后,可以看到,p5的位置还是在那,并不会自动往上走,也就是p2的位置原来所占据的位置不变的.不会因为偏移而改变布局 ...

  4. UVA11294 Wedding

    嘟嘟嘟 大佬们都说这是2-SAT入门题,然而对于刚学2_SAT的本菜鸡来说半天才理解…… 题面:新娘和新郎不能坐在同一侧,妻子和丈夫不能坐在同一侧,有**关系的两个人必须至少一个坐在新娘一侧,问方案. ...

  5. 学习换脸:Switching Eds: Face swapping with Python, dlib, and OpenCV

    学习GitHub上比较火换脸博客,原英文版:https://matthewearl.github.io/2015/07/28/switching-eds-with-python/ 系统win10,x6 ...

  6. mybatis学习记录五——动态sql

    8       动态sql 8.1     什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 8.2     需求 用户信息综合查询列表 ...

  7. WebNotes(PHP、css、JavaScript等)

    1. 数据库编码格式 gb-2312仅支持简体中文,GBK支持简体.繁体中文,utf-8通用程度最高. 2. HTTP请求方法 get方法请求时,会将传输的数据跟在链接后“显式地”发送,受限于链接长度 ...

  8. 【洛谷P2921】[USACO08DEC]在农场万圣节

    在农场万圣节Trick or Treat on the Farm 题目链接 题解:首先,将原图缩点,变为DAG, 然后在DAG上记忆化搜索即可 #include<iostream> #in ...

  9. sqlServer2014安装说明(windows7 64位)

    SqlServer2014安装说明(windows7 64位) 地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=42299 1, ...

  10. CF605A Sorting Railway Cars(递推)

    题目描述 An infinitely long railway has a train consisting of n cars, numbered from 1 to n (the numbers ...