3.Python3数据类型

前言

学习Demo
Python3的数据类型有六种,即其有六个标准的数据类型:

  • Number(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Sets(集合)
  • Dictionary(字典)

一.基本数据类型(Number)

一个程序要运行,就要先描述其算法。描述一个算法应先说明算法中要用的数据,数据以变量或常量的形式来描述。每个变量或常量都有数据类型。Python3的基本数据类型有4种: 整型(int)、浮点型(float)、 布尔型(bool)、complex(复数)。

1.在Python3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
2.像大多数语言一样,数值类型的赋值和计算都是很直观的。
3.内置的 type() 函数可以用来查询变量所指的对象类型。

Python还支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型

a, b, c, d = 20, 5.5, True, 4+3j  # Python允许你同时为多个变量赋值 
print(type(a), type(b), type(c), type(d)) # 输出结果: <class 'int'> 
<class 'float'> <class 'bool'> <class 'complex'>

此外还可以用 isinstance 来判断类型:

a, b, c, d = 20, 5.5, True, 4+3j
isinstance(a, int)  # 输出结果: True

sinstance 和 type 的区别在于:

  • type()不会认为子类是一种父类类型。
  • isinstance()会认为子类是一种父类类型。
class A:
    pass

class B(A):
    pass

isinstance(A(), A)  # returns True
type(A()) == A      # returns True
isinstance(B(), A)    # returns True
type(B()) == A        # returns False

1.1 bool(布尔值)

  • 在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
  • 此外布尔值可以用and、or和not运算。
  • not运算是非运算,它是一个单目运算符,把True变成False,False变成True:
>>> True and True
True
>>> True and False
False
>>> False and False
False
>>> 5 > 3 and 3 > 1
True
>>> True or True
True
>>> True or False
True
>>> False or False
False
>>> 5 > 3 or 1 > 3
True
>>> not True
False
>>> not False
True
>>> not 1 > 2
True

1.2 数值运算

  • Python可以同时为多个变量赋值,如a, b = 1, 2。
  • 一个变量可以通过赋值指向不同类型的对象。
  • 数值的除法(/)总是返回一个浮点数,要获取整数使用//操作符。
  • 在混合计算时,Python会把整型转换成为浮点数。
>>> 5 + 4  # 加法
9
>>> 4.3 - 2 # 减法
2.3
>>> 3 * 7  # 乘法
21
>>> 2 / 4  # 除法,得到一个浮点数
0.5
>>> 2 // 4 # 除法,得到一个整数
0
>>> 17 % 3 # 取余 
2
>>> 2 ** 5 # 乘方
32

1.2 del语句删除一些对象引用

del语句的语法是:del var1[,var2[,var3[....,varN]]]]
您可以通过使用del语句删除单个或多个对象。例如:

del var
del var_a, var_b

二.String(字符串)

Python中的字符串用单引号('')或双引号("")括起来,同时使用反斜杠(\)转义特殊字符。

2.1 字符串的截取、拼接
  • 变量[头下标:尾下标]
  • 索引值以 0 为开始值,-1 为从末尾的开始位置。
  • 加号 (+) 是字符串的连接符, 星号 (*) 表示复制当前字符串,紧跟的数字为复制的次数。
#!/usr/bin/python3
 
str = 'Runoob'
 
print (str)          # 输出字符串
print (str[0:-1])    # 输出第一个到倒数第二个的所有字符
print (str[0])       # 输出字符串第一个字符
print (str[2:5])     # 输出从第三个开始到第五个的字符
print (str[2:])      # 输出从第三个开始的后的所有字符
print (str * 2)      # 输出字符串两次
print (str + "TEST") # 连接字符串

执行以上程序会输出如下结果:

Runoob
Runoo
R
noo
noob
RunoobRunoob
RunoobTEST
2.2 转义特殊字符

Python 使用反斜杠(\)转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串:

>>> print('Ru\noob')
Ru
oob
>>> print(r'Ru\noob')
Ru\noob
>>> 

另外,反斜杠(\)可以作为续行符,表示下一行是上一行的延续。也可以使用 """...""" 或者 '''...''' 跨越多行(仅限终端交互模式)。

>>> print('''line1
... line2
... line3''')
line1
line2
line3

