V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Newyorkcity
V2EX  ›  Python

请问 filter()传入的函数有两个参量时该怎么写后面的部分?

  •  
  •   Newyorkcity · 2016-08-16 19:56:34 +08:00 · 1714 次点击
    这是一个创建于 3012 天前的主题,其中的信息可能已经有所发展或是发生改变。



    先请看这两幅图中,为什么第一幅图中那个函数名是写全的,加上了(n)
    而第二幅图中却不用加?

    第一幅图那个 lambda 函数我真的是很难读懂...
    我的理解是:
    在 primes 那里的 filter 中从序列 it 中取出的指其实是赋值给了函数中的 x
    所以如果改的话可以改成
    def _not_divisible(n,x):
    return x % n
    然后如果能把 primes 函数中的 n 指向 n,把序列 it 中取出来的值给 x 就好了...

    这个理解对么...
    正确的理解应该是什么
    8 条回复    2016-08-16 20:51:16 +08:00
    zhuangzhuang1988
        1
    zhuangzhuang1988  
       2016-08-16 19:58:59 +08:00
    理解下函数签名。。。
    Newyorkcity
        2
    Newyorkcity  
    OP
       2016-08-16 20:03:38 +08:00
    @zhuangzhuang1988 可以更具体一点么...
    Newyorkcity
        3
    Newyorkcity  
    OP
       2016-08-16 20:08:54 +08:00
    @zhuangzhuang1988
    是不是 lambda x : x % n > 0 会返回一个布尔值,可是这个布尔值并不是_not_divisible 的返回值,所以才在 lambda 之前又加了一个 return?
    相当于
    def f(x,n):
    return x % n > 0
    def _not_divisible(x,n):
    return f(x,n)
    这样子?
    那干嘛不直接
    def _not_divisible(x,n):
    return x % n > 0
    是因为 filter 传入的函数无法接受两个变量么?
    yexiaoxing
        4
    yexiaoxing  
       2016-08-16 20:10:16 +08:00 via Android   ❤️ 1
    _not_divisible 返回的好像是一个函数不是一个值哦
    可以在 python shell 里运行一下试试
    比如运行 _not_divisible(5)(2)
    Newyorkcity
        5
    Newyorkcity  
    OP
       2016-08-16 20:26:49 +08:00
    @yexiaoxing
    运行了一下返回的是一个 True
    所以我觉得「是不是 lambda x : x % n > 0 会返回一个布尔值,可是这个布尔值并不是_not_divisible 的返回值,所以才在 lambda 之前又加了一个 return? 」这个理解应该没问题?
    不过「_not_divisible(5)(2)」很关键啊...就是那个(2)应该是赋值向函数内部 lambda 的 x 的值吧....所以我对前后两幅图前者加了( n )而后者不加的理解是对的喽,因为前者需要 filter 处理的数是 x 的值而不是 n 的值,n 已经专门赋值了
    ljbha007
        6
    ljbha007  
       2016-08-16 20:38:32 +08:00   ❤️ 1
    _not_divisible 返回的是个 lambda 函数
    is_odd 返回的是函数运行的结果
    ljbha007
        7
    ljbha007  
       2016-08-16 20:41:04 +08:00
    @Newyorkcity 这里用 lambda 的意义是返回一个函数 判断是否能被给定整数整除

    比如说 _not_divisible(2)(3)返回 True 表示 3 不能被 2 整除
    _not_divisible(3)(6)返回 False 表示 6 能被 3 整除
    Newyorkcity
        8
    Newyorkcity  
    OP
       2016-08-16 20:51:16 +08:00
    @ljbha007
    not_divisible 返回的是个布尔值吧,嗷...
    你的意思是逻辑上_not_divisible 先返回了 lambda 这个函数
    然后 lambda 接受了第二个括号内的内容并返回了最终的布尔值对么?

    不过说到最后,如果 filter 的传入函数有两个变量到底该怎么写呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:02 · PVG 00:02 · LAX 08:02 · JFK 11:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.