代码之家  ›  专栏  ›  技术社区  ›  phwt

在lambda内部打印

  •  -1
  • phwt  · 技术社区  · 7 年前

    我目前使用的语法如下:

    print(*list(map(lambda a: [something to do], input())))
    

    如果返回类型是字符串而不是数字,则可以正常工作。

    例如。以下脚本用于在两个不同版本中查找三的平方根

    print(*list(map(lambda a: int(a)**(1/3), input())))
    

    SQRT = lambda a: a**(1/3)
    print(SQRT(int(input())))
    

    当我输入 9 两个返回 2.080083823051904 (这是正确的)但是当我输入 10 第一次回来 1.0 0.0 2.154434690031884 第二个。

    我想知道,有没有什么方法可以直接从lambda打印返回一个数字,而不会导致上述问题?

    2 回复  |  直到 7 年前
        1
  •  5
  •   Martijn Pieters    7 年前

    你把注意力放在了错误的问题上。这不是打印的问题;删除 print() 方程中的函数会给出相同的结果。

    你正在迭代 单个字符 生成 1 0 分别进入时 '10' 输入提示,或 9 当你进入 '9' 以下内容:

    >>> list(map(lambda a: int(a)**(1/3), '10'))
    [1.0, 0.0]  # [1 ** (1/3), 0 ** (1/3)]
    >>> list(map(lambda a: int(a)**(1/3), '9'))
    [2.080083823051904]  # [9 ** (1/3)]
    

    input() 返回一个字符串对象,字符串是可重复的;单个字符的序列为了 '10' 迭代给你 '1' '0' 以下内容:

    >>> list('10')  # just iteration, pulling out the separate parts
    ['1', '0']
    

    应用第二个代码段 int() 整体 输入() 字符串,那么得到 10 9个 :

    >>> SQRT(int('10'))
    2.154434690031884
    >>> SQRT(int('9'))
    2.080083823051904
    

    如果你想要输入的立方根, 不要使用 map() :

    >>> CBRT = lambda a: a ** (1/3)
    >>> CBRT(int('10'))
    >>> CBRT(int('10'))
    2.154434690031884
    

    旁注: * 在任何iterable上工作,包括 地图() 生产,所以 print(*map(...)) 同样有效 print(*list(map(...))) ,但不首先创建列表对象,然后再次丢弃该对象。

        2
  •  1
  •   blhsing    7 年前

    通过使用 map 关于返回字符串 input() ,您将字符串视为单个字符的序列,因此当您输入 '10' 是的。

    你应该使用你发布的第二种方法,因为 lambda 我是说, 地图 ,并且解包对您正在解决的问题没有任何价值。