跳转至

4. 变量和集合#

print 是内置的打印函数

print("I'm Python. Nice to meet you!")

默认情况下,print 函数会在输出结果后加入一个空行作为结尾,可以使用附加参数改变输出结尾。

# => Hello, World!
print("Hello, World", end="!")

可以很简单的从终端获得输入数据

# 返回字符串数值
input_string_var = input("Enter some data: ")

在给变量赋值前不用提前声明,习惯上变量命名是纯小写,用下划线分隔单词。

some_var = 5
# => 5
some_var

访问未赋值的变量会抛出异常,参考流程控制一段来学习异常处理。

# 抛出 NameError
some_unknown_var

“if” 可以用作表达式,它的作用等同于 C 语言的三元运算符 “?:”

# => "nay!"
"yay!" if 0 > 1 else "nay!"

列表#

用列表 (list) 储存序列

li = []

创建列表时也可以同时赋给元素

other_li = [4, 5, 6]

用 append 在列表最后追加元素

# li现在是[1]
li.append(1)
# li现在是[1, 2]
li.append(2)
# li现在是[1, 2, 4]
li.append(4)
# li现在是[1, 2, 4, 3]
li.append(3)

用 pop 从列表尾部删除

# => 3 且li现在是[1, 2, 4]
li.pop()

把 3 再放回去

# li变回[1, 2, 4, 3]
li.append(3)

列表存取和数组一样

# => 1
li[0]

取出最后一个元素

# => 3
li[-1]

越界存取会造成 IndexError

# 抛出 IndexError
li[4]

列表有切割语法

# => [2, 4]
li[1:3]

取尾

# => [4, 3]
li[2:]

取头

# => [1, 2, 4]
li[:3]

隔一个取一个

# => [1, 4]
li[::2]

倒排列表

# => [3, 4, 2, 1]
li[::-1]

可以用三个参数的任何组合来构建切割,li[始:终:步伐] 简单的实现了单层数组的深度复制。

# => li2 = [1, 2, 4, 3] ,但 (li2 is li) 会返回 False
li2 = li[:]

用 del 删除任何一个元素

# li 现在为 [1, 2, 3]
del li[2]

删除第一个匹配的元素

# li 现在为 [1, 3]
li.remove(2)
# 抛出错误 ValueError: 2 is not in the list
li.remove(2)

在指定索引处插入一个新的元素

# li is now [1, 2, 3] again
li.insert(1, 2)

获得列表第一个匹配的值的索引

# => 1
li.index(2)
# 抛出一个 ValueError: 4 is not in the list
li.index(4)

列表可以相加,注意:li 和 other_li 的值都不变。

# => [1, 2, 3, 4, 5, 6]
li + other_li

用 “extend()” 拼接列表

# li 现在是[1, 2, 3, 4, 5, 6]
li.extend(other_li)

用 “in” 测试列表是否包含某个值

# => True
1 in li

用 “len()” 取列表长度

# => 6
len(li)

元组#

元组类似列表,但是不允许修改。

tup = (1, 2, 3)
# => 1
tup[0]
# 抛出 TypeError
tup[0] = 3

如果元素数量为 1 的元组必须在元素之后加一个逗号,其他元素数量的元组,包括空元组,都不需要。

# => <class 'int'>
type((1))
# => <class 'tuple'>
type((1,))
# => <class 'tuple'>
type(())

列表允许的操作元组大多都可以

# => 3
len(tup)
# => (1, 2, 3, 4, 5, 6)
tup + (4, 5, 6)
# => (1, 2)
tup[:2]
# => True
2 in tup

可以把元组和列表解包,赋值给变量

# 现在 a 是 1,b 是 2,c 是 3
a, b, c = (1, 2, 3)

也可以做扩展解包

# 现在 a 是 1, b 是 [2, 3], c 是 4
a, *b, c = (1, 2, 3, 4)

元组周围的括号是可以省略的

# 元组 4, 5, 6 通过解包被赋值给变量 d, e, f
d, e, f = 4, 5, 6

交换两个变量的值