注意,Python 没有单独的字符类型,一个字符就是长度为1的字符串。

>>> word = 'Python'
>>> print(word[0], word[5])
P n
>>> print(word[-1], word[-6])
n P
2.3 Python中的字符串不能改变

与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = 'm'会导致错误。

>>> word = 'Python'
>>> word[0] = 'm'  #会导致错误
2.4 字符串格式化
符 号 描述
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 格式化整数
%u 格式化无符号整型
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化浮点数字,可指定小数点后的精度
%e 用科学计数法格式化浮点数
%E 作用同%e,用科学计数法格式化浮点数
%g %f和%e的简写
%G %f 和 %E 的简写
%p 用十六进制数格式化变量的地址
2.5 常用函数

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import base64

s = 'hello world !'

#  1.把字符串的第一个字符大写
print('s.capitalize():',s.capitalize())
#  2.返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
print('s.center(20):',s.center(20))
print('s.center(20,\'*\'):',s.center(20,'*'))
#  3.返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出
#    现的次数
"""
参数1:搜索的子字符串;
参数2:字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0;
参数3:字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。

"""
print('s.count(\'l\',0,-1):',s.count('l',0,-1))
#  4.以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的异常,除非 
#    errors 指定的是 'ignore' 或者'replace'
"""
python3不太一样:因为3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码
"""
encodestr = base64.b64encode('abcr34r344r'.encode('utf-8'))
"""
1).encodestr: b'YWJjcjM0cjM0NHI='  结果和我们预想的有点区别,我们只想要获得YWJjcjM0cjM0NHI=
,而字符串被b''包围了。
2).b 表示 byte的意思,我们只要再将byte转换回去就好了
"""
print('encodestr:',encodestr)

encodestr1 = str(encodestr,'utf-8', errors='strict')
print('encodestr1:',encodestr1) #  encodestr1: YWJjcjM0cjM0NHI=

