Python 一些零散的东西

2017-08-15  本文已影响0人  akak18183

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取负。
上一篇 下一篇

猜你喜欢

热点阅读