【问题标题】:Is there a Python built-in method that checks if an integer is in binary format or not?是否有 Python 内置方法可以检查整数是否为二进制格式?
【发布时间】:2020-07-29 19:40:52
【问题描述】:

我知道实现自己的逻辑,但是有一个内置 Python 函数,它接受一个整数并在以二进制形式编写时返回 True?

例如,is_binary(0b1010) 将返回 True,但 is_binary(12) 将返回 False

【问题讨论】:

  • 不,这不可能。该函数只看到 int 的值,而不是您在代码中表示它的方式。 0b101010 的值无法区分。
  • 在调用函数时,0b101010 之间没有区别了。
  • 没有。 0b1010 在传递给所谓的is_binary 函数之前很久就变成了10
  • 你也不能为你的例子“自己动手”。

标签: python binary binary-data built-in


【解决方案1】:

不,因为 0b1010 被“编译器”转换为与 10 相同的表示形式,这当然发生在它被传递给函数之前很久。

我们可以通过调查生成的代码来确认这一点。

import dis

def binary():
    a = 0b1010

def base_10():
    a = 10

dis.dis(binary)
print()
dis.dis(base_10)

输出

 17           0 LOAD_CONST               1 (10)   # <-- Same represntation here
              2 STORE_FAST               0 (a)
              4 LOAD_CONST               0 (None)
              6 RETURN_VALUE

 20           0 LOAD_CONST               1 (10)   # <-- as here
              2 STORE_FAST               0 (a)
              4 LOAD_CONST               0 (None)
              6 RETURN_VALUE

如果它对你来说很重要,你将不得不实现某种AST parser,我假设将能够在转换之前获取二进制文字。

【讨论】:

  • 这个答案给人的误导印象是10 在某种程度上是“正常的”而0b1010 不是。 100b1010 都表示完全相同的值,它只是一个整数,没有任何固有的基数。默认 repr 给出十进制,但 int 本质上不是十进制。 (CPython 实现恰好以基数 2^15 或基数 2^30 表示整数,但这是一个对 int 语义没有影响的实现细节。)
  • @user2357112supportsMonica 当然0b101010 一样正常 :) 我会尝试比仅使用引号更好地表达这一点。
  • @user2357112supportsMonica 我又试了一次,请随意改写你认为合适的措辞
【解决方案2】:

如果你真的需要这样的功能并且不关心性能,你可以标记源:

scenox@Mac ~ % echo 'print(0b1010)' | python3 -m tokenize
1,0-1,5:            NAME           'print'        
1,5-1,6:            OP             '('            
1,6-1,12:           NUMBER         '0b1010'       
1,12-1,13:          OP             ')'            
1,13-1,14:          NEWLINE        '\n'           
2,0-2,0:            ENDMARKER      ''   

所以你可以这样做:

g = tokenize(BytesIO(somestring.encode('utf-8')).readline)  # tokenize the string
for toknum, tokval, _, _, _ in g:
    if toknum == NUMBER and tokval.startswith('0b'):
    ...

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 2021-01-28
    • 2014-07-09
    • 2010-09-18
    • 2011-11-29
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多