decodestr = base64.b64decode(encodestr1.encode('utf-8'))
print('decodestr:',decodestr)  #  b'abcr34r344r'
print(str(decodestr,'utf-8', errors='strict'))  #  abcr34r344r
#  5.检查字符串是否以 obj 结束,如果beg或者end指定则检查指定的范
#    围(长度)内是否以obj结束,如果是,返回 True,否则返回 False.
print('\'test\'.endswith(\'t\',4):','test'.endswith('t',0,4))
#  6.把字符串中的 tab 符号('\t')转为空格,tab 符号('\t')默认的空格数是 8。
#  this is        string example....wow!!!
print('this is\tstring example....wow!!!'.expandtabs(15))  
#  7.检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范
#    围内,如果是返回开始的索引值,否则返回-1
"""
str -- 指定检索的字符串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度。
注意:检测到一个就会停止
"""
print(s.find('l',0,10))
#  8.跟find()方法一样,只不过如果str不在 string中会报一个异常
print('\'good\'.index(\'0\',0,4):','good'.index('o',0,4))
#  9.如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
#    (检测字符串是否由字母和数字组成)
print("'678'.isalnum():",'678'.isalnum())
print("'6a78'.isalnum():",'6a78'.isalnum())
print("'-he66'.isalnum():",'-he66'.isalnum())
#  10.如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False(检测字
#     符串是否只由字母组成)
print("'678'.isalpha():",'678'.isalpha())
print("'6a78'.isalpha():",'6a78'.isalpha())
print("'gegge'.isalpha():",'gegge'.isalpha())
#  11.如果 string 只包含十进制数字则返回 True 否则返回 False)
#     注意:定义一个十进制字符串,只需要在字符串前添加 'u' 前缀即可。
print("'678'.isdecimal():",'678'.isdecimal())
print("'678a'.isdecimal():",'678a'.isdecimal())
print("'0x124ad'.isdecimal():",'0x124ad'.isdecimal())
#  12.如果 string 只包含数字则返回 True 否则返回 False.
print("'678'.isdigit():",'678'.isdigit())
print("'678t'.isdigit():",'678t'.isdigit())
#  13.如果 string 中只包含数字字符,则返回 True,否则返回 False
print("'678'.isnumeric():",'678'.isnumeric())
print("'678t'.isnumeric():",'678t'.isnumeric())
#  14.如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是
#     小写,则返回 True,否则返回 False(检测字符串是否由小写字母组成)
print("'test'.islower():",'test'.islower())
print("'Test'.islower():",'Test'.islower())
#  15.如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大
#     写,则返回 True,否则返回 False
print("'test'.isupper():",'test'.isupper())
print("'TEST'.isupper():",'TEST'.isupper())
#  16.如果 string 中只包含空格,则返回 True,否则返回 False
print("'       '.isspace():",'       '.isspace())
print("'This is string example....wow!!!'.isspace():",
'This is string example....wow!!!'.isspace())
#  17.如果 string 是标题化的(见 title())则返回 True,否则返回 False
print("'This Is A Test'.istitle():",'This Is A Test'.istitle())
print("'This is a test'.istitle():",'This is a test'.istitle())
#  18.以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串(将序
#     列中的元素以指定的字符连接生成一个新的字符串)
seq = ("r", "u", "n", "o", "o", "b") # 字符串序列
print ("'-'.join(seq):",'-'.join(seq))
print ("''.join(seq):",''.join(seq))
#  19.len() 方法返回对象(字符、列表、元组等)长度或项目个数
print("len('hello'):", len('hello'))
#  20.返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
print("'hello'.ljust(20,'*'):", 'hello'.ljust(20,'*'))
#  21.转换 string 中所有大写字符为小写
print("'HELLO'.lower():", 'HELLO'.lower())
#  22.转换 string 中的小写字母为大写
print("'hello'.upper():", 'hello'.upper())
#  23.截掉 string 左边的字符
print("'  hello'.lstrip(' '):", '  hello'.lstrip(' '))
print("'88888hello'.lstrip(' '):", '  hello'.lstrip('8'))
#  24.maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,
# 第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标
"""
maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,
第一个参数是字符串,表示需要转换的字符;
第二个参数也是字符串表示转换的目标。
两个字符串的长度必须相同,为一一对应的关系。
注:Python3.4已经没有string.maketrans()了,取而代之的是内建
函数: bytearray.maketrans()、bytes.maketrans()、str.maketrans()
"""
#  以下实例展示了使用maketrans() 方法将所有元音字母转换为指定的数字
intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab)
str = "this is string example....wow!!!"
print (str.translate(trantab))
#  25.返回字符串 str 中最大的字母
print("max('abjzkqp'):", max('abjzkqp'))
#  26.返回字符串 str 中最小的字母
print("min('abjzkqp'):", min('abjzkqp'))
#  27.返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0
print("'world'.zfill(20):", 'world'.zfill(20))
#  28.翻转 string 中的大小写
print("'WorLd'.swapcase():", 'WorLd'.swapcase())
#  29.返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
print("'this is a test'.title():", 'this is a test'.title())
#  30.把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
print("'this is a test'.replace('s','q',3):", 'this is a test'.replace('s','q',3))
#  31.类似于find()函数,不过是从右边开始查找(返回字符串最后一次出现的位置,如果没有匹配项则
#     返回-1)
"""
str -- 查找的字符串
beg -- 开始查找的位置,默认为0
end -- 结束查找位置,默认为字符串的长度。
"""
print("'hello'.rfind('l',0,5):", 'hello'.rfind('l',0,5))
#  32.类似于index(),不过是从右边开始(返回子字符串str在字符串中最后出现的位置,如果没有匹配的
#     字符串会报异常)
print("'hello'.rindex('l',0,5):", 'hello'.rindex('l',0,5))
#  33.返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
print("'test'.rjust(20,'*'):", 'test'.rjust(20,'*'))
#  34.删除 string 字符串末尾的指定字符(默认为空格)
print("'world*****'.rstrip('*'):", 'world*****'.rstrip('*'))
#  35.在string上执行lstrip()和rstrip()(用于移除字符串头尾指定的字符(默认为空格))
print("'***test***'.strip('*'):", '***test***'.strip('*'))
#  36.根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中
"""
able -- 翻译表,翻译表是通过 maketrans() 方法转换而来。
deletechars -- 字符串中要过滤的字符列表。
"""
bytes_tabtrans = bytes.maketrans(b'abcdefghijklmnopqrstuvwxyz', 
b'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
print(b'runoob'.translate(bytes_tabtrans, b'o'))  # 转换为大写,并删除字母o
#  37.检查字符串是否是以obj开头,是则返回True,否则返回False。如果beg和end 指定值,则在指定范
#     围内检查
print("'test'.startswith('t',0,4):", 'test'.startswith('t',0,4))
#  38.以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串
"""
str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num -- 分割次数。
"""
str = "this is string example....wow!!!"
print(str.split( ))  #  ['this', 'is', 'string', 'example....wow!!!']
print(str.split('i',1))  #  ['th', 's is string example....wow!!!']
print(str.split('w'))  #  ['this is string example....', 'o', '!!!']
#  39.按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,
#     如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符
#  ['ab c', '', 'de fg', 'kl']
print('ab c\n\nde fg\rkl\r\n'.splitlines())  
#  ['ab c\n', '\n', 'de fg\r', 'kl\r\n']
print('ab c\n\nde fg\rkl\r\n'.splitlines(True))  
#  40.有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把字
#     符串string分成一个3元素的元组 (string_pre_str,str,string_post_str)
#     ,如果 string 中不包含str 则 string_pre_str == string.
#     根据指定的分隔符将字符串进行分割
"""
如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,
第二个为分隔符本身,第三个为分隔符右边的子串
"""
str6 = "https://www.baidu.com/"
print(str6.partition("://"))
#  41.类似于 partition()函数,不过是从右边开始查找
print(str6.rpartition("://"))

三.空值(None)。

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

四. List(列表:有序可变)

  • List(列表) 是 Python 中使用最频繁的数据类型。与Objective-C中的NSMutableArray类似。
  • 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
  • 列表是写在方括号([])之间、用逗号分隔开的元素列表。
  • 和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
4.1 创建列表:
# 方法一:
ame_list = ['alex', 'seven', 'eric']
# 方法二:
name_list = list(['alex', 'seven', 'eric'])
4.2 常用函数:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import copy

a = 89
b = '6'
ame_list = [68, 68, 58, 108945, 1, 75, 69] # 列表1
temp_list = [55, 75, 452, 7856, 4553, 45354, 54] # 列表2
temp_list1 = ['b','y','q','a','k','z','p','b' ] # 列表3
tup1 = ('Google', 'Runoob', 1997, 2000) # 元组

# 1.列表元素个数
print(len(ame_list))
# 2.返回列表元素最大值
print(max(ame_list))
# 3.返回列表元素最小值
print(min(ame_list))
# 4.将元组转换为列表
print(list(tup1))
# 5.在列表末尾添加新的对象
ame_list.append(a)
print(ame_list)
# 6.统计某个元素在列表中出现的次数
print(ame_list.count(68))
# 7.在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
(ame_list.extend(temp_list))
print(ame_list)
# 8.从列表中找出某个值第一个匹配项的索引位置
print(ame_list.index(1,0,6)) # 参数:value,起始位置,结束位置
print(ame_list.index(75))  # 无起始值则遍历所有value
# 9.将对象插入列表
'''
共有如下5种场景:
场景1:index=0时,从头部插入obj
场景2:index > 0 且 index < len(list)时,在index的位置插入obj
场景3:当index < 0 且 abs(index) < len(list)时,从中间插入obj,
      如: -1 表示从倒数第1位插入obj; -2 表示从倒数第2位插入obj
场景4:当index < 0 且 abs(index) >= len(list)时,从头部插入obj
场景5:当index >= len(list)时,从尾部插入obj
'''
ame_list.insert(2,198) # 参数:插入位置,插入值
print(ame_list)
# 10.移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
print(ame_list.pop(-1)) # -1代表最后一个元素
print(ame_list)
# 11.移除列表中某个值的第一个匹配项
ame_list.remove(68)
print(ame_list)
# 12.反向列表中元素
ame_list.reverse()
print(ame_list)
# 13.对原列表进行排序 list.sort([func])
ame_list.sort() # func 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
print(ame_list)
# 14.复制列表( copy() 函数用于复制列表,类似于 a[:])。
new_list1 = copy.copy(temp_list1) # 要导入copy类import copy
new_list2 = copy.deepcopy(temp_list1)
print(new_list1)
print(new_list2)
# 15.清空列表 (clear() 函数用于清空列表,类似于 del a[:]。)
new_list2.clear() # clear()函数3.x以上版本才有,2.x无
print(new_list2)

五. Tuple(元组:有序不可变)

不可变列表类似Objective-C中的NSArray,初始化如下:

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# 方法一:
ages = (11, 22, 33, 44, 55)
# 方法二:
ages = tuple((11, 22, 33, 44, 55))
5.1 访问元组
#!/usr/bin/python3

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )

