Python学习笔记_第二章:列表和元祖

1.序列中每个元素被分配一个序号-元素的位置,也成为索引。第一个索引是0,第二个是1,以此类推。
2.本章介绍的列表的操作同样适用于字符串。

序列概览

Python有6种内建的的序列:列表、元祖、字符串、Unicode字符串、buffer对象和xrange对象,本章重点介绍类表和元祖。
序列可以包含其他序列。
Python中有一种名为容器的数据结构,基本上可以说是包含其他对象的任意对象。序列和映射是两类主要的容器。集合也是一类容器。

通用序列操作

所有序列都可以进行某些特定的操作:索引,分片,加,乘,成员资格,计算序列长度,找出最大元素,找出最小元素,迭代。
迭代:依次对序列中的每个元素重复执行某些操作。

分片

分片操作的实现需要提供两个索引为边界,第一个索引元素是包含在分片内的,而第二个则不包含在分片内。

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[7 : 10]
[8, 9, 10]
>>> 

10指向的是第11个元素,但这个元素是不存在的,确实在最后一个元素之后。

访问最后三个元素的优雅捷径

>>> numbers[-3 : -1]
[8, 9]

尾部计数达不到读取最后一个元素的目的

>>> numbers[-3 : 0]
[]

0作为最后一个位置的下一个位置,也不能达到目的,事实上只要分片中最左边的索引比它右边的晚出现在序列中,结果就是一个空序列。

>>> numbers[-3 :]
[8, 9, 10]

优雅地实现了访问最后三个元素

更大的步长

关于分片:开始点的元素包括在结果之中,而结束点的元素则不再分片之内。当使用一个负数作为步长时,必须让开始点大于结束点。在没有明确指定开始点、结束点时候,正负数的使用可能会带来一些混淆。不过在这种情况下Python会进行正确的操作:对于一个正数步长,Python会从序列偷部开始提取直到尾部,对于负数的步长,则是从序列的尾部开始向左提取元素,直到头部。

序列相加

使用‘+’运算符进行序列的连接操作,两种同类型的序列才能进行连接操作。

乘法

用数字x乘以一个序列会生成新的序列,而在新的序列中,原来的序列被重复x次。

>>> num = 3 * numbers[0 : 3]
>>> num
[1, 2, 3, 1, 2, 3, 1, 2, 3]

如果想创建一个占用十个元素空间,却不包含任何内容的列表,最好的方法是:

>>> num = [None] * 10
>>> num
[None, None, None, None, None, None, None, None, None, None]

None是Python中的内建值,它的确切含义是:“这里什么都没有”

成员资格

in 预算符即成员资格运算符

>>> '$$$' in subject
>>> '$$$' in seq
True

早期的Python版本中,in只能用来检查某个(不是某几个)字符是否存在于一个字符串中,如果尝试检验多个字符组成的子串则会报错。

长度、最小值、最大值

len、min、max

列表:Python中的“苦力”

list函数

list函数试用于所有的序列,而不仅仅是字符串。
join方法是split方法的逆方法,' '.join(somelist)用于将somelist用' '分割。

基本的列表操作

1.改变列表:列表元素赋值
2.删除元素:使用del 语句实现

>>> names = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu', 'liqi']
>>> del names[1]
>>> names
['zhangsan', 'wangwu', 'zhaoliu', 'liqi']

3.分片赋值
分片赋值时,可使用与原序列不等长的序列将分片替换。可以利用“替换空白”来向序列中插入元素,通过“用空白替换”来删除序列中的元素。

列表方法

Python中函数和方法的区别

这里引用Magic_chao不负青春博客
1、函数要手动传self,方法不用传self
2、如果是一个函数,用类名去调用,如果是一个方法,用对象去调用
举例说明如下

class Foo(object):
    def __init__(self):
        self.name="haiyan"
    def func(self):
        print(self.name)

obj = Foo()
obj.func()
Foo.func(obj)

判断函数和方法的方式

