• Python



    序列包括:字符串(普通字符串和 unicode 字符串)、列表和元组类型。

    1. 序列类型操作符

    1.1 成员关系操作符(in、not in)

    成员关系操作符用来判断一个元素是否属于一个序列的。

    • 序列类型操作符

    1.2 用步长索引来进行扩展的切片操作

    >>> s = "abcdefgh"
    >>> s[::-2]
    'hfdb'
    >>> s[::-1]  # 可以视作“翻转”操作
    'hgfedcba'
    >>> s[::2] # 隔一个取一个的操作
    'aceg'
    >>> s[-1] # 倒数第一个元素
    'h'
    >>> s[-len(s)] # 正数第一个元素
    'a'
    

    1.3 切片索引的更多内容

    • 开始和结束索引值可以超过序列的长度
    >>> ('day','month','year')[-100:100]
    ('day', 'month', 'year')
    
    • 字符串切片输出问题

    一个字符串,我们想通过一个循环,每次都把位于最后的一个字符砍掉。

    >>> s = 'abcde'
    >>> i = -1
    >>> for i in range(-1,-len(s),-1):
    ...     print s[:i]
    ... 
    abcd
    abc
    ab
    a
    

    上述方法,无法在第一次迭代时显示整个字符串,因为 -1 已经是“最小”的索引了,不可能用 0 作为索引值,因为这会到第一个元素之前而什么都不会显示。

    >>> s[:0]
    ''
    

    另一个技巧:用 None 作为索引值。

    >>> s = 'abcdefgh'
    >>> for i in [None] + range(-1,-len(s),-1):
    ...     print s[:i]
    ... 
    abcde
    abcd
    abc
    ab
    a
    

    看到这里,似乎还可以创建一个只包含 None 的列表,然后用 extend() 函数把 range() 的输出添加到这个列表里,然后对这个列表进行遍历。但是可变对象的内建函数 extend() 根本没有返回值,所以这个方法行不通:

    >>> s = 'abcdefgh'
    >>> for i in [None].extend(range(-1,-len(s),-1)):
    ...     print s[:i]
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'NoneType' object is not iterable
    
    

    这个错误发生的原因是[None].extend(...)函数返回 None,None 既不是序列类型也不是可迭代对象。

    >>> type(range(10))
    <type 'list'>
    >>> type([None] + range(0,10,2))
    <type 'list'>
    >>> type([None].extend(range(0,10,2)))
    <type 'NoneType'>
    
    

    2. 内建函数(BIF)

    2.1 类型转换

    内建函数 list()、str()和 tuple()被用做在各种序列类型之间转换。但实际上并没有进行任何的转换。这些转换实际上是工厂函数,将对象作为参数,并将其内容(浅)拷贝到新生成的对象中。

    a = [1,2,[3,4],5]
    c = tuple(a)
    print a,c
    
    a[2][1] = 7
    print a,c
    
    a[0] = 8
    print a,c
    
    print id(a),id(c)
    
    输出结果:
    [1, 2, [3, 4], 5] (1, 2, [3, 4], 5)
    [1, 2, [3, 7], 5] (1, 2, [3, 7], 5)
    [8, 2, [3, 7], 5] (1, 2, [3, 7], 5)
    139781837486560 139781837769024
    
    b  = (1,2,[3,4],5)
    e = list(b)
    print b,e
    
    e[2][1] = 7
    print b,e
    
    e[0] = 8
    print b,e
    print id(b),id(e)
    
    输出结果:
    (1, 2, [3, 4], 5) [1, 2, [3, 4], 5]
    (1, 2, [3, 7], 5) [1, 2, [3, 7], 5]
    (1, 2, [3, 7], 5) [8, 2, [3, 7], 5]
    139781837570480 139781837530608
    

    因为一单一个 Python 的对象被建立,我们就不能更改其身份或类型了,所以不能简单的把一个对象转换成另一个对象。如果把一个列表对象传给list()函数,便会创建这个对象的一个浅拷贝,然后将其插入新的列表中。在做连接操作和重复操作时,也会这样处理。
    浅拷贝就是只拷贝了对对象的索引,而不是重新建立了一个对象。

    2.2 可操作性

    下图为序列类型可用的内建函数。len()、reversed()和 sum()函数只能接受序列类型对象作为参数,剩下的还可以接受可迭代对象作为参数。max()和min()函数也可以接受一个参数列表。

    [参考文献]

    1. 《Python 核心编程(第二版)》
  • 相关阅读:
    考在职还是全日制?
    ARP欺骗病毒攻击
    AutoCAD2006安装错误之解决
    WINCE下创建多个文件分区
    在WINCE5.0中应用CMD(比如运行PING命令)
    WinCE 应用程序开机自动方法
    Wince 添加中文字库
    WinCE内核裁减(中文字体)及字库和内核的分离(转)
    WINCE基于CH7024实现TV OUT (VGA)功能
    WINCE6.0 中文支持
  • 原文地址:https://www.cnblogs.com/sxiszero/p/12459966.html
Copyright © 2020-2023  润新知