print ("tup1[0]: ", tup1[0])  # tup1[0]:  Google
print ("tup2[1:5]: ", tup2[1:5])  # tup2[1:5]:  (2, 3, 4, 5)
5.2 删除元组

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

#!/usr/bin/python3

tup = ('Google', 'Runoob', 1997, 2000)
print (tup)
del tup;
print ("删除后的元组 tup : ")
print (tup) # 以上实例元组被删除后,输出变量会有异常信息,输出如下所示:
"""
('Google', 'Runoob', 1997, 2000)
Traceback (most recent call last):
删除后的元组 tup : 
  File "/Users/ysf/Desktop/Python/package1/LYDictionary.py", line 11, in <module>
    print (tup) # 以上实例元组被删除后,输出变量会有异常信息,输出如下所示:
NameError: name 'tup' is not defined
"""
5.3 注意点
  • 注意点一:
# 但是,要定义一个只有1个元素的tuple,如果你这么定义:
>>> t = (1)
>>> t
# 输出结果是:1
""" 
定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产
生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。所以,只有1个元素的
tuple定义时必须加一个逗号(,)来消除歧义:
"""
>>> t = (1,)
>>> t
# 输出结果是:(1,)
  • 注意点二:“可变的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
# 输出结果是:('a', 'b', ['X', 'Y'])
"""
这个tuple定义的时候有3个元素,分别是'a','b'和一个list。不是说tuple一旦定义后就不可变了吗?怎么
后来又变了?表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开
始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即
指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
所以说要创建一个内容也不变的tuple,那就必须保证tuple的每一个元素本身也不能变。
"""

