列表和你可以用它们做的事:包括索引、切片和对象变动 (变异-Mutation) 。
列表
在Python中,列表表示有序的值序列。以下是如何创建列表的示例:
primes = [2, 3, 5, 7]
我们可以将其他类型的元素放在列表中:
planets = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
我们甚至可以创建一个列表的列表:
hands = [
['J', 'Q', 'K'],
['2', '2', '2'],
['6', 'A', 'K'], # (Comma after the last element is optional)
]
# (I could also have written this on one line, but it can get hard to read)
hands = [['J', 'Q', 'K'], ['2', '2', '2'], ['6', 'A', 'K']]
一个列表可以包含不同类型的变量的混合。
my_favourite_things = [32, 'raindrops on roses', help]
# (Yes, Python's help function is *definitely* one of my favourite things)
索引
您可以使用方括号访问单个列表元素。
离太阳最近的行星是哪个?Python使用零-based索引,因此第一个元素的索引为0。
planets[0]
下一个离地球最近的行星是什么?
planets[1]
哪个行星离太阳最远?
列表末尾的元素可以使用负数访问,从-1开始:
planets[-1]
planets[-2]
切片
什么是前三个行星?我们可以使用切片来回答这个问题:
planets[0:3]
planets[:3]表示我们要求取planets列表中从索引0开始,但不包括索引3的元素。
起始索引和结束索引都是可选的。如果省略起始索引,则默认为0。所以我可以将上面的表达式重写为:
planets[:3]
如果我省略了结束索引,那么就是假定它(我省略的结束索引)是列表的长度。
planets[3:]
即上述表达意为“从索引3开始,给我所有的行星”。
当进行切片时,我们也可以使用负数索引。
# All the planets except the first and last
planets[1:-1]
# The last 3 planets
planets[-3:]
更改列表
列表是“可变的”,这意味着它们可以被“原地”修改。
修改列表的一种方法是将其赋值给一个索引或切片表达式。
例如,假设我们想将火星重命名为:
planets[3] = 'Malacandra'
planets
嗯,那确实是个够长的名字。我们通过缩短前三个行星的名字来弥补吧。
planets[:3] = ['Mur', 'Vee', 'Ur']
print(planets)
# That was silly. Let's give them back their old names
planets[:4] = ['Mercury', 'Venus', 'Earth', 'Mars',]
列表函数
Python有几个用于处理列表的有用函数。
len函数返回列表的长度:
# How many planets are there?
len(planets)
sorted函数返回一个已排序的列表版本:
# The planets sorted in alphabetical order
sorted(planets)
sum 做的事情符合你的预期:
primes = [2, 3, 5, 7]
sum(primes)
我们之前使用min和max函数来获取几个参数中的最小值或最大值。但是我们也可以传入一个单独的列表参数。
小插曲:对象
到目前为止,我已经经常使用术语“对象” - 你可能甚至已经读到了在Python中一切都是对象。那是什么意思呢?
简而言之,对象携带一些东西。你使用Python的点语法来访问这些东西。
例如,在Python中,数字携带了一个关联的变量叫做imag表示它们的虚部。(除非你在进行一些非常奇怪的数学运算,否则你可能永远不会需要使用它。)
x = 12
# x is a real number, so its imaginary part is 0.
print(x.imag)
# Here's how to make a complex number, in case you've ever been curious:
c = 12 + 3j
print(c.imag)
注:imaginary 的含义是“虚部”的意思。
一个对象携带的东西也可以包括函数。附加到对象的函数叫做方法。(附加到对象的非函数的东西,比如imag,叫做属性)。
举个例子,数字有一个叫做bit_length的方法。同样,我们使用“点”语法来访问它:
x.bit_length
为了真正地调用它,我们需要加上括号:
x.bit_length()
另外:如果你已经在做练习了,你实际上已经在调用方法了。在练习笔记本中,q1、q2、q3等都是具有名为check、hint和solution的方法的对象。
就像我们可以将函数传递给help函数一样(例如,help(max)),我们也可以传递方法:
help(x.bit_length)
上面的例子非常难懂。迄今为止,我们看过的对象类型(数字、函数、布尔值)都没有你可能会用到的属性或方法。
但事实证明,列表有几种你将经常使用的方法。
列表方法
list.append通过在末尾添加一个项来修改列表:
# Pluto is a planet darn it!
planets.append('Pluto')
为什么上面的单元格没有输出?让我们通过调用help(planets.append)来查看文档。
另外:append是所有类型为list的对象都具有的方法,不仅限于planets,所以我们也可以调用help(list.append)。然而,如果我们尝试调用help(append),Python会抱怨没有名为"append"的变量存在。"append"这个名称只存在于list中,它不像内置函数max或len那样作为一个单独的名称存在。
help(planets.append)
这部分告诉我们list.append方法没有返回任何值。但是如果我们检查planets的值,我们可以看到方法调用修改了planets的值。
planets
list.pop 移除并返回列表的最后一个元素。
planets.pop()
搜索列表
地球在行星的顺序中排第几?我们可以使用列表的.index方法来获取它的索引。
planets.index('Earth')
它排第三(即索引为2,从0开始计数!)。
冥王星(Pluto)位于哪个索引?
planets.index('Pluto')
噢,没错...
为了避免这样的不愉快惊喜,我们可以使用in运算符来确定列表是否包含特定的值:
# Is Earth a planet?
"Earth" in planets
# Is Calbefraques a planet?
"Calbefraques" in planets
还有一些我们还没有涵盖的有趣的列表方法。如果你想了解与特定对象关联的所有方法和属性,我们可以在对象本身上调用help()。例如,help(planets)将告诉我们所有列表方法:
help(planets)
(这里我没有贴全,大家自己尝试看看)
列表有很多方法,它们的名字看起来很奇怪,比如__eq__和__iadd__。现在不用担心这些方法太多。 (你可能永远不会直接调用这些方法。但是当我们使用索引或比较运算符的语法时,它们会在后台被调用。)最有趣的方法在列表的底部(如append,clear,copy等)。
元组
元组和列表几乎完全相同。它们只有两个不同之处。
1:创建元组的语法使用圆括号而不是方括号。
t = (1, 2, 3)
t = 1, 2, 3 # equivalent to above
t
2:它们不能被修改(它们是不可变的)。
t[0] = 100
元组经常用于具有多个返回值的函数。
例如,float对象的as_integer_ratio()方法返回一个分子和一个分母,以元组的形式返回:
x = 0.125
x.as_integer_ratio()
可以将这些多个返回值分别赋值如下:
numerator, denominator = x.as_integer_ratio()
print(numerator / denominator)
最后,我们终于对于经典的Python的朴实的技巧™,即交换两个变量有了一些了解!
a = 1
b = 0
a, b = b, a
print(a, b)
好啦,现在轮到你啦
最好的修行是实践,最好的学习是练习,Coding一下,试试吧。