# 现在 d 是 5,e 是 4
e, d = d, e

字典#

字典用来存储 key 到 value 的映射关系

empty_dict = {}

初始化字典

filled_dict = {"one": 1, "two": 2, "three": 3}

字典的 key 必须为不可变类型,这是为了确保 key 被转换为唯一的哈希值以用于快速查询。不可变类型包括整数、浮点、字符串、元组。

# => 抛出 TypeError: unhashable type: 'list'
invalid_dict = {[1,2,3]: "123"}
# 然而 value 可以是任何类型
valid_dict = {(1,2,3):[1,2,3]}

用 [] 取值

# => 1
filled_dict["one"]

用 keys 获得所有的键,因为 keys 返回一个可迭代对象,所以需要把它包在 “list()” 里才能转换为列表。 注意:对于版本 < 3.7 的 python, 字典的 key 的排序是无序的,你的运行结果可能与下面的例子不符,但是在 3.7 版本,字典中的项会按照他们被插入到字典的顺序进行排序。

# => ["three", "two", "one"] Python 版本 <3.7
list(filled_dict.keys())
# => ["one", "two", "three"] Python 版本 3.7+
list(filled_dict.keys())

用 “values()” 获得所有的值,跟 keys 一样也是可迭代对象,要使用 “list()” 才能转换为列表。 注意:排序顺序和 keys 的情况相同。

# => [3, 2, 1] Python 版本 < 3.7
list(filled_dict.values())
# => [1, 2, 3] Python 版本 3.7+
list(filled_dict.values())

用 in 测试一个字典是否包含一个键

# => True
"one" in filled_dict
# => False
1 in filled_dict

访问不存在的键会导致 KeyError

# KeyError
filled_dict["four"]

用 “get()” 来避免 KeyError

# => 1
filled_dict.get("one")
# => None
filled_dict.get("four")

当键不存在的时候 “get()” 方法可以返回默认值

# => 1
filled_dict.get("one", 4)
# => 4
filled_dict.get("four", 4)

“setdefault()” 方法只有当键不存在的时候插入新值

# filled_dict["five"] 设为5
filled_dict.setdefault("five", 5)
# filled_dict["five"] 还是5
filled_dict.setdefault("five", 6)

字典赋值

# => {"one": 1, "two": 2, "three": 3, "four": 4}
filled_dict.update({"four":4})
# 另一种赋值方法
filled_dict["four"] = 4

用 del 删除项

# 从 filled_dict 中把 one 删除
del filled_dict["one"]

集合#

用 set 表达集合

empty_set = set()

初始化一个集合,语法跟字典相似。

# some_set 现在是 {1, 2, 3, 4}
some_set = {1, 1, 2, 2, 3, 4}

类似字典的 keys,set 的元素也必须是不可变类型。

# => Raises a TypeError: unhashable type: 'list'
invalid_set = {[1], 1}
valid_set = {(1,), 1}

可以把集合赋值于变量

filled_set = some_set

为集合添加元素

# filled_set 现在是 {1, 2, 3, 4, 5}
filled_set.add(5)

set 没有重复的元素

# filled_set 依然是 {1, 2, 3, 4, 5}
filled_set.add(5)

用 “&” 取交集

other_set = {3, 4, 5, 6}
# => {3, 4, 5}
filled_set & other_set

用 “|” 取并集

# => {1, 2, 3, 4, 5, 6}
filled_set | other_set

用 “-” 取补集

# => {1, 4}
{1, 2, 3, 4} - {2, 3, 5}

用 “^” 取异或集(对称差)

# => {1, 4, 5}
{1, 2, 3, 4} ^ {2, 3, 5}

判断左边的集合是否是右边集合的超集

# => False
{1, 2} >= {1, 2, 3}

判断左边的集合是否是右边集合的子集

# => True
{1, 2} <= {1, 2, 3}

in 测试集合是否包含某元素

# => True
2 in filled_set
# => False
10 in filled_set

单层集合的深度复制

# filled_set 是 {1, 2, 3, 4, 5}
filled_set = some_set.copy()
# => False
filled_set is some_set