五月春生 2024-04-09 16:06 采纳率: 66.7%
浏览 4

lambda在函数中怎么没有传参即可使用?

请教一下,这1000以内素数的代码中,匿名函数的参数怎么没传就可以用?
难道说lambda里的x,可以接收到filter中序列参数的每一项值?
比如n为3时,it序列中5,7,9,11,13,15……。这一串可以依次传入到lambda的x参数中去?


def _odd_iter():  # it生成器,代表从3开始的全体奇数序列。
    n = 1
    while True:
        n += 2
        yield n


def _not_divisible(n):
    return lambda x: x % n > 0


def primes():
    yield 2
    it = _odd_iter()
    while True:
        n = next(it)  # 去除第一个数,就是3(是素数)打印出来。
        yield n
        '''
          # 构造一个新序列,就是将已经取出3之后奇数序列,
          通过_not_divisible(n)返回的筛选规则,生成一个新的filter迭代器对象。
          然后循环n = next(it)取出新对象的第一个数(肯定是素数),后面一直循环。
        '''
        it = filter(_not_divisible(n), it)


for i in primes():
    if i < 1000:
        print(i)
    else:
        break

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-04-09 16:06
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在你提供的Python代码中,lambda 函数确实可以在不传递参数的情况下使用,这是因为它的定义方式允许它直接接收外部作用域中的变量。在这个例子中,_not_divisible(n) 函数实际上是一个闭包,它捕获了 n 这个变量。当 it = filter(_not_divisible(n), it) 这行被执行时,n 的当前值会被保存在 lambda 函数内部,即使 n 在外部函数 primes() 中后续有所改变,lambda 函数依然会使用最初的 n 值。

    具体来说,在 while 循环中,每次迭代 n 都会更新为下一个奇数,而 lambda xx % n > 0 则检查 x 是否能被 n 整除。由于 n 已经被绑定在 lambda 函数内,所以每次筛选时都会使用上一次循环中计算出的 n 值,从而实现了对奇数序列的筛选。

    所以,尽管 lambda 函数看起来没有显式地接收参数,但其实它是在隐式地接收并使用外部作用域的变量 n。这就是为什么在你的代码中可以这样使用 lambda

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月9日

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法