Python3 中有六个标准的数据类型:
- Number(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Sets(集合)
- Dictionary(字典)
Number(数字)
Python3 支持 int【整型】、float【浮点型】、bool【布尔型】、complex(复数)。
int(整型): 如 1
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示
符号。
bool(int的子类型):True or False
在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是
1 和 0,它们可以和数字相加。
complex(复数):如 1 + 2j
复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
注:Python中存在小数字池:-5 ~ 257
在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
像大多数语言一样,数值类型的赋值和计算都是很直观的。
内置的 type() 函数可以用来查询变量所指的对象类型。
1 a, b, c, d = 20, 5.5, True, 4+3j
2 print(type(a), type(b), type(c), type(d))
View Code
此外还可以用 isinstance 来判断:
1 a= 20
2 data = isinstance(a, int)
3 print(data)
View Code
isinstance 和 type 的区别在于:
class A:
pass
class B(A):
pass
print(isinstance(A(), A)) # returns True
print(type(A()) == A ) # returns True
print(isinstance(B(), A)) # returns True
print(type(B()) == A )# returns False
View Code
区别就是:
- type()不会认为子类是一种父类类型。
- isinstance()会认为子类是一种父类类型。
注意:在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。到 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
您可以通过使用del语句删除单个或多个对象。。del语句的语法是:del[,var2[,var3[....,varN]]]]
eg:
1 var = 5
2 del var
3 print(var)
View Code
数值运算
print(5 + 4) # 加法
print(4.3 - 2) # 减法
print(3*7) # 乘法
print(2/4) # 除法,得到一个浮点数
print(2 // 4) # 除法,得到一个整数
print(17 % 3) # 取余
print(2 ** 5) # 乘方
View Code
注意:
- 1、Python可以同时为多个变量赋值,如a, b = 1, 2。
- 2、一个变量可以通过赋值指向不同类型的对象。
- 3、数值的除法(/)总是返回一个浮点数,要获取整数使用//操作符。
- 4、在混合计算时,Python会把整型转换成为浮点数。
- 5、在整数除法中,除法(/)总是返回一个浮点数,如果只想得到整数的结果,丢弃可能的分数部分,可以使用运算符 //
- 6、变量在使用前必须先"定义"(即赋予变量一个值),否则会出现错误
总结:数值型的增删改查操作!
随机数函数
随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。
Python包含以下常用随机数函数:
案例演示:
import random
poker = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
random.shuffle(poker)
print(poker)
#初次设定随机数种子
random.seed (10)
print(random.random())
#这次没有设定随机数种子,会发现这两次的随机数是不一样的!
print(random.random())
#初次设定随机数种子
random.seed (10)
print(random.random())
#再次次设定随机数种子,会发现这两次的随机数是一样的!
random.seed (10)
print(random.random())
View Code
三角函数:
数学常量:
String(字符串)
字符串的定义:它是一个有序的字符的集合,用于存储和表示基本的文本信息,Python中的字符串用单引号(')或双引号(")括起来,同时使用反斜杠(\)转义特殊字符。
特性:按照从左到右的顺序定义字符集合,下标从0开始顺序访问,有序
注意:
Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用。
Python 访问子字符串,可以使用方括号来截取字符串
字符串的截取的语法格式如下:
变量[头下标:尾下标]
加号 (+) 是字符串的连接符, 星号 (*) 表示复制当前字符串,紧跟的数字为复制的次数。实例如下:
#!/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
View Code
Python 使用反斜杠(\)转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串:
print('Ru\noob')
print(r'Ru\noob')
输出结果为:
Ru
oob
Ru\noob
View Code
另外,反斜杠(\)可以作为续行符,表示下一行是上一行的延续。也可以使用 """...""" 或者 '''...''' 跨越多行。
注意,Python 没有单独的字符类型,一个字符就是长度为1的字符串。
代码:
word = 'Python'
print(word[0], word[5])
print(word[-1], word[-6])
View Code
注意:
- 1、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。
- 2、字符串可以用+运算符连接在一起,用*运算符重复。但是字符串是不能和数值型直接拼接的,如果想要让字符串拼接,就先把数值型转换为字符串:print("dad"+str(123))
- 3、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。
- 4、Python中的字符串不能改变。
- 5、python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
字符串格式化输出
name = "alex"
print "i am %s " % name
#输出: i am alex
View Code
PS: 字符串是 %s;整数 %d;浮点数%f
字符串常用功能:
- 移除空白【strip(),lstrip(),rstrip()】
- 分割[split()]
- 长度[len()]
- 索引[index()]
- 切片: 变量[头下标:尾下标] 0表示开始的位置,-1表示最后一个字母的位置
字符串的其它函数:
1.#dir()函数可以查看一个对象中可使用的方法和属性
print(dir("ds"))
2.#连接字符串
sStr1 = 'strcat'
sStr2 = 'append'
sStr1 += sStr2
print(sStr1)
3.#比较字符串(==)
print(“aaa”==“bbb” )
4.字符串中的搜索和替换:
S.find(substr, [start, [end]]) #返回S中出现substr的第一个字母的标号,如果S中没有substr则返回-1。start和end作用就相当于在S[start:end]中搜索
S.index(substr, [start, [end]]) #与find()相同,只是在S中没有substr时,会返回一个运行时错误
S.rfind(substr, [start, [end]]) #返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回-1,也就是说从右边算起的第一次出现的substr的首字母标号
S.rindex(substr, [start, [end]])
S.count(substr, [start, [end]]) #计算substr在S中出现的次数
S.replace(oldstr, newstr, [count]) #把S中的oldstr替换为newstr,count为替换次数。这是替换的通用形式,还有一些函数进行特殊字符的替换
S.strip([chars]) #把S中前后chars中有的字符全部去掉,可以理解为把S前后chars替换为None
S.lstrip([chars])
S.rstrip([chars])
5.# 字符串的分割和组合:
# S.split([sep, [maxsplit]]) #以sep为分隔符,把S分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符
# S.join(seq) #把seq代表的序列──字符串序列,用S连接起来
6.# 字符串中字符大小写的变换:
# S.lower() #小写
# S.upper() #大写
# S.swapcase() #大小写互换
# S.capitalize() #首字母大写
7.# 字符串的测试函数,这一类函数在string模块中没有,这些函数返回的都是bool值:
# S.startwith(prefix) #是否以prefix开头
# S.endwith(suffix) #以suffix结尾
# S.isalnum() #是否全是字母和数字
# S.isalpha() #是否全是字母
# S.isdigit() #是否全是数字
# S.isspace() #是否全是空白字符
# S.islower() #S中的字母是否全是小写
# S.isupper() #S中的字母是否便是大写
# S.istitle() #S是否是首字母大写的
8.# 字符串编码和解码的函数(默认是UTF-8编码和解码):
# S.encode([encoding]) # 其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib big5 bzse64等都支持。
# S.decode([encoding])
9.# python字符串与数字的转化
# 数字变为字符串 str()
# 字符串变为数字
print(int("12"))
print(float("12"))
print(complex("12"))
str=bool("12")
print(type(str),str)
View Code
msg.index('a') 返回a所在字符串的索引
python转义字符
python的字符串运算符
注意:Python三引号
python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。实例如下:
#!/usr/bin/python3
para_str = """这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
"""
print (para_str)
View Code
List(列表)
List(列表) 是 Python 中使用最频繁的数据类型。
列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
列表是写在方括号([])之间、用逗号分隔开的元素列表,列表的数据项不需要具有相同的类型。
和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
列表的创建,语法:
name_list = ['alex', 'seven', 'eric']
或
name_list = list(['alex', 'egon', 'eric'])
列表截取的语法格式如下:
变量[头下标:尾下标]
索引值以 0 为开始值,-1 为从末尾的开始位置。
加号(+)是列表连接运算符,星号(*)是重复操作。如下实例:
list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ]
tinylist = [123, 'runoob']
print (list) # 输出完整列表
print (list[0]) # 输出列表第一个元素
print (list[1:3]) # 从第二个开始输出到第三个元素
print (list[2:]) # 输出从第三个元素开始的所有元素
print (tinylist * 2) # 输出两次列表
print (list + tinylist) # 连接列表
View Code
以上实例输出结果:
['abcd', 786, 2.23, 'runoob', 70.2]
abcd
[786, 2.23]
[2.23, 'runoob', 70.2]
[123, 'runoob', 123, 'runoob']
['abcd', 786, 2.23, 'runoob', 70.2, 123, 'runoob']
View Code
与Python字符串不一样的是,列表中的元素是可以改变的:
a = [1, 2, 3, 4, 5, 6]
a[0] = 9
a[2:5] = [13, 14, 15]
print(a)
a[2:5] = [] # 删除
print(a)
View Code
结果如下:
[9, 2, 13, 14, 15, 6]
[9, 2, 6]
View Code
List内置了有很多方法,例如append()、pop()等等,这在后面会讲到。
注意:
- 1、List写在方括号之间,元素用逗号隔开。
- 2、和字符串一样,list可以被索引和切片。
- 3、List可以使用+操作符进行拼接.
- 4、List中的元素是可以改变的。
- 5、List中的元素是有序的。
列表操作:
1.增加、追加:
insert
功能:在指定索引位置的元素前面插入新的元素
name = ['sd','dfdf','drer',['sddss','sdsdsd']]
name.insert(3,'sd')
返回结果:name
['sd', 'dfdf', 'drer', 'sd', ['sddss', 'sdsdsd']]
append
功能:列表追加元素
name = ['sd','dfdf','drer']
name.append('sdsd')
返回结果:name
['sd', 'dfdf', 'drer', 'sdsd']
extend
功能:追加字符元素或列表元素
name = ['sd','dfdf','drer',['sddss','sdsdsd']]
li = ['sd','sdsds',['sd','dffdg',],]
name.extend('ss')
返回结果:name
['sd', 'dfdf', 'drer', ['sddss', 'sdsdsd'], 's', 's']
name.extend('d')
返回结果:name
['sd', 'dfdf', 'drer', ['sddss', 'sdsdsd'], 's', 's', 'd']
name.extend(li)
返回结果:name
['sd', 'dfdf', 'drer', ['sddss', 'sdsdsd'], 's', 's', 'd', 'sd', 'sdsds', ['sd', 'dffdg']]
View Code
2.删除指定元素,删除指定的第几个元素,清空
pop
功能:删除指定索引值的元素,返回值为当前删除的元素的值。不指定索引值,默认删除最后一个元素
name = ['sd','dfdf','drer',['sddss','sdsdsd']]
name.pop(3)
返回结果:'sd'
remove
功能:删除列表中指定的元素
name = ['sd','dfdf','drer',['sddss','sdsdsd']]
name.remove('sd')
name
返回结果:['dfdf', 'drer', ['sddss', 'sdsdsd']]
clear
功能:情况列表元素
name = ['sd','dfdf','drer']
name.clear()
返回结果:name
View Code
3.查索引,查,利用切片查
index
功能:定位列表中某元素
name = ['sd','dfdf','drer',['sddss','sdsdsd']]
print(name.index('sd'))
返回结果:0
返回结果:name.index('dr') #当出现某元素不在列表中的时候会直接报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'dr' is not in list
count
功能:统计列表指定元素个数
name = ['sd','dfdf','drer',['sddss','sdsdsd']]
name.count('sd')
返回结果:1
li = ['sd','sdsds',['sd','dffdg',],]
li.count('sd') #只统计第一层的元素个数
返回结果:1
利用切片查:
变量[头下标:尾下标]
索引值以 0 为开始值,-1 为从末尾的开始位置。
View Code
4.包含、遍历、反向列表、拷贝【浅拷贝,深拷贝】
#包含、不包含(in ,not in )
list = ['a','b','c']
if 'a' in list:
print('a in the list')
if 'd' not in list:
print('d is not in the list')
# for 语句
for i in list:
print(i)
#reverse() 将列表中的元素逆序
name = ['sd','dfdf','drer',['sddss','sdsdsd']]
name.reverse()
print(name)
# copy(), 功能:浅拷贝,即只拷贝第一层的元素
name = ['sd', 'dfdf', 'drer']
li = ['ssd']
li = name.copy()
print(li)
# copy(), 功能:深拷贝,即只拷贝第一层的元素
name = ['sd', 'dfdf', 'drer', ['sddss', 'sdsdsd']]
li = ['ssd']
li = name.copy()
print(li)
View Code
Python包含以下函数
代码演示:
list01 = [1,3,6,2]
tuple01 = tuple((1,2,3))
print(len(list01))
print(max(list01))
print(min(list01))
print(list(tuple01))
View Code
python中的方法:
元组(不可变列表,有序,元素可重复)
元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号(())里,元素之间用逗号隔开。
元组中的元素类型也可以不相同:
创建元组:
ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))
构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:
tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号,如果不加这个逗号,运行的时候,就会发现而不是一个元组,而是一个数值,可以用type来验证!
#这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
View Code
元组的读取、截取、连接
tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2 )
tinytuple = (123, 'runoob')
print (tuple) # 输出完整元组
print (tuple[0]) # 输出元组的第一个元素
print (tuple[1:3]) # 输出从第二个元素开始到第三个元素
print (tuple[2:]) # 输出从第三个元素开始的所有元素
print (tinytuple * 2) # 输出两次元组
print (tuple + tinytuple) # 连接元组
View Code
元组与字符串类似,可以被索引且下标索引从0开始,-1 为从末尾开始的位置。也可以进行截取(看上面,这里不再赘述)。其实,可以把字符串看作一种特殊的元组。
注意:tup[0]=11# 修改元组元素的操作是非法的
虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表,如下所示:
tuple1=(1,2,3,4,["dfa","adf"])
print(tuple1)
tuple1[4].append("张三")
print(tuple1)
View Code
删除元组
元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组
tup = ('physics', 'chemistry', 1997, 2000);
del tup;
print(tup)#会报错
View Code
注意:
- 1、与字符串一样,元组的元素不能修改。
- 2、元组也可以被索引和切片,方法一样。
- 3、注意构造包含0或1个元素的元组的特殊语法规则。
- 4、元组也可以使用+操作符进行拼接。
- 5、元组中的元素值是不允许修改的,但我们可以对元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。
- 6、它只有2个方法,一个是count,一个是index,完毕。
tuple的意义:
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。
元组运算符:
元组内置函数:
程序练习
程序:购物车程序
需求:
- 启动程序后,让用户输入工资,然后打印商品列表
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
集合:可变/不可变集合
集合的基本功能: 进行成员关系测试和删除重复元素。
1.可变集合
集合(set)是一个无序不重复元素的序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用{ },因为 { } 是用来创建一个空字典。
可变集合的创建:
#创建集合的第一种方式:
student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
print(student) # 输出集合,重复的元素被自动去掉
print(type(student))
#创建集合的第二种方式:
stu = set((1,"23",23))
print(stu)
print(type(stu))
View Code
不可变集合的创建:
##创建集合的第三种方式:(严格意义上讲第一种和第二种是一致的,都是可变集合)
cons_set = frozenset(['b','h','h','k','o','p','s'])
print(cons_set)
print(type(cons_set))
View Code
可变集合的修改:
student = {'Tom', 'Jim', 'Mary', 'Jack', 'Rose'}
student.add("dad")#添加
student.update("abc") #添加 ,将整体拆分,将每一部分都作为集合整体的一部分!
student.remove("Tom") #删除
print(student)
stu = set((1,"23",23))
stu.add("python")
stu.update("45")
stu.remove(23)
print(stu)
View Code
不可变集合的修改:
# 只有可变集合能被修改。试图修改不可变集合会引发异常。
cons_set = frozenset(['b','h','h','k','o','p','s'])
cons_set.add('z')
View Code
注意:只有可变集合能被修改。试图修改不可变集合会引发异常。
可变集合与不可变集合的删除:
student = {'Tom', 'Jim', 'Mary', 'Jack', 'Rose'}
del student
stu = set((1,"23",23))
del stu
cons_set = frozenset(['b','h','h','k','o','p','s'])
del cons_set
View Code
成员关系:
student = {'Tom', 'Jim', 'Mary', 'Jack', 'Rose'}
print('Tom' in student)
stu = set((1,"23",23))
print(23 in stu)
cons_set = frozenset(['b','h','h','k','o','p','s'])
print("b" in cons_set)
View Code
集合等价、不等价:
#集合是否等价
student = {'Tom', 'Jim', 'Mary', 'Jack', 'Rose'}
stu = set(('Tom', 'Jim', 'Mary', 'Jack', 'Rose'))
print(stu != student)
print(student == stu)
cons_set = frozenset(['b','h','h','k','o','p','s'])
print(student == cons_set)
View Code
可变集合与不可变之间的相互转化
#可变集合与不可变之间的相互转化
stu = set(('Tom', 'Jim', 'Mary', 'Jack', 'Rose'))
s = frozenset(stu)
print(type(s))
cons_set = frozenset(['b','h','h','k','o','p','s'])
s = set(cons_set)
print(type(s))
View Code
集合操作与关系符号
注意:混合集合类型操作
左右两个操作数的类型不相同(左操作数是 set,右操作数是 frozenset,或相反情况),则所产生的结果类型与左操作数的类型相同。如下:
student = {'Tom', 'Jim', 'Mary', 'Jack', 'Rose'}
f = frozenset(['c', 'b', 'e', 'h', 'k', 'o', 'p', 's'])
st= student -f
print(st)
print(type(st))
View Code
遍历访问集合中的值(可变集合和非可变都支持)
#遍历访问集合中的值(可变集合和非可变都支持)
student = {'Tom', 'Jim', 'Mary', 'Jack', 'Rose'}
for i in student:
print(i)
View Code
字典
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合。
键(key)必须使用不可变类型。
在同一个字典中,键(key)必须是唯一的,键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行。
语法:
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
注意:
- 1、字典是一种映射类型,它的元素是键值对。
- 2、字典的关键字必须为不可变类型,且不能重复【so 天生去重】。
- 3、创建空字典使用 { }。
- 4、dict是无序的
Note: string、sets,list和tuple都属于sequence(序列)。
字典的操作:
增加:
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
info["stu1104"] = "美少女"
print(info)
View Code
修改:
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
info["stu1101"] = "11"
print(info)
View Code
删除:
1 info = {
2 'stu1101': "TengLan Wu",
3 'stu1102': "LongZe Luola",
4 'stu1103': "XiaoZe Maliya",
5 }
6
7 info.pop("stu1101") #标准删除姿势
8 print(info)
9 del info["stu1102"] #换个姿势删除
10 print(info)
11 info.popitem() #随机删除
12 print(info)
View Code
查找:
info = {
'stu1101': "TengLan Wu",
'stu1102': "LongZe Luola",
'stu1103': "XiaoZe Maliya",
}
#查找:
"stu1102" in info #标准用法
info.get("stu1102") # 获取
info["stu1102"] #获取,如果一个key不存在,就报错,get不会,不存在只返回None
View Code
多级字典嵌套及操作:
1 av_catalog = {
2 "欧美":{
3 "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
4 "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
5 "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
6 "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
7 },
8 "日韩":{
9 "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
10 },
11 "大陆":{
12 "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
13 }
14 }
15
16 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来"
17 print(av_catalog["大陆"]["1024"])
View Code
其它操作:
1 info = {
2 'stu1101': "TengLan Wu",
3 'stu1102': "LongZe Luola",
4 'stu1103': "XiaoZe Maliya",
5 }
6 #获取字典的键
7 print(info.keys())
8 #获取字典的值
9 print(info.values())
10 #setdefault(key,value)没有对应的键,就添加,否则保持原来的!
11 info.setdefault("stu1106","Alex")
12 print(info)
13 info.setdefault("stu1102","龙泽萝拉")
14 print(info)
15 b = {1: 2, 3: 4, "stu1102": "龙泽萝拉"}
16 #update方法是:没有对应的键就添加,有对应的键就修改
17 info.update(b)
18 print(info)
19 #info.items()会将字典的值以元组列表的形式返回
20 print(info.items())
21
22 #通过一个列表生成默认dict,少用吧这个
23 data = dict.fromkeys([1,2,3],'testd')
24 print(data)
View Code
循环遍历:
1 info = {
2 'stu1101': "TengLan Wu",
3 'stu1102': "LongZe Luola",
4 'stu1103': "XiaoZe Maliya",
5 }
6 #方法1
7 for key in info:
8 print(key,info[key])
9
10 #方法2
11 for k,v in info.items(): #会先把dict转成list,数据里大时莫用
12 print(k,v)
View Code
判断一个键是否在字典中用in或not in,例如:
if “name” in students:print(students["name"])
"age" not in students:print("不存在age")
需要注意的是:字典中不允许使用+,*进行拼接或重复操作!
字典中的方法:
注意:上面的fromkeys()方法的格式是有问题的,正确的格式如下:
dict.fromkeys(seq[, value]))
参数
- seq -- 字典键值列表。
- value -- 可选参数, 设置键序列(seq)的值。
返回值
该方法返回列表。
代码演示:
seq = ('name', 'age', 'sex')
dict = dict.fromkeys(seq)
print("New Dictionary : %s" % str(dict))
dict = dict.fromkeys(seq, 10)
print("New Dictionary : %s" % str(dict)
View Code
程序练习
程序: 三级菜单
要求:
- 打印省、市、县三级菜单
- 可返回上一级
- 可随时退出程序
1 menu = {
2 '北京':{
3 '海淀':{
4 '五道口':{
5 'soho':{},
6 '网易':{},
7 'google':{}
8 },
9 '中关村':{
10 '爱奇艺':{},
11 '汽车之家':{},
12 'youku':{},
13 },
14 '上地':{
15 '百度':{},
16 },
17 },
18 '昌平':{
19 '沙河':{
20 '老男孩':{},
21 '北航':{},
22 },
23 '天通苑':{},
24 '回龙观':{},
25 },
26 '朝阳':{},
27 '东城':{},
28 },
29 '上海':{
30 '闵行':{
31 "人民广场":{
32 '炸鸡店':{}
33 }
34 },
35 '闸北':{
36 '火车战':{
37 '携程':{}
38 }
39 },
40 '浦东':{},
41 },
42 '山东':{},
43 }
44
45
46 exit_flag = False
47 current_layer = menu
48
49 layers = [menu]
50
51 while not exit_flag:
52 for k in current_layer:
53 print(k)
54 choice = input(">>:").strip()
55 if choice == "b":
56 current_layer = layers[-1]
57 #print("change to laster", current_layer)
58 layers.pop()
59 elif choice not in current_layer:continue
60 else:
61 layers.append(current_layer)
62 current_layer = current_layer[choice]
三级菜单文艺青年版
叨叨+作业:
为什么会查询速度会快呢?因为他是hash类型的,那什么是hash呢?
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法
dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。
上面依然没回答这样做查找一个数据为什么会比列表快,对不对? 呵呵,等我课上揭晓。