zoukankan      html  css  js  c++  java
  • Python-元组(tuple),文件

    基础:

    1. 元组由简单对象组构成。

    2. 元组与列表类似,不过不能在原处修改(它们是不可变的),并且通常写成圆括号(),而不是方框号[]中的一系列项。

    ==========================================================================

    >>> (1,2) + (3,4)

    (1,2,3,4)

    >>> (1,2)*4

    (1,2,1,2,1,2,1,2)

    >>> T = (1,2,3,4)

    >>> T[0], T[1:3]

    (1, (2,3))

    ===========================================================================

    >>> x = (40)  # An integer!

    >>> x

    40

    >>> y = (40,)  #A tuple containing an integer

    >>> y

    (40,)

    注:在不会引发语法冲突的情况系啊,Python允许忽略元组的圆括号。

    如果圆括号里的单一对象是元组对象而不是一个简单的表达式(圆括号可以把表达式括起来), 需要对Python进行特别说明。

    如果确实像得到一个远足,只要在这一单个元素之后,关闭圆括号之前加一个逗号即可。

    =============================================================================

    >>> T = ('cc', 'aa', 'dd', 'bb’)

    >>> tmp = list(T)          # Make a list from a tuple's items

    >>> tmp.sort()

    >>> tmp

    ['aa', 'bb', 'cc', 'dd']

    >>> T = tuple(tmp)          # Make a tumple from the list's items

    >>> T

    ('aa', 'bb', 'cc', 'dd')

    >>> sorted(T)            # Or use the sorted built-in

    ['aa', 'bb', 'cc', 'dd']

    =============================================================================

    >>> T = (1, [2,3], 4)

    >>> T[1] = 'spam'        # This fails: can't change tuple itself

    TypeError

    >>> T[1][0] = 'spam'       # This works: can change mutables inside

    >>> T

    (1, ['spam', 3], 4)

    =============================================================================

    eval能够把字符串当做可执行程序代码(从技术上来讲,就是一个含有Python表达式的字符串)

    >>> line = "[1,2,3]${'a':1, 'b':2} "

    >>> line

    "[1,2,3]${'a':1, 'b':2} "

    >>> parts = line.split('$')

    >>> parts

    ['[1,2,3]',"{'a':1, 'b':2} "]

    >>> eval(parts[0])

    [1,2,3]

    >>> objects = [eval(P) for P in parts]

    >>> objects

    [[1,2,3], {'a':1, 'b':2}]

    =========================================================

    用pickle存储Python的原生对象

    pickle与eval的区别:

    eval能够执行Python的任何表达式,有可能会删除计算机上所有文件的表达式;

    pickle能够存储Python原生对象,也不要求把字符串转换。

    >>> D = {'a': 1, 'b': 2}

    >>> F = open('datafile.pkl', 'wb')

    >>> import pickle

    >>> pickle.dump(D, F)      # Pickle any object to file

    >>> F.close()

    之后想要取回字典时,只要简单的再用一次pickle进行重建就可以了;

    >>> F = open('datafile.pkl', 'wb')

    >>> E = pickle.load(F)

    >>> E

    {'a': 1, 'b': 2}

    >>> open('datafile.pkl', 'rb').read()        # Format is prone to change!

    b'x90x03}qx00(Xx01x00x00…….'

    注:在这里是使用二进制模式打开用于储存pickle化的对象的文件,因为二进制模式总是Python 3.X中必须的,同时pickle程序创建和使用一个bytes字符串对象,并且这些对象意味着二进制模式文件(文本模式文件意味着Python 3.X中的str字符串)

    ===========================================================

    struct模块能够创造并解析打包的二进制数据;

    从某种意义上说,它是另一个数据转换工具。

    >>> F = open('data.bin', 'wb')

    >>> import struct

    >>> data = struct.pack('>i4sh', 7, 'spam', 8)      # Make packed binary data

    >>> data

    b'x00x00x00x07spamx00x08'

    >>> F.wirte(data)                    # Write byte string

    >>> F.close()

    >>> F = open('data.bin', 'rb')

    >>> data = F.read()

    >>> data

    b'x00x00x00x07spamx00x08'

    >>> values = struct.unpack('>i4sh', data)        # Convert to Python objects

    >>> values

    (7, 'spam', 8)

    =========================================================

    引用:

    >>> X = [1,2,3]

    >>> L = ['a', X, 'b']

    >>> D = {'x': X, 'y': 2}

    >>> X[1] = 'surprise'

    >>> L 

    ['a', [1, 'surprise', 3], 'b']

    >>> D

    {'x': [1, 'surprise', 3], 'y': 2}

    复制:

    >>> L = [1,2,3]

    >>> D = {'a': 1, 'b': 2}

    >>> A = L[:]

    >>> B = D.copy()

    >>> A[1] = 'N1'

    >>> D['c'] = 'spam'

    >>> L,D

    ([1,2,3], {'a': 1, 'c': 'spam', 'b': 2})

    >>> A,B

    ([1, 'Ni', 3], {'a': 1, 'b': 2})

    如果将引用中修改为

    >>> X = [1,2,3]

    >>> L = ['a': X[:], 'b']

    >>> D = {'x': X[:], 'y': 2]

    则X的修改不会影响到L与D

    ========================================================

    判断“一致性”与“相等性”

    >>> L1 = [1,('a', 3)]

    >>> L2 = [1,('a', 3)]

    >>> L1 == L2, L1 is L2

    (True, False)

    “==”判断相等性,“is”判断一致性;

    >>> S1 = 'spam'

    >>> S2 = 'spam'

    >>> S1 == S2, S1 is S2

    (True, True)

    >>> S1 = 'a longer string'

    >>> S2 = 'a longer string'

    >>> S1 == S2, S1 is S2

    (True, false)

    理由:

    Python内部暂时存储并重复使用段字符串作为最佳化,因为'spam'实际上在内存中只存在一个字符串用于分享;

    =====================================================================

    None对象

    None是Python中一种特殊数据类型的唯一值,一般起一个空的占位作用,与C语言中的NULL指针类似。

    None不是意味着“未定义”。None是某些内容,而不是没有内容。它是一个真正的对象,并且有一块内存,由Python给定一个内置的名称。

    =====================================================================

    复制

    >>> L = [4, 5, 6]

    >>> X = L * 4

    >>> Y = [L] * 4

    >>> X

    [4,5,6,4,5,6,4,5,6,4,5,6]

    >>> Y

    [[4,5,6],[4,5,6],[4,5,6],[4,5,6]]

    >>> L[1] = 0                # Impacts y but not X

    >>> X

    [4,5,6,4,5,6,4,5,6,4,5,6]          # 赋值

    >>> Y

    [[4,0,6],[4,0,6],[4,0,6],[4,0,6]]      # 引用

    ======================================================================

    嵌套,无限循环

    无论何时Python在对象中检测到循环,都会打印成[...],而不会陷入无限循环

    >>> L = ['grail']

    >>> L.append(L)

    >>> L

    ['grail', [...]]

    =======================================================================

    不可变类型不可以在原处改变

    如果需要,可以通过分片、合并等操作来,通过创建一个新的对象,然后向后赋值给原因用

    T = (1,2,3)

    T[2] = 4      #Error!

    T = T[:2] +(4,)    #OK: (1,2,4)

    =======================================================================

     元组支持所有一般的序列操作,但是他们没有方法,因为是不可变的而不能进行任何在原处的修改。

    注:

      内置函数与表达式可以跨越多种对象类型,如内置的len函数会传回Python任何容器对象的长度(包含元素的数目),包括元组在内;

      方法特定于一种单个的对象类型,尽管通过某些方式可以在多种类型上使用(例如,索引,在列表和元组上都有效)

    ========================================================================

    >>> L = [1,2,3,4]

    >>> L[3:1] = ['?']

    >>> L

    [1,2,3,'?',4]

    ========================================================================

    >>> L = [1,2,3,4]

    >>> L[2] = []

    >>> L

    [1,2,[],4]

    >>> L[2:3] = []

    >>> L

    [1,2,4]

    >>> del L[0]

    >>> L

    [2,4]

    >>> del L[1:]

    >>> L

    [2]

    >>> L[1:2] =1

    TypeError

    =====================================================

    元组的赋值运算

    >>> X = 'spam'

    >>> Y = 'eggs'

    >>> X, Y = Y, X

    >>> X

    'eggs'

    >>> Y

    'spam'

    ======================================================

    + 不适用于字典,因为那不是序列;

    append方法只适用于列表,不适用于字符串;

    append假设其目标是可变的,因为这是一个原地的扩展,字符串是不可变的。

    ======================================================

  • 相关阅读:
    Oracle巡检html版
    bat批处理常用脚本
    UiBot踩坑记录
    服务器的一些优化
    开始学算法(一)
    docker 容器服务脚本自启动
    Cenots Ubuntu linux系统服务脚本开机自启方法
    docker容器添加自定义hosts
    docker 常用命令
    《图解HTTP》学习笔记
  • 原文地址:https://www.cnblogs.com/yy-is-ing/p/3942747.html
Copyright © 2011-2022 走看看