Space Cowboy

生死去来 棚头傀儡 一线断时 落落磊磊

0%

从列表推导开始


Python 有一种被称为 列表推导 的特性,它可以用来快速的构建列表(list)。下面是一个简单的例子:

1
2
l = [1, 2, 3]
[str(i) for i in l] # ['1', '2', '3']

这个概念叫做推导式。它的作用是以一个数据序列为基础,来构建另一个新的数据序列。

在 Python 中,除了列表推导,你还可以使用 字典(dict)推导集合(set)推导 。下面是一些示例:

1
2
3
4
5
6
7
names = ['Dutch', 'Hosea', 'Arthur', 'John']
suits = ['Spade', 'Heart', 'Diamond', 'Club']

[(name, suit) for name in names for suit in suits]

[(name, suit) for name, suit in zip(names, suits)]
# [('Dutch', 'Spade'), ('Hosea', 'Heart'), ('Arthur', 'Diamond'), ('John', 'Club')]

第一种列表推导,会使用 names 中的每一个元素去依次和 suits 中的每一个元素相对应。因为产出元素过多,所以就不详细写出了。

第二种列表推导使用了 zip 函数。这个函数接收可迭代对象为参数,将对象中对应的元素打包成元组。如果你期望从多个数据序列中一一对应的构造新数据序列时,你将会经常的用到这个函数。

1
2
[(name, suit) for name in names for suit in suits if name == 'Arthur']
# [('Arthur', 'Spade'), ('Arthur', 'Heart'), ('Arthur', 'Diamond'), ('Arthur', 'Club')]

上面这个例子是在列表推导中使用了 if 语句。这样可以在构建列表前根据需要,剔除部分数据。

你也可以将这个例子改写为使用高阶函数来实现,但可读性绝壁比不上列表推导。

阅读全文 »

变量与变量的作用域


计算机语言中的变量(Variable)这一概念来源于数学,它是一个存储地址的映射。这个存储地址中通常包含了一段数据或一些抽象信息。你可以使用变量名来方便的引用存储值。

提到变量,就不得不提到 作用域 这个概念了。

实际上,作用域指的是一段计算机程序。在这段程序代码中,变量名与存储地址的映射关系一直保持有效。换句话说,作用域决定了当前程序是否能够访问到某个变量的值。

作用域的解析规则在不同的编程语言中都可能不相同。

作用域分为 静态作用域动态作用域 。前者也叫做 词法作用域 。下面分析一下这两种作用域的区别。

阅读全文 »