python学习之路7(列表)

列表数据类型

用下标取得列表中的单个值


负数下标

利用切片取得子列表


用 len()取得列表的长度

len()函数将返回传递给它的列表中值的个数,就像它能计算字符串中字符的个数一样。


用下标改变列表中的值

列表连接和列表复制


用 del 语句从列表中删除值


使用列表

catNames = []#给变量名一个空列表

while True:#while循环
    print('Enter the name of cat ' + str(len(catNames) + 1) +' (Or enter nothing to stop.):')
    name = input()#输入变量名
    if name == '':#如果变量名输入为空
        break#结束
    catNames = catNames + [name] # list concatenation
print('The cat names are:')#输出这些变量名
for name in catNames:#返回变量名列表
    print(' ' + name)#输出

列表用于循环


在前面的循环中使用range(len(supplies))很方便,这是因为,循环中的代码可以访问下标(通过变量i),以及下标处的值(通过

supplies[i])。最妙的是,range(len(supplies))将迭代 supplies 的所有下标,无论它包含多少表项。

in 和 not in 操作符

利用 in 和 not in 操作符,可以确定一个值否在列表中。像其他操作符一样,in和 not in 用在表达式中,连接两个值:一个要在列表中查找的值,以及待查找的列表。


多重赋值技巧


变量的数目和列表的长度必须严格相等,否则会报出ValueError


增强的赋值操作

增强复制操作符如下表格


+=操作符也可以完成字符串和列表的连接,*=操作符可以完成字符串和列表的复制。在交互式环境中输入以下代码:


用 index()方法在列表中查找值

列表值有一个 index()方法,可以传入一个值,如果该值存在于列表中,就返回它的下标。如果该值不在列表中,Python 就报ValueError。如果列表中存在重复的值,就返回它第一次出现的下标。



用 append()和 insert()方法在列表中添加值

注意:append()和 insert()方法是列表方法,只能在列表上调用,不能在其他值上调用


用 remove()方法从列表中删除值


试图删除不存在的值,将报ValueError错误。


如果该值在列表中出现多次,只有第一次出现的值会被删除。


如果知道想要删除的值在列表中的下标,del 语句就很好用。如果知道想要从列表中删除的值,remove()方法就很好用。

用 sort()方法将列表中的值排序

数值的列表或字符串的列表,能用 sort()方法排序。


也可以逆序排列


注意:

  • sort()方法当场对列表排序。
  • 不能对既有数字又有字符串值的列表排序,因为 Python 不知道如何比较它们。
  • sort()方法对字符串排序时,使用“ASCII 字符顺序”,而不是实际的字典顺序。这意味着大写字母排在小写字母之前。因此在排序时,小写的 a 在大写的Z 之后。

如果需要按照普通的字典顺序来排序,就在 sort()方法调用时,将关键字参数key 设置为 str.lower。


这将导致 sort()方法将列表中所有的表项当成小写,但实际上并不会改变它们在列表中的值。

例子程序:神奇 8 球和列表

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()会复制列表内的所有列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值