python 官方文档-入门教程–20191209
5 数据结构
5.3 元组和序列
列表和字符串有很多的共同特性,例如索引和切片,是序列数据类型
元组也是
元组和列表看起来很像,但它们通常是在不同的场景被使用,有着不同的用途,
元组是不可变的,其序列通常包含不同种类的元素,并且通过解包或者索引来访问,
列表是可变的,并且列表中的元素一般是同种类型的,并且通过迭代访问。
一个特殊的问题是构造包含0个或1个元素的元组:为了适应这种情况,语法有一些额外的改变。空元组可以直接被一对空圆括号创建,含有一个元素的元组可以通过在这个元素后添加一个逗号来构建(圆括号里只有一个值的话不够明确)。丑陋,但是有效。
# 元组
t = (12345,54321,'hello')
print(t)
u = (t,(1,2,3))
print(u)
x,y,z = t
print(x)
print(y)
print(z)
运行结果:
(12345, 54321, 'hello')
((12345, 54321, 'hello'), (1, 2, 3))
12345
54321
hello
语句 t = 12345, 54321, ‘hello!’ 是 元组打包 个例子:值 12345, 54321 和 ‘hello!’ 被打包进元组。其逆操作也是允许的
的一这被称为 序列解包 也是很恰当的,因为解包操作的等号右侧可以是任何序列。
序列解包要求等号左侧的变量数与右侧序列里所含的元素数相同。
注意可变参数其实也只是元组打包和序列解包的组合。
5.4 集合
集合是由不重复元素组成的无序的集。
基本用法包括 成员检测和消除重复元素。
集合对象也支持 交集,差集等数学运算。
# 集合
basket = {'apple','orange','apple','pear','orange','banana'}
print(basket)
print('orange' in basket)
print('orange' not in basket)
a = set('abracadabra')
print(a)
b = set('alacazam')
print(b)
print(a-b) # 差集
print(a|b) # 并集
print(a&b) # 交集
print(a^b) # 只在a,或则只在b
# 集合也支持列表推导式
a = {x for x in 'abracadabra' if x not in 'abc'}
print(a)
运行结果:
{'banana', 'apple', 'orange', 'pear'}
True
False
{'c', 'r', 'b', 'd', 'a'}
{'c', 'l', 'm', 'z', 'a'}
{'b', 'd', 'r'}
{'c', 'l', 'b', 'r', 'm', 'z', 'd', 'a'}
{'c', 'a'}
{'m', 'r', 'b', 'z', 'l', 'd'}
{'d', 'r'}
5.5 字典
字典创建的几种方式
# 字典
tel = {'jack': 4098, 'sape': 4139}
tel['guio'] = 4127
print(tel)
print(list(tel))
print(sorted(tel))
tel1 = dict([('sapce',4139),('gudio',4127)]) # dict函数创建字典
print(tel1)
# 字典推导式创建字典
tel3 = {x:x**2 for x in (2,4,6)}
print(tel3)
运行结果:
{'jack': 4098, 'sape': 4139, 'guio': 4127}
['jack', 'sape', 'guio']
['guio', 'jack', 'sape']
{'sapce': 4139, 'gudio': 4127}
{2: 4, 4: 16, 6: 36}
5.6循环的技巧
在字典中循环时,可以item()方法将关键字和键值同时取出
在序列中循环时,用enumerate()函数可以将索引位置和其对应的值同时取出
当同时在两个或跟多序列中循环时,可以用zip()函数将其元素一一匹配
如果要按某个指定顺序循环一个序列,可以用 sorted() 函数,它可以在不改动原序列的基础上返回一个新的排好序的序列
有时可能会想在循环时修改列表内容,一般来说改为创建一个新列表是比较简单且安全的
# 循环的技巧
#1.字典的items()
for k,v in tel1.items():
print(k,v)
# enumerate()函数可以将索引位置和其对应的值同时取出
for i ,v in enumerate(['tic','tac','toe']):
print(i,v)
# 逆向循环时,先正向定位序列,然后调用reversed()函数
for i in reversed(range(1,10,2)):
print(i)
# zip()函数将其内元素一一匹配,当同时在两个或更多序列中循环时
questions = ['name','quest','favorite color']
answers = ['lancelot','the holy grail','blue']
for q,a in zip(questions,answers):
print('What"s is your {0}?it is {1}'.format(q,a))
# sorted函数在不改变原序列的基础上返回一个新的排好序的序列
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
for f in sorted(set(basket)):
print(f,end =' ')
运行结果:
sapce 4139
gudio 4127
0 tic
1 tac
2 toe
9
7
5
3
1
What"s is your name?it is lancelot
What"s is your quest?it is the holy grail
What"s is your favorite color?it is blue
apple banana orange pear
5.7深入条件控制
while 和if 条件句中可以任意擦欧总
比较操作可以传递。例如 a < b == c 会校验是否 a 小于 b 并且 b 等于 c。
比较操作可以通过布尔运算符 and 和 or 来组合,并且比较操作(或其他任何布尔运算)的结果都可以用 not 来取反。这些操作符的优先级低于比较操作符;在它们之中,not 优先级最高, or 优先级最低,因此 A and not B or C 等价于 (A and (not B)) or C。和之前一样,你也可以在这种式子里使用圆括号。
布尔运算符 and 和 or 也被称为 短路 运算符:它们的参数从左至右解析,一旦可以确定结果解析就会停止。例如,如果 A 和 C 为真而 B 为假,那么 A and B and C 不会解析 C。当作用于普通值而非布尔值时,短路操作符的返回值通常是最后一个变量。
也可以把比较操作或者逻辑表达式的结果赋值给一个变量,
序列对象通常可以与相同序列类型的其他对象比较。 这种比较使用 字典式 顺序:首先比较开头的两个对应元素,如果两者不相等则比较结果就由此确定;如果两者相等则比较之后的两个元素,以此类推,直到有一个序列被耗尽。 如果要比较的两个元素本身又是相同类型的序列,则会递归地执行字典式顺序比较。 如果两个序列中所有的对应元素都相等,则两个序列也将被视为相等。 如果一个序列是另一个的初始子序列,则较短的序列就被视为较小(较少)。 对于字符串来说,字典式顺序是使用 Unicode 码位序号对单个字符排序。