Lists
Python中的列表表示有序的值。 可以使用方括号来定义,变量值之间用逗号隔开。 例如,这是几个素数的列表:
[1]
primes = [2, 3, 5, 7]
我们可以将其他类型的东西放在列表中:
[2]
planets = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
还可以包含列表:
[3]
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']]
列表还可以包含不同的数据类型:
[4]
my_favourite_things = [32, 'raindrops on roses', help]
# (Yes, Python's help function is *definitely* one of my favourite things)
Indexing
我们可以通过索引访问各个列表元素。
哪个星球最接近太阳? Python的索引从零开始,因此第一个元素的索引为0。
[5]
planets[0]'Mercury'
下一个最近的星球是?
[6]
planets[1]'Venus'
哪个是离太阳最远的星球?
列表末尾的元素可以使用负数访问,从-1开始:
[7]
planets[-1]'Neptune'
[8]
planets[-2]'Uranus'
Slicing
前三个星球是哪些?我们他可以通过切片来回答:
[9]
planets[0:3]
['Mercury', 'Venus', 'Earth']
planets[0:3]是我们向Python访问列表从索引0到索引2(不包含3)星球的方式。
起始和结束索引值是可选的。 如果我省略了起始索引,则假设为0.所以我可以将上面的表达式重写为:
[10]
planets[:3]['Mercury', 'Venus', 'Earth']
如果你省略结束索引值,Python认为是访问整个列表的长度。
[11]
planets[3:]['Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
上面表达式含义是:给我从索引3开始的所有星球。
我们也可以用负数索引来切片
[12]
# All the planets except the first and last
planets[1:-1]['Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus']
[13]
# The last 3 planets
planets[-3:]['Saturn', 'Uranus', 'Neptune']
Mutating lists
列表是可变的,意思是她们可以按位置修改。
修改列表的一种方法是赋值索引或切片表达式。
例如,假设我们要重命名Mars:
[14]
planets[3] = 'Malacandra'
planets
['Mercury','Venus','Earth','Malacandra','Jupiter','Saturn','Uranus','Neptune']
让我们通过缩短前3个行星的名称来弥补。
[15]
planets[:3] = ['Mur', 'Vee', 'Ur']
print(planets)
# (Okay, that was rather silly. Let's give them back their old names)
planets[:4] = ['Mercury', 'Venus', 'Earth', 'Mars',]['Mur', 'Vee', 'Ur', 'Malacandra', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
List functions
Python含有一些内置的处理列表的函数。
len()函数可求列表的长度
[16]
# How many planets are there?
len(planets)8
sorted()函数可以对列表进行排序:
[17]
# The planets sorted in alphabetical order
sorted(planets)['Earth', 'Jupiter', 'Mars', 'Mercury', 'Neptune', 'Saturn', 'Uranus', 'Venus']
sum()函数可以对列表进行求和
[18]
primes = [2, 3, 5, 7]
sum(primes)17
我们之前已经使用过min和max求出最小值和最大值,我们也可以传递单个列表参数。
[19]
max(primes)7
Interlude: objects
到目前为止,我一直还未介绍“对象”一词, 你甚至可能还记得我声称Python中的所有内容都是一个对象。 但这究竟意味着什么呢?
简而言之,对象带有一些东西。 我们可以使用Python的语法访问这些东西(点语法)。
例如,Python中的数字带有一个名为imag的关联变量,代表它们的虚部。 (你可能永远不需要使用它,除非你做了一些非常奇怪的数学运算。)
[20]
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)0
3.0
对象携带的东西也可以包括函数。 附加到对象的函数称为方法。 (附加到对象的非函数事物,如imag,称为属性)。
例如,数字有一个名为bit_length的方法。 我们再次使用点语法访问它:
[21]
x.bit_length<function int.bit_length>
正确调用我们可以添加参数:
[22]
x.bit_length()4
像我们可以传递函数到hel()函数中,我们也可以传递方法:
[23]
help(x.bit_length)Help on built-in function bit_length:bit_length(...) method of builtins.int instanceint.bit_length() -> intNumber of bits necessary to represent self in binary.>>> bin(37)'0b100101'>>> (37).bit_length()6
上面的例子非常模糊。 到目前为止,我们所看到的任何类型的对象(数字,函数,布尔值)都没有您可能会使用的属性或方法。
但事实证明,列表有几种方法可供您随时使用。
List methods
list.append可以修改列表,通过在末尾添加一个元素
[24]
# Pluto is a planet darn it!
planets.append('Pluto')
为什么上面的单元格没有输出? 让我们通过调用help(planets.append)来检查文档。
注:append是一个由列表类型的所有对象自带的方法,所以我们也可以调用help(list.append)。 但是,如果我们尝试调用help(append),Python会抱怨没有名为“append”的变量。 “append”名称仅存在于列表中 - 它不作为内置函数(如max或len)的独立名称存在。
[25]
help(planets.append)Help on built-in function append:append(...) method of builtins.list instanceL.append(object) -> None -- append object to end
- >None 告诉我们list.append不返回任何内容。 但是如果我们检查行星的值,我们可以看到方法调用修改了行星的值:
[26]
planets['Mercury','Venus','Earth','Mars','Jupiter','Saturn','Uranus','Neptune','Pluto']
list.pop移除并返回列表最后一个元素的值:
[27]
planets.pop()'Pluto'
[28]
planets['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
Searching lists
Earth在列表中的位置在哪里?我们可以使用list.index方法得到它的索引。
[29]
planets.index('Earth')2
它排在第三位(列表索引从0开始)。
Pluto在哪里呢?
[30]
planets.index('Pluto')---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-30-8e9d439d9276> in <module>()
----> 1 planets.index('Pluto')ValueError: 'Pluto' is not in list
哦,那是对的......
为了避免这样的令人不快的意外,我们可以使用in运算符来确定列表是否包含特定值:
[31]
# Is Earth a planet?
"Earth" in planetsTrue
[32]
# Is Calbefraques a planet?
"Calbefraques" in planetsFalse
我们还没有涉及一些更有趣的列表方法。 如果您想了解附加到特定对象的所有方法和属性,我们可以在对象本身上调用help()。 例如,help(planets)将告诉我们所有列表方法:
[33]
help(planets)
列表有很多方法,有着奇怪的名字,比如__eq__和__iadd__。 现在不要太担心这些。 (你可能永远不会直接调用这些方法。但是当我们使用像索引或比较运算符这样的语法时,它们会在幕后被调用。)最有趣的方法是在列表的底部(append,clear,copy等)。
Tuples
元组几乎与列表完全相同。 它们只有两种不同。
1:创建它们使用括号(可选)而不是方括号
[34]
t = (1, 2, 3)
[35]
t = 1, 2, 3 # equivalent to above
t(1, 2, 3)
2:元组不能修改
[36]
[0] = 100---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-36-155b9e8fb284> in <module>()
----> 1 t[0] = 100TypeError: 'tuple' object does not support item assignment
元组通常用于具有多个返回值的函数。
例如,float对象的as_integer_ratio()方法以元组的形式返回分子和分母:
[37]
x = 0.125
x.as_integer_ratio()(1, 8)
这些多个返回值可以单独分配,如下所示:
[38]
numerator, denominator = x.as_integer_ratio()
print(numerator / denominator)0.125
最后,我们对用于交换两个变量的经典Stupid Python Trick™有了一些了解!
[39]
a = 1
b = 0
a, b = b, a
print(a, b)0 1
跳转到练习笔记本,以得到一些关于列表和元祖的练习。