目录
1 range
序列
range是不可变的序列,元素为int类型,通常和for循环结合起来使用
格式 :range(起始值=0,终止值,步长=1)
,表示以指定的步长从起始值取到终止值-1,取值为左闭右开规则
如果只传一个值,则表示终止值:range(3)
如果传两个值,则表示,起始和终止值:range(1,3)
如果传三个值,则表示起始,终止值和步长:range(1,10,2)
举例:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">range</span>(<span style="color:#116644">5</span>):
<span style="color:#3300aa">print</span>(<span style="color:#000000">i</span>) <span style="color:#aa5500"># i从0取到4</span>
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">range</span>(<span style="color:#116644">1</span>,<span style="color:#116644">5</span>):
<span style="color:#3300aa">print</span>(<span style="color:#000000">i</span>) <span style="color:#aa5500"># i从1取到4</span>
<span style="color:#770088">for</span> <span style="color:#000000">i</span> <span style="color:#770088">in</span> <span style="color:#3300aa">range</span>(<span style="color:#116644">1</span>,<span style="color:#116644">5</span>,<span style="color:#116644">2</span>):
<span style="color:#3300aa">print</span>(<span style="color:#000000">i</span>) <span style="color:#aa5500"># i取1,3</span></span></span>
可以使用list()传入一个range序列,来生成一个整数列表。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># 生成一个列表,列表中的元素是0到10的整数</span>
<span style="color:#000000">list1</span>=<span style="color:#3300aa">list</span>(<span style="color:#3300aa">range</span>(<span style="color:#116644">11</span>))
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>)</span></span>
2 布尔型bool
布尔型
bool
:布尔型只有两个结果即True和False,分别表示真和假,一般用在条件判断中。在Python中,布尔型跟数值型参与运算时,True相当于1,False相当于0。
可以用实例化
bool
类的对象把一个对象转成布尔值,在Python中,空字符串、空列表、空元组、空字典、空集合都被当做是False;非空即True。<span style="background-color:#f8f8f8"><span style="color:#000000">a</span>=<span style="color:#770088">True</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>(<span style="color:#000000">a</span>)) <span style="color:#3300aa">print</span>(<span style="color:#000000">a</span><span style="color:#981a1a">+</span><span style="color:#116644">5</span>) <span style="color:#3300aa">print</span>(<span style="color:#770088">False</span><span style="color:#981a1a">*</span><span style="color:#116644">100</span>) <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#116644">111</span>)) <span style="color:#aa5500">#True</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#aa1111">"fff"</span>)) <span style="color:#aa5500">#True</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>([<span style="color:#116644">1</span>,<span style="color:#116644">2</span>,<span style="color:#116644">4</span>])) <span style="color:#aa5500">#True</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#116644">3</span>,)) <span style="color:#aa5500">#True</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>({<span style="color:#aa1111">"A"</span>:<span style="color:#116644">1</span>})) <span style="color:#aa5500">#True</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>({<span style="color:#116644">3</span>,<span style="color:#aa1111">'a'</span>})) <span style="color:#aa5500">#True</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#aa1111">""</span>)) <span style="color:#aa5500">#False</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>([])) <span style="color:#aa5500">#False</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(())) <span style="color:#aa5500">#False</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>({})) <span style="color:#aa5500">#False</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">bool</span>(<span style="color:#3300aa">set</span>())) <span style="color:#aa5500">#False</span> <span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>({})) <span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>(<span style="color:#3300aa">set</span>()))</span>
3 特殊类型-NoneType
None是python中的一个特殊的常量,表示一个空的对象,在函数没有返回值的时候,输出函数的执行结果得到的就是None。None对应的数据类型是 NoneType。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">print</span>(<span style="color:#3300aa">type</span>(<span style="color:#770088">None</span>))
<span style="color:#000000">list1</span>=[<span style="color:#aa1111">"nihao"</span>,<span style="color:#116644">2</span>,<span style="color:#116644">3</span>]
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>.<span style="color:#000000">remove</span>(<span style="color:#116644">2</span>)) <span style="color:#aa5500">#删除函数,这个只是删除数据没有返回数据,所以打印的是None</span></span></span>
关于None的几点说明:
数据为空不代表空对象,例如空字符串、空列表等都不是None;
None不支持任何运算也没有任何内建方法;
None与其他任何数据类型比较都返回False;
None有自己的数据类型NoneType,不能创建其他NoneType对象(它只有一个值None);
null为
java
里的空,和Python中的None类似;在后面使用 的JSON数据中,使用 null表示值为空,转成Python对象 ,对应的就是None;
可以将None赋值给任何变量,也可以给None值变量赋值。
举例:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># None没有长度,所以报TypeError: object of type 'NoneType' has no len()</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">len</span>(<span style="color:#770088">None</span>))
<span style="color:#aa5500"># 空字符串的长度为0</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">len</span>(<span style="color:#aa1111">""</span>))
<span style="color:#770088">if</span> <span style="color:#116644">0</span> <span style="color:#770088">and</span> <span style="color:#770088">None</span>:
<span style="color:#3300aa">print</span>(<span style="color:#116644">1</span>)
<span style="color:#770088">else</span>:
<span style="color:#3300aa">print</span>(<span style="color:#116644">2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#aa1111">""</span> == <span style="color:#770088">None</span>)</span></span>
4 数据类型总结
4.1 容器数据类型
Python中,可包含其他对象的对象,称之为“容器”。前面讲的数据类型中,如下对象属于容器类型:
字符串str
列表list
元组tuple
集合set
字典dict
int,float,bool为非容器类型。
4.2 可变和不可变类型
所谓可变对象,是指对象的内容是可变的,比如修改对象的内存时对象的内存地址不改变,例如 list。而不可变的对象则相反,当改变它的内容时对象的内存地址也会改变。一句话总结:可变就是值变地址不变。
可变数据类型:List(列表)、Dictionary(字典)、Set(集合)
不可变数据类型:Number(数字)、String(字符串)、Tuple(元组)
举例:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">num1</span>=<span style="color:#116644">100</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">num1</span>))
<span style="color:#000000">num1</span>=<span style="color:#116644">101</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">num1</span>))
<span style="color:#000000">list1</span>=[<span style="color:#116644">1</span>,<span style="color:#116644">2</span>]
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>))
<span style="color:#000000">list1</span>.<span style="color:#000000">append</span>(<span style="color:#116644">3</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>)
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>))</span></span>
4.3 可迭代和不可迭代的类型
可迭代即可以重复的取出数据,存在
__iter__()
方法的,就是可迭代的对象可迭代:List(列表)、Dictionary(字典)、Set(集合)、String(字符串)、Tuple(元组)
不可迭代:Number(数字)、
bool
(布尔类型)
举例:
<span style="background-color:#f8f8f8"><span style="color:#aa5500">#数据类型,后面能有__iter__()方法,就是可迭代的</span> [].<span style="color:#000000">__iter__</span>() <span style="color:#aa1111">""</span>.<span style="color:#000000">__iter__</span>() {<span style="color:#116644">2</span>,<span style="color:#116644">1</span>}.<span style="color:#000000">__iter__</span>() {<span style="color:#aa1111">"name"</span>:<span style="color:#aa1111">"小明"</span>,<span style="color:#aa1111">"age"</span>:<span style="color:#116644">18</span>}.<span style="color:#000000">__iter__</span>()</span>
4.4 有序的和无序的类型(针对容器类型来讲的)
有序:List(列表)、String(字符串)、Tuple(元组)、Dict(字典)
无序:Set(集合)
字典在3.6之前的版本是无序的,从3.6版本开始,字典是有序的,字典的顺序就是元素存入的顺序。
4.5 值类型和引用类型
Python数据类型分为值类型和引用类型, 下面我们看下它们的区别:
值类型:int、float、str、tuple,本身不允许被修改
引用类型:list、set、dict,本身允许被修改
4.5.1 值类型
值类型本身不允许被修改,也就是不可变,数值的修改实际上是让变量指向了一个新的对象,所以不会产生共享内存的问题。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">number1</span> = <span style="color:#116644">11</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">number1</span>))
<span style="color:#000000">number1</span>=<span style="color:#116644">12</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">number1</span>))
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">140709030057064</span> <span style="color:#116644">140709030057096</span></span></span>
以上的例子说明,当number1的值为11时,指向的是内存地址140709030057064,当修改了number1的值后,指向的是另外一个内存地址140709030057096。修改值类型的值,只是让它指向一个新的内存地址,并不会改变变量的值。
对驻留机制的理解?
来看下面一个例子:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"># int类型的驻留</span>
<span style="color:#000000">number1</span> = <span style="color:#116644">11</span>
<span style="color:#000000">number2</span> = <span style="color:#000000">number1</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">number1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">number2</span>))
<span style="color:#aa5500"># str类型的驻留</span>
<span style="color:#000000">str1</span> = <span style="color:#aa1111">"helloworld"</span>
<span style="color:#000000">str2</span> = <span style="color:#aa1111">"helloworld"</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">str1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">str2</span>))
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">140724772394088</span> <span style="color:#116644">140724772394088</span>
<span style="color:#116644">1303019672240</span> <span style="color:#116644">1303019672240</span></span></span>
Python的暂存区:
Python在底层做了一定的优化,对于使用过小整数以及短字符串都会被缓存起来。
之所以采用这种优化的方式,是因为python中数字和字符串一经创建都是不可修改的。所以不会出现,因使用了缓存的对象值造成“脏读”的问题。
上述中多个具有相同值的变量共享了内存地址,这是Cpython里面一个优化策略,叫驻留(interning)。CPython 还会在小的整数上使用这个优化措施,防止重复的创建”热门“数字,比如0,-1,42等等,但是CPython不会驻留所有的字符串和整数。
事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了。同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。
总的来说,只有数值型和字符串型,并且在通用对象池中的情况下,a is b才为True,否则当a和b是int,str,tuple,list,dict或set型时,a is b均为False。
4.5.2 引用类型
引用类型本身是运行被修改的,也就是可变的,允许同一对象的值发生变化,但地址不变。但是需要注意一点,对可变数据类型的操作不能是直接进行新的赋值操作,比如说a = [1, 2, 3, 4, 5, 6, 7],这样的操作就不是改变值了,而是新建了一个新的对象,这里的可变只是对于类似于append、+=等这种操作。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">list1</span> = [<span style="color:#116644">1</span>]
<span style="color:#000000">list2</span> = <span style="color:#000000">list1</span>
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
<span style="color:#000000">list1</span>.<span style="color:#000000">append</span>(<span style="color:#116644">2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>, <span style="color:#000000">list2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">2815182132416</span> <span style="color:#116644">2815182132416</span>
[<span style="color:#116644">1</span>, <span style="color:#116644">2</span>] [<span style="color:#116644">1</span>, <span style="color:#116644">2</span>]
<span style="color:#116644">2815182132416</span> <span style="color:#116644">2815182132416</span></span></span>
思考:在这个例子中,如果既要实现list2复制list1的值,又要在list1的值发生改变后不影响list2,怎么实现呢?
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">list1</span> = [<span style="color:#116644">1</span>]
<span style="color:#000000">list2</span> = <span style="color:#000000">list1</span>.<span style="color:#000000">copy</span>()
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
<span style="color:#000000">list1</span>.<span style="color:#000000">append</span>(<span style="color:#116644">2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#000000">list1</span>, <span style="color:#000000">list2</span>)
<span style="color:#3300aa">print</span>(<span style="color:#3300aa">id</span>(<span style="color:#000000">list1</span>), <span style="color:#3300aa">id</span>(<span style="color:#000000">list2</span>))
<span style="color:#aa5500"># 输出结果</span>
<span style="color:#116644">1303022457536</span> <span style="color:#116644">1303022457408</span>
[<span style="color:#116644">1</span>, <span style="color:#116644">2</span>] [<span style="color:#116644">1</span>]
<span style="color:#116644">1303022457536</span> <span style="color:#116644">1303022457408</span></span></span>
赋值(=)和复制的区别:
赋值(=)相当于把list1的地址赋值给list2,list1和list2指向同一个列表
复制(copy方法)相当于把list1完全复制一遍放在一个新的内存地址中,你可以对复制后的东西任意操作而不会影响原对象