[与 0x01 做 AND 运算]和 [判断是否等于 1 ] 在 Pyhton 中的区别?

2014-11-13 04:06:17 +08:00
 whalegia
最近在学习 Python ,看别人的代码经常发现类似:

1. total = m + n # m 和 n 都是整型
2. if total & 0x01:
3. pass


这样的代码。我想请问一下,这种做 And 运算的方式和判定是否等于 1 有区别嘛?为什么要这样写呢?可以避免什么 bug 嘛?
4005 次点击
所在节点    Python
22 条回复
Sunyanzi
2014-11-13 04:23:43 +08:00
区别大了 ... 这是在判断是否是奇数 ...

不过说起来我更好奇的是 ... 你是怎么认为这是在判断是否等于 1 的 ..?
whalegia
2014-11-13 04:32:29 +08:00
@Sunyanzi 噢这样啊,我想偏了……就是不是 AND 两边都为 1 才为真嘛。所以下意识就觉得,哈哈哈。。。
whalegia
2014-11-13 04:34:20 +08:00
@Sunyanzi 哎呀好丢人,V2EX 可不可以删贴。
CupTools
2014-11-13 05:48:11 +08:00
@whalegia 不丢人,不耻下问才会有进步
blacktulip
2014-11-13 06:19:16 +08:00
@CupTools 不耻下问...
Sunyanzi
2014-11-13 06:22:50 +08:00
@whalegia & 不是 and 哟 ... 虽然都是与 ...

但 & 是按位与 ... and 是逻辑与 ... 还是有本质的区别哒 ...
zxy
2014-11-13 06:45:55 +08:00
刚醒来,结果也把&当作&&读了,感谢楼上
dreampuf
2014-11-13 07:09:52 +08:00
区别大了

In [115]: dis.disassemble(compile("total & 0x01", "__file__", "single"))
1 0 LOAD_NAME 0 (total)
3 LOAD_CONST 0 (1)
6 BINARY_AND
7 PRINT_EXPR
8 LOAD_CONST 1 (None)
11 RETURN_VALUE

In [116]: dis.disassemble(compile("total == 1", "__file__", "single"))
1 0 LOAD_NAME 0 (total)
3 LOAD_CONST 0 (1)
6 COMPARE_OP 2 (==)
9 PRINT_EXPR
10 LOAD_CONST 1 (None)
13 RETURN_VALUE

In [117]: dis.disassemble(compile("total and 1", "__file__", "single"))
1 0 LOAD_NAME 0 (total)
3 JUMP_IF_FALSE_OR_POP 9
6 LOAD_CONST 0 (1)
>> 9 PRINT_EXPR
10 LOAD_CONST 1 (None)
13 RETURN_VALUE
staticor
2014-11-13 07:58:59 +08:00
multi-assignment 其实可以理解为定义了一个 "namedtuple" = tuple

name, height = "mike", "78kg"

==>

(name, height) = ("mike", "78kg")


可以分别试试
a = 1, 2

a = (1, 2)
查看得到的a 类型
whalegia
2014-11-13 08:11:03 +08:00
@staticor 谢谢!

我解释一下您看对吗:
他这里其实是定义了一堆变量,
1、numLen 是 num 的长度,为整型
2、res 是一个 tuple,还没有值
3、dict 是一个字典,为空
4、然后这三个东西在一起又是一个 tuple:(numLen, res, dict),像这样??


我试了 a = 1, 2 和 a = (1, 2),打印出来两个是一样的。所以 tuple 定义的时候可以没有括号啊原来。
cloud107202
2014-11-13 09:32:15 +08:00
不耻下问。。楼主赶快去查查词典,以后可别在重要场合搞错这个成语
staticor
2014-11-13 09:37:42 +08:00
@whalegia 理论上可以这样做的.
不过我建议自己写时还是把同类型的一起赋值吧.
要注意两边的个数问题.
a, b = 2 #not match Typeerror
a, b = 1, 2 3 # too many values, valueError

可以用 a, *b = 1,2,3
这也是*的一个实用的地方了.
whalegia
2014-11-13 09:43:55 +08:00
@staticor 多谢!
msg7086
2014-11-13 11:53:37 +08:00
@CupTools 赶快去查查词典,以后可别在重要场合搞错这个成语

@cloud107202 楼主躺枪
cloud107202
2014-11-13 12:14:51 +08:00
@msg7086 ^_^
CupTools
2014-11-13 13:24:10 +08:00
@msg7086 @whalegia 我初中没毕业
O14
2014-11-13 14:48:47 +08:00
楼主学Python,还是搜一下看《简明Python教程》吧
ryd994
2014-11-13 15:07:03 +08:00
那和%2比呢?
@Sunyanzi
forreal
2014-11-13 20:08:40 +08:00
gao
Sunyanzi
2014-11-13 21:05:23 +08:00
@ryd994 & 1 和 % 2 虽然实现原理大相径庭但结果是一样的 ... 殊途同归的感觉 ..?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/146050

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX