Python里面有一些东西,分布得很散,但是又十分有用。
- lambda
相当于单行的函数定义,写起来十分简便。具体格式就是f = lambda p,q,... : f(p,q,...)。参数可以是一个或者多个。
>>> f = lambda x,y : x+y/3
>>> f(4,5)
5.666666666666667
这个函数往往是在其他函数里面充当一个key或者filter或者cmp等等的作用,应用十分广泛。
- map
格式是map(f, it),即对iterable里面的每一个元素都使用一次函数f,以iterator的形式返回。
>>> list(map(len,['a', 'ab']))
[1, 2]
- 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
-
functools.cmp_to_key
接受一个cmp函数转为key函数。这个函数可以让Python3也用上cmp功能的函数来进行sort。 -
fractions.gcd
格式是fractions.gcd(a, b),求整数a和b的最大公约数。
>>> fractions.gcd(12,16)
4
- 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)]
相当于求矩阵转置。
- [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好了。
- 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,就认为这是一个生成器。还是只能迭代一次。
- 无穷
Python里面表示无穷大用的是float('inf'),无穷小则在前面加个-即float('-inf')。类型是float。
有时候也可以用0x7fffffff来表示32位最大正整数2147483647,因为Python没有溢出,也没有32位限制,所以32位最小正整数没法像其他语言那样表示,只好用最大正整数加1取负。
网友评论