【问题标题】:Inner workings of map() in a specific parsing situationmap() 在特定解析情况下的内部工作原理
【发布时间】:2021-01-07 12:14:49
【问题描述】:

我知道至少有两个主题可以解释 map() 的工作原理,但在我遇到的特定情况下我似乎无法理解它的工作原理。

我正在做以下 Python 练习:

编写一个程序,根据 来自控制台输入的事务日志。事务日志格式为 如下图:

D 100
W 200

D 表示存款,W 表示取款。假设以下输入 提供给程序:

D 300
D 300
W 200
D 100

那么,输出应该是:

500

为这个练习提供的答案之一如下:

total = 0
while True:
    s = input().split()
    if not s:
        break
    cm,num = map(str,s)

    if cm=='D':
        total+=int(num)
    if cm=='W':
        total-=int(num)

print(total)

现在,我知道 map 将函数 (str) 应用于可迭代 (s),但我没有看到程序如何识别 s 字符串中的数字。我假设str 将每个字母/数字/等转换为字符串类型,但是int(num) 如何知道要选择什么作为整数?换句话说,为什么这段代码不会产生某种 TypeError 或 ValueError,因为在我看来,它会尝试生成一个整数(例如)“D 100”?

【问题讨论】:

    标签: python-3.x string parsing integer


    【解决方案1】:

    第一

    cm,num = map(str,s)
    

    可以简化为

    cm,num = s
    

    因为 s 已经是由 2 个元素组成的字符串列表(如果输入正确)。无需转换已经是字符串的字符串。 s 只是解压成 2 个变量。

    在我看来,它会尝试生成一个整数(例如)“D 100”?

    不可以,因为num 是字符串的第二个参数。

    如果输入是"D 100",那么s就是['D','100'],那么cm就是'D'num就是'100'

    那么由于num 代表一个整数,int(num) 将把num 转换成它的整数值。

    上面的代码完全没有错误检查(参数数量,参数“类型”),但使用正确的参数它可以工作。

    map 在那个特定的例子中也完全没用。

    【讨论】:

      【解决方案2】:

      原因是.split(),在s = input().split()之前的声明。这将创建值D100(或['D', '100'])的list,因为默认拆分字符是空格( )。然后map 函数将str 操作应用于'D''100'

      现在 map, 函数并不是真正需要的,因为输入时的两个值都自动属于 str(字符串)类型。

      第二个问题是int(num) 如何知道如何转换字符串。这与第二个(隐式)参数base 有关。类似于.split() 有一个默认参数作为要分割的字符,num 也有一个默认参数来转换。

      完整代码类似于int(num, base=10)。因此,只要 num 具有值 0-9 并且最多 1 个 .int 就可以正确地将其转换为基数 10。有关更多示例,请查看 built in int

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 2015-08-21
        • 2014-01-22
        • 1970-01-01
        相关资源
        最近更新 更多