美文网首页
python常识(二)

python常识(二)

作者: Brucezen | 来源:发表于2020-11-11 16:48 被阅读0次

    list.sort( key=None, reverse=False)

    key -- 只有一个传入参数的函数,参数取自于可迭代对象中

    reverse=True表示降序, reverse=False表示升序

    该方法没有返回值,但会改变原列表

    >>># 获取列表的第二个元素
    def takeSecond(elem):
        return elem[1]
     
    # 列表
    random = [(2, 2), (3, 4), (4, 1), (1, 3)]
     
    # 指定第二个元素排序
    random.sort(key=takeSecond)
     
    # 输出类别
    print ('排序列表:', random)
    

    排序列表:[(4, 1), (2, 2), (1, 3), (3, 4)]


    列表作为队列使用(“先进先出”), collections.deque被设计用于快速地从两端操作

    >>> from collections import deque
    >>> queue = deque(["Eric", "John", "Michael"])
    >>> queue.append("Terry")           # Terry arrives
    >>> queue.append("Graham")          # Graham arrives
    >>> queue.popleft()                 # The first to arrive now leaves
    'Eric'
    >>> queue.popleft()                 # The second to arrive now leaves
    'John'
    >>> queue                           # Remaining queue in order of arrival
    deque(['Michael', 'Terry', 'Graham'])
    

    一些编程小技巧

    # 构造一个元素位置与原列表相对一致的新列表
    >>>[(x, y) for i,x in enumerate([1,2,3]) for j,y in enumerate([3,1,4]) if i==j]
    [(1, 3), (2, 1), (3, 4)]
    
    # 从一个多维列表中取出最内层列表的每一个元素
    >>> vec = [[1,2,3], [4,5,6], [7,8,9]]
    >>> [num for elem in vec for num in elem]
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    # 矩阵的转置
    >>> matrix = [
    ...     [1, 2, 3, 4],
    ...     [5, 6, 7, 8],
    ...     [9, 10, 11, 12],
    ... ]
    >>> [[row[i] for row in matrix] for i in range(4)]
    [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
    
    

    zip(*iterables)函数, 创建一个聚合了来自每个可迭代对象中的元素的迭代器.
    返回一个元组的迭代器,其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。
    当所输入可迭代对象中最短的一个被耗尽时,迭代器将停止迭代。
    # zip('ABCD', 'xy') --> Ax By

    >>> x = [1, 2, 3]
    >>> y = [4, 5, 6]
    >>> zipped = zip(x, y)
    >>> list(zipped)
    [(1, 4), (2, 5), (3, 6)]
    >>> x2, y2 = zip(*zip(x, y))
    >>> x == list(x2) and y == list(y2)
    True
    

    del语句的使用,, 移除列表的一个元素,一个切片,甚至清空整个列表

    >>> a = [-1, 1, 66.25, 333, 333, 1234.5]
    >>> del a[0]
    >>> a
    [1, 66.25, 333, 333, 1234.5]
    >>> del a[2:4]
    >>> a
    [1, 66.25, 1234.5]
    >>> del a[:]
    >>> a
    []
    # 也可以删除整个变量, 此后再引用 a 时会报错
    >>> del a
    

    关于集合类型
    集合是由不重复元素组成的无序的集。它的基本用法包括成员检测和消除重复元素。
    集合对象也支持像 联合,交集,差集,对称差分等数学运算。
    类似于<u>列表推导式</u>,集合也支持推导式形式
    花括号或 set() 函数可以用来创建集合。
    注意:要创建一个空集合你只能用 set() 而不能用 {},因为后者是创建一个空字典

    >>> a = set('abracadabra')
    >>> b = set('alacazam')
    >>> a                                  # unique letters in a
    {'a', 'r', 'b', 'c', 'd'}
    >>> a - b                              # letters in a but not in b
    {'r', 'd', 'b'}
    >>> a | b                              # letters in a or b or both
    {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
    >>> a & b                              # letters in both a and b
    {'a', 'c'}
    >>> a ^ b                              # letters in a or b but not both
    {'r', 'd', 'b', 'm', 'z', 'l'}
    
    # 推导式形式
    >>> a = {x for x in 'abracadabra' if x not in 'abc'}
    >>> a
    {'r', 'd'}
    

    关于字典:
    可以用 del 来删除一个键值对。
    对一个字典执行 list(d) 将返回包含该字典中所有键的列表,按插入次序排列
    (如需其他排序,则要使用 sorted(d))。
    要检查字典中是否存在一个特定键,可使用 in 关键字。

    # 添加新键值对
    >>> tel = {'jack': 4098, 'sape': 4139}
    >>> tel['guido'] = 4127
    >>> tel
    {'jack': 4098, 'sape': 4139, 'guido': 4127}
    
    # 删除键值对
    >>> del tel['sape']
    
    # 返回包含所有键的列表
    >>> list(tel)
    ['jack', 'guido']
    
    # 按键升序排序
    >>> sorted(tel)
    ['guido', 'jack']
    
    # dict() 构造函数可以直接从键值对序列里创建字典。
    >>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
    {'sape': 4139, 'guido': 4127, 'jack': 4098}
    
    # 此外,字典推导式可以从任意的键值表达式中创建字典
    >>> {x: x**2 for x in (2, 4, 6)}
    {2: 4, 4: 16, 6: 36}
    
    # 接通过关键字参数来指定键值对
    >>> dict(sape=4139, guido=4127, jack=4098)
    {'sape': 4139, 'guido': 4127, 'jack': 4098}
    

    **比较操作符innot in校验一个值是否在一个序列里;操作符isis not比较两个对象是不是同一个对象.
    所有的比较操作符的优先级都比数值运算符低.
    and or not中,优先级not > and > or
    因此A and not B or C 等价于 (A and (not B)) or C
    布尔运算符 andor 也被称为 短路 运算符:它们的参数从左至右解析,一旦可以确定结果解析就会停止。
    例如,如果 AC 为真而 B 为假,那么 A and B and C 不会解析 C
    **

    >>>print(0 or 'a' or 'b')
    a
    >>>print(0 and 'a' and 'b')
    0
    

    关于海象运算符:=Python 3.8 新增功能,把变量赋值和使用合在一起。这个是新加的语法,3.8之前不支持。

    if (n := len(a)) > 10:
        pass
    
    # 相当于
    
    n = len(a)
    if n > 10:
        pass
    

    关于序列比较:
    序列对象通常可以与相同序列类型的其他对象比较。
    首先比较开头的两个对应元素,如果两者不相等则比较结果就由此确定;
    如果两者相等则比较之后的两个元素,以此类推,直到有一个序列被耗尽。
    如果要比较的两个元素本身又是相同类型的序列,则会递归地执行上述顺序比较。
    比如t1 = (1, 2, ('aa', 'ab')) ,t2 = (1, 2, ('abc', 'a'), 4)
    比较双方的第一个元素,它们都是1 -> 第二个元素,都是2 -> 第三个元素,分别是 ('aa', 'ab')('abc', 'a')
    (接着在内部进行了这样的比较: -> 'aa''abc' ->'a''a' ->'a''b')
    至此由于'a'<'b',因此我们可以知道t1 < t2
    另外,如果一个序列是另一个的初始子序列,则较短的序列被视为较小

    >>>(1, 2, ('aa', 'ab'))   < (1, 2, ('abc', 'a'), 4)
    True
    >>>(1, 2, 3, 4)           < (1, 2, 4)
    True
    >>>(1, 2)                 < (1, 2, -1)
    True
    

    关于函数标注:
    函数标注 以字典的形式存放在函数的 __annotations__ 属性中,并且不会影响函数的任何其他部分。
    形参标注的定义方式是在形参名称后加上冒号,后面跟一个表达式,该表达式会被求值为标注的值。
    返回值标注的定义方式是加上一个组合符号 ->,后面跟一个表达式

    >>> def f(ham: str, eggs: str = 'eggs') -> str:
    ...     print("Annotations:", f.__annotations__)
    ...     print("Arguments:", ham, eggs)
    ...     return ham + ' and ' + eggs
    ...
    >>> f('spam')
    Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
    Arguments: spam eggs
    'spam and eggs'
    

    相关文章

      网友评论

          本文标题:python常识(二)

          本文链接:https://www.haomeiwen.com/subject/vfmebktx.html