zoukankan      html  css  js  c++  java
  • 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 核心编程(第二版)》
  • 相关阅读:
    微软外服 AlI In One
    js 循环多次和循环一次的时间的性能对比 All In One
    vue inject All In One
    Excel 表格数据倒置 All In One
    SVG tickets All In One
    OH MY ZSH All In One
    js array for loop performance compare All In One
    mac terminal show You have new mail All In one
    新闻视频 26 制作母版页
    转自牛腩 母版页和相对路径
  • 原文地址:https://www.cnblogs.com/sxiszero/p/12459966.html
Copyright © 2011-2022 走看看