from types import FunctionType,MethodType
obj = Foo()
print(isinstance(obj.func,FunctionType))  #False
print(isinstance(obj.func,MethodType))   #True   #说明这是一个方法
print(isinstance(Foo.func,FunctionType))  #True   #说明这是一个函数。
print(isinstance(Foo.func,MethodType))  #False

列表中提供的方法如下:
1.append
2.count
3.extend
append和extend的区别,举例说明:

>>> lst1 = 3 * ['1st1']
>>> lst2 = 2 * ['lst2']
>>> lst3 = lst1.append(lst2)
>>> lst3
>>> lst1
['1st1', '1st1', '1st1', ['lst2', 'lst2']]
>>> lst1.extend(lst2)
>>> lst1
['1st1', '1st1', '1st1', ['lst2', 'lst2'], 'lst2', 'lst2']

extend和连接操作的区别:extend方法修改了被扩展的序列,而原始的连接操作会返回一个空列表
4.index
5.insert
6.pop
pop默认移除列表中的最后一个元素,pop(0)会移除列表中的第一个元素,pop是唯一一个既能修改列表又返回元素值的列表方法。
用列表实现栈:pop()和append()分别可以实现出栈和入栈操作。
用列表实现队列:
1.用insert(0,...)来代替append方法表示入队,用pop()表示出队
2.用append()表示入队,用pop(0)表示出队
更好的实现方案是:使用collection模块中的deque对象。
7.remove
8.reverse
如果需要对列表进行反向迭代,可以使用reversed函数,这个函数返回一个迭代器对象,可以用list函数将其返回值转换为list
9.sort

>>> x = [1, 2, 4, 3, 6, 5]
>>> y = x[:]
>>> x
[1, 2, 4, 3, 6, 5]
>>> y.sort()
>>> y
[1, 2, 3, 4, 5, 6]

这里调用x[:],可以复制整个列表给y,如果只是简单地赋值是没用的,因为这样做就让x和y指向同一个列表了
另一种获得列表排序后副本的方法是sorted函数,这个函数实际上可以用于任意序列,确总是返回一个列表
如果想把一些元素按相反的顺序排列,可以先使用sort(sorted),然后调用reverse方法,或者也可以使用reverse参数。
10.高级排序
内建函数cmp提供了比较函数的默认实现方式:

>>> cmp(1, 3)
-1
>>> cmp(3, 1)
1
>>> cmp(1, 1)
0
>>> x.sort(cmp)
>>> x
[1, 2, 3, 4, 5, 6]

sort方法还有另外两个可选参数——key和reverse(关键字参数),使用示例如下:

>>> x = ['abc', 'abcd', 'abcdegh', 'abcde', 'ab']
>>> x.sort(key = len)
>>> x
['ab', 'abc', 'abcd', 'abcde', 'abcdegh']
>>> x = [1, 2, 4, 3, 6, 5]
>>> x.sort(reverse = True)
>>> x
[6, 5, 4, 3, 2, 1]

元祖:不可变序列

元祖和列表的唯一区别是元祖不可以修改,然而字符串也是如此
定义方法:用逗号分割一些值
实现只有一个值的元祖的方法:即使只有一个值也加一个逗号。

>>> 40
40
>>> (40)
40
>>> 40,
(40,)
>>> (40,)
(40,)
>>> 3 * (40 + 2)
126
>>> 3 * (40 + 2, )
(42, 42, 42)

tuple函数

功能:以一个序列作为参数,把它转化为元祖,如果参数是元祖,则原样返回
它和list一样,并不是一个函数,而是一种类型,但目前可以忽略掉区别

基本元祖操作

除了创建元祖和访问元祖元素外没有太多其他操作,元祖分片还是元祖

>>> x = 1, 2, 3
>>> x
(1, 2, 3)
>>> x[1]
2
>>> x[0 : 2]
(1, 2)

那么,意义何在

一下两个情况,元祖不能被列表替代
1.元祖可以在映射(集合的成员)中当做键使用,列表不行
2.元祖作为很多内建函数、方法的返回值存在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值