python_学习笔记0829

今天是二零一伍年八月二十九日

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

不得不提的是,其实我们的埃式筛法也是用了容斥原理的思想。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值