美文网首页
04--Python 数据类型

04--Python 数据类型

作者: Roger田翔 | 来源:发表于2018-03-25 16:54 被阅读0次
@Author : Roger TX (425144880@qq.com)
@Link : https://github.com/paotong999

一、数字

Python中数字有四种类型:整数、布尔型、浮点数和复数。

  • int (整数):如 1,只有一种整数类型 int,表示为长整型。
  • bool (布尔):布尔值只有True、False两种值,布尔值可以用and、or和not运算。
  • float (浮点数):如 1.23、3E-2
  • complex (复数):如 1 + 2j、 1.1 + 2.2j

二、字符串

  • Python中单引号和双引号使用完全相同。
  • 使用三引号('''""")可以指定一个多行字符串。
  • 转义符 '\'
  • 反斜杠可以用来转义,使用r可以让反斜杠不发生转义。。 如 r"this is a line with \n" 则\n会显示,并不是换行。
  • 字符串可以用 + 运算符连接在一起,用 * 运算符重复。
  • Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
  • Python中的字符串不能改变。

Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:

>>>ord('A')
65
>>>ord('中')
20013
>>>chr(66)
'B'
>>>chr(25991)
'文'

Python 支持格式化字符串的输出 。

1、最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

#!/usr/bin/env python
 
print ("我叫 %s 今年 %d 岁!" % ('小明', 10))

2、还有一种用法是格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % ,format 函数可以接受不限个参数,位置可以不按顺序。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
 
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
 
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
 
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list))  # "0" 是必须的

也可以向 str.format() 传入对象:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class AssignValue(object):
    def __init__(self, value):
        self.value = value
my_value = AssignValue(6)
print('value 为: {0.value}'.format(my_value))  # "0" 是可选的

3、数字格式化

  • ^<> 分别是居中、左对齐、右对齐,后面带宽度
  • : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充
  • + 表示在正数前显示 +,负数前显示 -

下表展示了 str.format() 格式化数字的多种方法:

数字 格式 输出 描述
3.1415926 {:.2f} 3.14 保留小数点后两位
3.1415926 {:+.2f} +3.14 带符号保留小数点后两位
5 {:0>2d} 05 数字补零 (填充左边, 宽度为2)
5 {:x<4d} 5xxx 数字补x (填充右边, 宽度为4)
13 {:^10d} 13 中间对齐 (宽度为10)
13 {:10d} 13 右对齐 (默认, 宽度为10)
13 {:<10d} 13 左对齐 (宽度为10)
1000000 {:,} 1,000,000 以逗号分隔的数字格式
0.25 {:.2%} 25.00% 百分比格式
100000000 {:.2e} 1.00e+08 指数记法

空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

三、列表

列表是Python中最基本的数据结构。
列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。

list1 = ['Google', 'Runoob', 1997, 2000];
list2 = [1, 'str', 3, {'key':'value'}, [1, 2, 3] ];

访问列表中的值

使用下标索引来访问列表中的值,同样你也可以使用方括号的形式截取字符

print ("list1[0]: ", list1[0])
print ("list2[1:4]: ", list2[1:4])

list1[0]: Google
list2[1:5]: ['str', 3, {'key':'value'}]

更新列表

你可以对列表的数据项进行修改或更新,你也可以使用append()方法来添加列表项

list = ['Google', 'Runoob', 1997, 2000];
list[2] = 123
list.append('Baidu')
print ("更新后的列表 : ",  list)

更新后的列表 : ['Google', 'Runoob', 123, 2000, 'Baidu']

删除列表元素

list = ['Google', 'Runoob', 1997, 2000]
del list[2]
print ("删除第三个元素 : ", list)

删除第三个元素 : ['Google', 'Runoob', 2000]

Python列表脚本操作符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

四、元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号,列表使用方括号。

单元素元组

>>> tup1 = (50)
>>> type(tup1)     # 不加逗号,类型为整型
<class 'int'>

>>> tup1 = (50,)
>>> type(tup1)     # 加上逗号,类型为元组
<class 'tuple'>

访问元组

同列表一样,使用下标索引来访问列表中的值

tup = (1, 2, 3, 4, 5, 6, 7 )
print ("tup[1:5]: ", tup[1:5])

tup[1:5]: (2, 3, 4, 5)

更新元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,形成一个新的新的元组

删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组

五、字典

字典是一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

键必须是唯一的,但值则不必,一个简单的字典实例:

dict = {'Name': 'Runoob', 'Age': 7, 'Name': '小菜鸟'}
print ("dict['Name']: ", dict['Name'])

dict['Name']: 小菜鸟

访问字典里的值

把相应的键放入熟悉的方括弧,如下实例:

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}

print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])

dict['Name']: Runoob
dict['Age']: 7

修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对,如下实例:

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}

dict['Age'] = 8;               # 更新 Age
dict['School'] = "菜鸟教程"  # 添加信息

print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])

dict['Age']: 8
dict['School']: 菜鸟教程

删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。删除一个字典用del命令,如下实例:

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}

del dict['Name'] # 删除键 'Name'
dict.clear()     # 清空字典
del dict         # 删除字典

六、集合

集合被称为set,与dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
  • 传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,set本身是无序的。
  • set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象。

通过add(key)方法可以添加元素到set中,通过remove(key)方法可以删除set中的元素。

七、数据类型与拷贝

1、Python的可变类型与不可变类型

之前在数据类型文章中有写过可变类型与不可变类型,这里我们再讨论一下,便于我们理解拷贝。

Python的主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的。
对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象
如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收

(1) 不可变类型,如 int 类型,对浮点类型的值进行修改后,指向新的内存地址
i += 1 并不是真的在原有的 int 对象上+1,而是重新创建一个 value 为6的 int 对象,i引用自这个新的对象。通过id函数查看变量i的内存地址进行验证(使用 hex(id(i)) 可以查看16进制的内存地址)。

>>> i = 5
>>> id(i)
140243713967984
>>> i += 1
>>> id(i)
140243713967960

可以看到执行 i += 1 时,内存地址都会变化,因为int 类型是不可变的。

(2) 多个 int 类型的变量值相同时,它们内存地址也是相同的。

>>> i = 5
>>> j = 5
>>> id(i)
140656970352216
>>> id(j)
140656970352216
>>> k = 5
>>> id(k)
140656970352216
>>> x = 6
>>> id(x)
140656970352192
>>> y = 6
>>> id(y)
140656970352192

对于不可变类型int,无论创建多少个不可变类型,只要值相同,都指向同个内存地址。
同样情况的还有比较短的字符串。

(3) 多个浮点型的变量值相同时,它们并不是指向同个内存地址,这点和 int 类型不同。

>>> i = 2.5
>>> id(i)
140564351733040
>>> j = 2.5
>>> id(j)
140564351733016

(4) 可变类型的话,如 list 类型,在 append 之后,还是指向同个内存地址。

>>> a = [1, 2, 3]
>>> id(a)
4385327224
>>> a.append(4)
>>> id(a)
4385327224

(5) 当多个不可变类型的变量值相同时,它们并不是指向同个内存地址。

>>> a = [1, 2, 3]
>>> id(a)
4435060856
>>> b = [1, 2, 3]
>>> id(b)
4435102392
  • 我们可以通过 b = a 的赋值语句,让他们指向同个内存地址
  • 这个时候需要注意,因为a、b指向同个内存地址,而a、b的类型都是 List 可变类型,对a、b任意一个List进行修改,都会影响另外一个 List 的值。

2、Python的深拷贝与浅拷贝

Python中对象的赋值实际上是对象的引用。

当创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用。

(1) 赋值:数据完全共享
= 赋值是在内存中指向同一个对象
如果是可变(mutable)类型,比如列表,修改其中一个,另一个必定改变
如果是不可变(immutable)类型,比如字符串,修改了其中一个,另一个并不会变

(2) 浅拷贝:数据半共享
copy.copy() 浅拷贝没有拷贝子对象,所以原始数据改变,子对象会改变

(3) 深拷贝:数据完全不共享
copy.deepcopy() 深拷贝包含对象的拷贝,所有原始对象的改变不会造成深拷贝里任何子元素的改变

import os,sys,math,copy

alist=[1,2,3,["a","b"]]

b=alist
c=copy.copy(alist)
d=copy.deepcopy(alist)

print (b)    #[1, 2, 3, ['a', 'b']]
print (c)    #[1, 2, 3, ['a', 'b']]
print (d)    #[1, 2, 3, ['a', 'b']]

alist.append(5)

print (b)    #[1, 2, 3, ['a', 'b'], 5]
print (c)    #[1, 2, 3, ['a', 'b']]
print (d)    #[1, 2, 3, ['a', 'b']]

alist[3].append('cccc')

print (b)    #[1, 2, 3, ['a', 'b', 'cccc'], 5]
print (c)    #[1, 2, 3, ['a', 'b', 'cccc']]
print (d)    #[1, 2, 3, ['a', 'b']]

相关文章

  • 04--Python 数据类型

    @Author : Roger TX (425144880@qq.com) @Link : https:/...

  • JAVA 之路第一讲

    数据类型: 基础数据类型 包装器数据类型 引用数据类型 null 数据类型 基础数据类型: 整型 byte(字节型...

  • php 数据类型和数据类型转化

    一、数据类型 基础数据类型 复合数据类型 特殊数据类型 二、获取数据类型 三、打印数据类型和值 四、数据类型判断 ...

  • 2020-07-21----爬虫项目 -04--python操作

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JS...

  • OC和C中的数据类型

    数据类型对比 C语言数据类型C语言数据类型 OC数据类型

  • JAVA 核心笔记 || [2] 数据类型

    JAVA数据类型分为两大数据类型: 1.内置数据类型2.引用数据类型 内置数据类型 引用数据类型 上篇 : 开篇 ...

  • 数据类型

    数据类型作用:数据类型不同,空间大小不同。 数据类型分类:基本数据类型、引用数据类型基本数据类型:整数型、浮点型、...

  • Java知识之数据类型

    Java数据类型图表## Java数据类型分为:### 基础数据类型 引用数据类型 null类型 基础数据类型分別...

  • JAVA基础第四天

    JAVA数据类型---布尔类型; 数据类型转换自动数据类型转换 强制数据类型转换

  • Java数据类型(慢慢积累,对于事物的理解也会不一样)

    Java的数据类型: 1. 内置数据类型(基本数据类型); 2. 引用数据类型; Java基本数据类型:(...

网友评论

      本文标题:04--Python 数据类型

      本文链接:https://www.haomeiwen.com/subject/emxkcftx.html