六. Dictionary(字典可变)

字典是另一种可变容器模型,且可存储任意类型对象,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }
6.1 dict的实现原理

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。

第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字。无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

dict就是第二种实现方式,给定一个名字,比如'Michael',dict在内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。

6.2 特性及常用函数
  • 键必须是唯一的,但值则不必。
  • 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。(键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行)
  • 一个key只能对应一个value,所以多次对一个key放入value,后面的值会把前面的值覆盖
  • 如果key不存在,dict就会报错
#!/usr/bin/python3
# -*- coding: UTF-8 -*-


# 1.字典初始化
dict1 = {'name': 'sam', 98.6: 37, 'sex': '男', 'height': 188, 'car': '路虎'}
dict2 = {'name': 'sam', 98.6: 37, 'sex': '男', 'height': 188}
print("dict1: ", dict1)
# 2.访问字典里的值
print("dict1['name']: ", dict1['name'])
# 3.避免key不存在的错误,有两种办法,一是通过in判断key是否存在;二是通过dict提供的get()方法,如
#果key不存在,可以返回None,或者自己指定的value:
print("age in dict1: ", 'age' in dict1)  # 方法一
print("age in dict1: ", dict1.get('age'))  # 方法二  默认值为None
print("age in dict1: ", dict1.get('age', -1))  # 方法二  自定义value
# 4.和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
print("dict1.setdefault: ", dict1.setdefault('Taobao', '淘宝'))
# 5.删除一个key
print("dict1.pop('name'): ", dict1.pop('name'))
print("dict1: ", dict1)
# 6.计算字典元素个数,即键的总数。
print("len(dict1): ", len(dict1))
# 7.输出字典,以可打印的字符串表示。
print("str(dict1): ", str(dict1))
# 8.返回输入的变量类型,如果变量是字典就返回字典类型。
print("type(dict1): ", type(dict1))  # <class 'dict'>
# 9.删除字典内所有元素
dict2.clear()
print("dict2: ", dict2)
# 10.返回一个字典的浅复制
print("dict1.copy(): ", dict1.copy())
# 11.以列表返回可遍历的(键, 值)元组数组
print("dict1.items(): ", dict1.items())
# 12.以列表返回一个字典所有的键
print("dict1.keys(): ", dict1.keys())
# 13.以列表返回字典中的所有值
print("dict1.values(): ", dict1.values())
# 14.把字典dict1的键/值对更新到dict2里
dict2.update(dict1)
print("dict2.update(dict1)后dict2的值: ", dict2)
# 15.删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
dict1.pop('car')
print("dict1: ", dict1)
# 16.随机返回并删除字典中的一对键和值(一般删除末尾对)。
dict2.popitem()
print("dict2: ", dict2)
# 17.创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
seq = ('name', 'age', 'sex')
dict3 = dict.fromkeys(seq)
print("新的字典为 : %s", str(dict3))   # 全部key的value都默认赋值为:None
dict4 = dict.fromkeys(seq, 10)   # 全部key的value都赋值为:10
print("新的字典全部key的value都赋值为:10 : %s",  str(dict4))

