今天是二零一伍年八月二十九日
1、在python中,函数名其实也是一个变量。比如我可以把一个变量的值修改成函数名。当然,我们还有更能体现他是变量的方法:
>>> abs(-10)
10
>>> abs = -10
>>> abs
-10
>>> abs(-10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
我们尝试把一个其他类型的值赋值给我们的函数名,没想到它接收了。那么就更加说明我们的函数名是一种变量,而且当我们再次调用这个函数的时候,原来内容就被我们的-10覆盖了。
2、我们之前已经看过了map等函数,他们是一种可以接受函数作为变量的函数。这样的函数往往被称为高阶函数,而我们自己也可以写这样的函数:
>>> def add( x , y , f):
... return f(x) + f(y)
...
>>> add(-1 , 2 , abs)
3
3、关于map函数,他的一个参数是函数,另外一个是可迭代对象。
4、把list变成一个数字:
>>> from functools import reduce
>>> def fn(x,y):
... return 10 * x + y
>>> reduce (fn , [1 , 3 , 5 , 7 ,9])
13579
5、在python中的内建函数filter提供序列筛选功能,它所需要的参数和map是一样的,一个是序列(可以是元组),另外一个是函数。filter的工作是使用函数遍历每一个序列的内容,将返还值为True的元素提取出来组成filter。
>>> def is_odd(n):
... return n % 2 == 1
>>> list(filter(is_odd , [1,2,3,4,5,6]))
[1, 3, 5]
>>> list(filter(is_odd , (1,2,3,4,5,6)))
[1, 3, 5]
那么重点来了,我廖雪峰大神写了一个简单的程序,我们可以来研究一下:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
首先,我廖大的这个句柄是用来筛选出list中有意义的字符串。我们先关注我们要筛除掉的内容,None、空字符和空格。首先我们要了解,空字符和None的返回结果都是false。这时我们想要筛选掉空格,就需要strip函数,strip在接受空格字符以后返回的也是一个空字符,那么它的布尔值也是false了。于是,按照这个思路,我们的return 就是像廖大那样了。
6、然后廖大还用python的filter函数演示了产生素数序列的方法。首先我们要知道,生成器的序列是惰性的,这一点也就为我们尝试得到素数序列提供了可能性。要知道,非惰性变量是无法表示无限对象的。我们在产生素数方面使用的是埃拉托色尼选筛法,我们先要生成一个对象序列供我们筛选:
>>> def _odd_iter():
... n = 1
... while True:
... n = n + 2
... yield n
然后我们需要建立函数,要知道,底层函数往往比高级函数更重要:
>>> def _not_div(n):
... return lambda x : x % n > 0
我们原本的对象就是一个生成器,然后我们这个函数所返回的也是一个函数。然后就尝试去用埃式筛法得到我们素数序列:
>>> def primes():
... yield 2
... it = _odd_iter()
... while True:
... n = next(it)
... yield n
... it = filter(_not_div(n) , it)
我们的primes是一个惰性无限数列,当然你可以打印其中一部分,毕竟我们得到的是一个生成器:
>>> for n in primes():
... if n < 1000:
... print(n)
... else:
... break
不得不提的是,其实我们的埃式筛法也是用了容斥原理的思想。