美文网首页
Python 一些零散的东西

Python 一些零散的东西

作者: akak18183 | 来源:发表于2017-08-15 09:19 被阅读0次

    Python里面有一些东西,分布得很散,但是又十分有用。

    1. lambda
      相当于单行的函数定义,写起来十分简便。具体格式就是f = lambda p,q,... : f(p,q,...)。参数可以是一个或者多个。
    >>> f = lambda x,y : x+y/3
    >>> f(4,5)
    5.666666666666667
    

    这个函数往往是在其他函数里面充当一个key或者filter或者cmp等等的作用,应用十分广泛。

    1. map
      格式是map(f, it),即对iterable里面的每一个元素都使用一次函数f,以iterator的形式返回。
    >>> list(map(len,['a', 'ab']))
    [1, 2]
    
    1. functools.reduce
      格式是functools.reduce(f, it [,init]),对it里面的元素累积使用f,可以添加初始元素:
    >>> functools.reduce(lambda x,y: x+y/3, [2,5,6,8], 1)
    8.0
    >>> functools.reduce(lambda x,y: x+y/3, [1,2,5,6,8])
    8.0 
    
    1. functools.cmp_to_key
      接受一个cmp函数转为key函数。这个函数可以让Python3也用上cmp功能的函数来进行sort。

    2. fractions.gcd
      格式是fractions.gcd(a, b),求整数a和b的最大公约数。

    >>> fractions.gcd(12,16)
    4
    
    1. zip
      配对函数,返回的是迭代器。zip(p,q,...)接受两个或者更多参数,相当于从pq里面每次各取一个元素出来,以最短长度为准。假如要最长的,可以用itertools.zip_longest。
    >>> list(zip([1,2,3,4], 'abc'))
    [(1, 'a'), (2, 'b'), (3, 'c')]
    

    zip还有一个比较生僻的用法,即zip(* a),a为二维数组:

    >>> zip(*[[1,2,3],[4,5,6]])
    <zip object at 0x03F513C8>
    >>> list(zip(*[[1,2,3],[4,5,6]]))
    [(1, 4), (2, 5), (3, 6)]
    

    相当于求矩阵转置。

    1. [x:y:z]
      很多时候都需要用到iterable的子串或者子串的逆序,[x:y:z]是一种很便捷的切片方法。
      当z>0的时候,就是以index=x为开始,到y-1结束(包括x和y-1),步长为z的子串:
    >>> n = list(range(10))
    >>> n[2:7:2]
    [2, 4, 6]
    

    当z小于0的时候,就有点tricky了:

    >>> n[6:1:-1]
    [6, 5, 4, 3, 2]
    

    此时是从x开始,到y+1结束。
    这么说,整个的逆序是n[9:-1:-1]?No!

    >>> n[9:-1:-1]
    []
    >>> n[9:0:-1]
    [9, 8, 7, 6, 5, 4, 3, 2, 1]
    >>> n[::-1]
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
    

    也就是说,唯独对于最后一位,xyz的切片方式失效了,好在可以用[::-1]实现。
    实在搞不清楚,干脆就用正序的方法切片再加reversed好了。

    1. yield
      yield的使用目的是为了节约内存。常见的iterable已经把所有内容都存了起来,有时候这不是最优的选择。生成器(generator)就是为了优化内存而生,它不是把所有需要的值一股脑产生然后存起来,而是要的时候生成一个。
      生成器有特殊的读取方式,就是yield。生成器的形成也很简单,把常用的序列的[]改成()即可:
    >>> mygenerator = (x*x for x in range(3))
    >>> type(mygenerator)
    <class 'generator'>
    # 这时候,如果用for去print,就只能输出一次:
    >>> for i in mygenerator:
        print(i)
    
        
    0
    1
    4
    >>> for i in mygenerator:
        print(i)
    

    第二次for的时候,不能输出了。也就是说,生成器只能迭代一次。
    假如generator更加复杂呢?那就得自己写一段定义了,yield在其中类似于函数的return:

    >>> def createGenerator():
        for i in range(3):
            yield i*i
    
            
    >>> mg = createGenerator()
    >>> type(mg)
    <class 'generator'>
    >>> for i in mg:
        print(i)
    
        
    0
    1
    4
    >>> for i in mg:
        print(i)
    

    可以看到,Python检查到yield,就认为这是一个生成器。还是只能迭代一次。

    1. 无穷
      Python里面表示无穷大用的是float('inf'),无穷小则在前面加个-即float('-inf')。类型是float。
      有时候也可以用0x7fffffff来表示32位最大正整数2147483647,因为Python没有溢出,也没有32位限制,所以32位最小正整数没法像其他语言那样表示,只好用最大正整数加1取负。

    相关文章

      网友评论

          本文标题:Python 一些零散的东西

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