# 18.键用列表会报错
dict5 = {['Name']: 'Runoob','Age': 7}
"""
Traceback (most recent call last):
  File "/Users/ysf/Desktop/Python/package1/LYDictionary.py", line 30, in <module>
    dict = {['Name']: 'Runoob',  'Age': 7}
TypeError: unhashable type: 'list'
"""

# 19.如果用字典里没有的键访问数据,会输出错误
print("dict1['job']: ", dict1['job'])
"""
Traceback (most recent call last):
  File "/Users/ysf/Desktop/Python/package1/LYDictionary.py", line 63, in <module>
    print("dict1['job']: ", dict1['job'])
KeyError: 'job'
"""
6.3 dict和list的优缺点

和list比较,dict有以下几个特点:

  • 查找和插入的速度极快,不会随着key的增加而变慢;
  • 需要占用大量的内存,内存浪费多。

list优缺点:

  • 查找和插入的时间随着元素的增加而增加;
  • 占用空间小,浪费内存很少。

总结:所以,dict是用空间来换取时间的一种方法。dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

七. Set(无序不重复元素集合)

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。总结:set和dict的唯一区别仅在于没有存储对应的value

7.1 Set特性
  • 集合(set)是一个无序不重复元素的序列。
  • 基本功能是进行成员关系测试和删除重复元素。
  • 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用set()而不是 { },因为 { }是用来创建一个空字典。
7.2 创建Set
# 方法一:
parame = {value01,value02,...}
# 方法二:
set(value)
7.3 基本用法
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

# 1.创建一个set,需要提供一个list作为输入集合,重复元素在set中自动被过滤
s = set([1, 1, 2, 2, 3, 3])  # {1, 2, 3}
# 2.通过add(key)方法可以添加元素到set中,可以重复添加,但只有第一次有效果
s.add(4)  # {1, 2, 3, 4}
s.add(4)  # {1, 2, 3, 4}
# 3.通过remove(key)方法可以删除元素
s.remove(4)  # {1, 2, 3},不能移除不存在的key
# 4.set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集
# 等操作:
s1 = set([1, 2, 3])
s2 = set([2, 3, 4])
print("s1 & s2: ", s1 & s2)  # {2, 3}
print("s1 | s2: ", s1 | s2)  # {1, 2, 3, 4}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Python 简介Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设...
    在暴风雨中逆袭阅读 1,705评论 0 12
  • 期期不老山, 粼粼错棋盘。 沸沸反天走, 涔涔解衣衫。
    乙等阅读 224评论 0 12
  • 其实好早之前就一直想弄头发了,可是又挺怕去折腾这头发的,其实也不是怕折腾,就怕折腾得不好。就像我们往往不太愿意去做...
    unmi阅读 633评论 4 2
  • 明明知道 有些事情并不是百分百的质量 但我依然用百分百的认真去对待 因为我是巨蟹座 在我的世界里 从没有牵强和迁就...
    宏红阅读 147评论 0 0
  • 我们的一生都想寻找到一个人,这个人也许在你无助的时候,能给你安全和温暖;也许在你走向梦想的路上,能给你指引和陪伴。...
    露敏阅读 564评论 0 1