用下标取得列表中的单个值
负数下标
利用切片取得子列表
用 len()取得列表的长度
len()函数将返回传递给它的列表中值的个数,就像它能计算字符串中字符的个数一样。
用下标改变列表中的值
列表连接和列表复制
用 del 语句从列表中删除值
使用列表
catNames = []#给变量名一个空列表
while True:#while循环在前面的循环中使用range(len(supplies))很方便,这是因为,循环中的代码可以访问下标(通过变量i),以及下标处的值(通过
supplies[i])。最妙的是,range(len(supplies))将迭代 supplies 的所有下标,无论它包含多少表项。
in 和 not in 操作符
利用 in 和 not in 操作符,可以确定一个值否在列表中。像其他操作符一样,in和 not in 用在表达式中,连接两个值:一个要在列表中查找的值,以及待查找的列表。
变量的数目和列表的长度必须严格相等,否则会报出ValueError
增强复制操作符如下表格
+=操作符也可以完成字符串和列表的连接,*=操作符可以完成字符串和列表的复制。在交互式环境中输入以下代码:
列表值有一个 index()方法,可以传入一个值,如果该值存在于列表中,就返回它的下标。如果该值不在列表中,Python 就报ValueError。如果列表中存在重复的值,就返回它第一次出现的下标。
注意:append()和 insert()方法是列表方法,只能在列表上调用,不能在其他值上调用
试图删除不存在的值,将报ValueError错误。
如果该值在列表中出现多次,只有第一次出现的值会被删除。
如果知道想要删除的值在列表中的下标,del 语句就很好用。如果知道想要从列表中删除的值,remove()方法就很好用。
数值的列表或字符串的列表,能用 sort()方法排序。
也可以逆序排列
注意:
如果需要按照普通的字典顺序来排序,就在 sort()方法调用时,将关键字参数key 设置为 str.lower。
这将导致 sort()方法将列表中所有的表项当成小写,但实际上并不会改变它们在列表中的值。
import random
messages = ['It is certain',
'It is decidedly so',
'Yes definitely',
'Reply hazy try again',
'Ask again later',
'Concentrate and ask again',
'My reply is no',
'Outlook not so good',
'Very doubtful']
print(messages[random.randint(0, len(messages) - 1)])
其中random.randint(0, len(messages) - 1)是在0到len(messages)-1 中产生一个随机数
要理解参数如何传递给函数,引用就特别重要。当函数被调用时,参数的值被复制给变元。对于列表(以及字典,我将在下一章中讨论),这意味着变元得到的是引用的拷贝。
请注意,当 eggs()被调用时,没有使用返回值来为 spam 赋新值。相反,它直接当场修改了该列表。
copy 模块的 copy()和 deepcopy()函数
在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,你可能不希望这些变动影响原来的列表或字典。要做到这一点,Python 提供了名为 copy 的模块,其中包含 copy()和 deepcopy()函数。第一个函数copy.copy(),可以用来复制列表或字典这样的可变值,而不只是复制引用。
列表是有用的数据类型,因为它们让你写代码处理一组可以修改的值,同时仅用一个变量。在本书后面的章节中,你会看到一些程序利用列表来完成工作。没有列表,这些工作很困难,甚至不可能完成。
列表是可变的,这意味着它们的内容可以改变。元组和字符串虽然在某些方面像列表,却是不可变的,不能被修改。包含一个元组或字符串的变量,可以被一个新的元组或字符串覆写,但这和现场修改原来的值不是一回事,不像 append()和remove()方法在列表上的效果。
变量不直接保存列表值,它们保存对列表的“引用”。在复制变量或将列表作为函数调用的参数时,这一点很重要。因为被复制的只是列表引用,所以要注意,对该列表的所有改动都可能影响到程序中的其他变量。如果需要对一个变量中的列
修改,同时不修改原来的列表,就可以用 copy()或 deepcopy()。
练习题
1.什么是[]?
答:就是[ ]里面不包含任何值
2.如何将'hello'赋给列表的第三个值,而列表保存在名为 spam 的变量中?(假定变量包含[2, 4, 6, 8, 10])。
答:
对接下来的 3 个问题,假定 spam 包含列表['a', 'b', 'c', 'd']。3.spam[int('3' * 2) / 11]求值为多少?
答:'d'
4.spam[-1]求值为多少?
答:'d'
5.spam[:2]求值为多少?
答:['a','b']
对接下来的 3 个问题。假定 bacon 包含列表[3.14, 'cat', 11, 'cat', True]。6.bacon.index('cat')求值为多少?
答:1
7.bacon.append(99)让 bacon 中的列表值变成什么样?
答:[3.14, 'cat', 11, 'cat', True, 99]
8.bacon.remove('cat')让 bacon 中的列表时变成什么样
答:[3.14, 11, 'cat', True]
9.列表连接和复制的操作符是什么?
答:连接 :‘+’ 复制:‘*’
10.append()和 insert()列表方法之间的区别是什么?
答:append()添加到列表的末尾处,sort()进行对应位置的添加
11.从列表中删除值有哪两种方法?
答:remove()移除已知的字符, del()移除知道位置不知字符的值
12.请说出列表值和字符串的几点相似之处。
答:列表和字符串都可以传入len(),都有下标和切片,用于for循环,连接或复制,并与in和not in操作符一起使用。
13.列表和元组之间的区别是什么?
答:列表是可以修改的,它们可以添加值、删除值和修改值。元组是不可修改的,它们根本不能改变。而且,元组使用的是括号,而列表使用的是方括号[]。
14.如果元组中只有一个整数值 42,如何输入该元组?
答:spam=(42,) 末尾的逗号是必须的。
15.如何从列表值得到元组形式?如何从元组值得到列表形式?
答:touple() 和list()
16.“包含”列表的变量,实际上并未真地直接包含列表。它们包含的是什么?
答: 它们包含对列表值得引用。
17.copy.copy()和 copy.deepcopy()之间的区别是什么?
答:copy.copy()函数将浅拷贝列表,而copy.deepcopy()函数将深拷贝列表。也就是说,只有copy.deepcopy()会复制列表内的所有列表。