04--Python 数据类型

@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']]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,950评论 17 410
  • 本节要介绍的是Python里面常用的几种数据结构。通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组...
    小黑y99阅读 65,193评论 0 9
  • 家和萨提亚领导力:自我关爱分享 第49天签到(2016.11.9) 每天坚持一件事:冥想三十分钟 我是个比较独立...
    孙丽霞阅读 135评论 0 0
  • 网络中四 1月7日 持续分享第178天 目的地太远,想想敬而生畏,常常令人寸步难行;一眼就能看见的地方,才有行动的...
    xfsunshine阅读 304评论 0 0
  • 在谈恋爱之前,我还是我,我知道自己想要什么,知道自己的目的是什么,有时候悲伤,该快乐还是会快乐。。。现在呢?迷失自己了
    4ef6c09c84b6阅读 177评论 0 0