• Python封装和结构


    在Python中有封装和解构的概念。封装 ——是将将多个值使用逗号分割,组合在一起 。本质上,返回一个元组,只是省掉了小括号。这是Python特有的概念,现在被很多语言借鉴。

    a  = (1,2)#元组
    b = 1,2#元组
    print(type(a))
    print(type(b))
    
    结果为:
    <class 'tuple'>
    <class 'tuple'>

    解构是把线性结构(也可以是非线性结构)的元素解开,并顺序的赋给其它变量,应该注意的是左边接纳的变量数要和右边解开的元素个数一致。

    lst = [3, 5]
    first, second = lst
    print(first, second)
    
    结果为:
    3 5
    
    a = 4
    b = 5
    temp = a
    a = b
    b = temp
    print(a,b)
    
    a = 4
    b = 5
    a,b = b,a
    print(a,b)
    
    上面两个例子的结果都为:
    
    5 4

    a,b =1,2,3

    结果为
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-13-1f237ab311da> in <module>
    ----> 1 a,b =1,2,3
    
    ValueError: too many values to unpack (expected 2)
    

     a,b,c=1,2

      结果为:

      

    ValueError                                Traceback (most recent call last)
    <ipython-input-14-dfc132c7dc8e> in <module>
    ----> 1 a,b,c=1,2
    
    ValueError: not enough values to unpack (expected 3, got 2)
    

    上面的例子中,a, b = b, a,等号右边使用了封装,而左边就使用了解构。

    a,b = {10,20}
    print(a,b)
    
    结果为:
    10 20
    
    a,b = {'a':10,'b':20} # 非线性结构也可以解构
    print(a,b)
    
    结果为:
    a b
    
    a,b = {10,20,30}
    print(a,b)
    
    结果为:
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-29-f1e9d0f368d9> in <module>
    ----> 1 a,b = {10,20,30}
          2 print(a,b)
    
    ValueError: too many values to unpack (expected 2)
    
    
    a,*b = {10,20,30}
    print(a,b)
    
    结果为:
    10 [20, 30]
    
    [a,b] = (1,2)
    print(a,b)
    
    结果为:
    1 2
    [a,b] = 10,20
    print(a,b)
    
    结果为:
    10 20
    
    (a,b) = {30,40}
    print(a,b)
    
    结果为:
    40 30

    Python3中的多变量解构

    使用 *变量名 接收多个值,但不能单独使用,被 *变量名收集后组成一个列表 。

    lst = list(range(10))
    head, *mid, tail = lst
    print(head,mid,tail)
    
    结果为:
    0 [1, 2, 3, 4, 5, 6, 7, 8] 9
    
    *lst2 = lst
    
    结果为:
     File "<ipython-input-42-419bc512b767>", line 4
    SyntaxError: starred assignment target must be in a list or tuple
    
    *body, tail = lst
    print(body,tail)
    
    结果为:
    [0, 1, 2, 3, 4, 5, 6, 7, 8] 9
    
    head, *tail = lst
    print(head,tail)
    
    结果为:
    0 [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    head, *m1, *m2, tail = lst
    print(head,m1,m2,tail)
    
    结果为:
     File "<ipython-input-49-c1bd0409aec6>", line 4
    SyntaxError: two starred expressions in assignment
    
    head, *mid, tail = "abcdefghijklmn"
    print(type(mid))
    print(head,mid,tail)
    
    结果为:
    <class 'list'>
    a ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'] n

    丢弃变量

    丢弃变量是一个惯例,是一个不成文的约定,不是标准。它指的是如果不关心一个变量,就可以定义改变量的名字为_,_是一个合法的标识符,也可以作为一个有效的变量使用,但是定义成下划线就是希望不要被使用,除非你明确的知道这个数据需要使用。所以一般情况,看到下划线就知道这个变量就是不想被使用。

    lst = [9,8,7,20]
    first, *second = lst
    head, *_, tail = lst
    print(head)
    print(tail)
    print(_)
    
    结果为:
    9
    20
    [8, 7]

    lst = [9,8,7,20]
    first, *second = lst
    _, *_, tail = lst
    print(_)
    print(tail)
    print(_)

    结果为:

    [8, 7]
    20
    [8, 7]

    所以,_ 这个变量本身无任何语义,没有任何可读性,所以不是用来给人使用的,Python中很多库,都使用这个变量,使用十分广泛。请不要在不明确变量作用域的情况下,使用 _ 导致和库中_ 冲突。

    # lst = list(range(10)) 取出第二个、第四个、倒数第二个
    _,second,_,four,*_,sa,_ = list(range(10))
    print(second,four,sa)
    
    结果为:
    1 3 8

    从lst = [1,(2,3,4),5]中,提取4出来

    lst = [1,(2,3,4),5]
    a,(b,c,d),e = lst
    print(d)
    
    结果为:
    4
    
    lst = [1,(2,3,4),5]
    _,(*_,val),*_ = lst
    print(val)
    
    结果为:
    4
    
    _,[*_,val],*_ = lst
    print(val)
    
    结果为:
    4

    环境变量JAVA_HOME=/usr/bin,返回环境变量名和路径

    key, _ , val = "JAVA_HOME=/usr/bin".partition('=')
    print(key)
    print(val)
    
    结果为:
    
    JAVA_HOME
    /usr/bin
    
    s = "JAVA_HOME=/usr/bin"
    s.split("=")
    
    结果为:
    ['JAVA_HOME', '/usr/bin']

     





     



     


     

  • 相关阅读:
    数组实现栈
    栈应用实例单词逆序
    使用JXMapViewer将地图集成到swing app中
    使用xbee连接地面站和飞控
    QWT编译、配置、使用(Qt Creator)
    Qt跨线程调用错误解析及解决办法
    SVN版本服务器搭建(服务端+客户端)
    opencv配置过程 (cmake,vs2013,qt 5.4)
    基数排序/Go实现
    c/c++ 编译器内存对齐问题
  • 原文地址:https://www.cnblogs.com/xpc51/p/11655668.html
Copyright © 2020-2023  润新知