QQ登录

只需一步,快速开始

开启左侧

Python学习第六十一天—类和对象10-运算相关的魔法方法(下)

[复制链接]
15271953841 发表于 2024-3-25 22:10:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
运算相关的魔法方法(下)
一、位运算:二进制,逢二进一。常见的位运算有:按位与运算、按位异或运算、按位或运算,按位非运算(按位取反运算),这是之前学习的and,or,not这三个逻辑运算符,只要左右两个操作数的结果为True,那么and运算结果才为True;只要左右任意一个操作数的结果为True,那么or运算符的结果就为True;not就是取反,not True就是False,not False就是True。逻辑运算符通常用在if语句、while语句,这种需要通过条件来判断是否执行的情景。那么,按位与、或、非,和and,or,not执行的逻辑是类似的,只不过所应用的场景是不一样的。按位与、或、非的运算符是对两个整数进行位运算。
(一)按位与运算,符号是“&”
>>>3 & 2
2
>>>3 & 4
0
>>>bin(2)           (0b表示这是一个二进制字符串)
'0b10'
>>>bin(3)
'0b11'
>>>bin(4)
'0b100'
这&是按位与运算,只有当相同位的值均为1时,结果对应的位才是1,例如2的二进制是010,3的二进制是011,由于它们只有第2位同是1,所以按位与的结果是2&3的二进制是010,也就是十进制数2;3的二进制是011,4的二进制是100,由于它们并没有相同的位同时是1,所以按位与运算之后,它的结果是3&4的二进制是000,也就是十进制数0;

(二)按位或运算,运算符是“|”,在回车键的旁边或上面。
>>>3 | 2
3
>>>3 | 4
7
例如2的二进制是010,3的二进制是011,只要其中某个位的值是1,那么对应二进制结果的位也是1,所以2 | 3的二进制是011,也就是十进制数3;3的二进制是011,4的二进制是100,所以3 | 4的二进制是111,也就是十进制数7;

(三)按位非运算,运算符号是波浪线“~”,在键盘的左上角第二行开头
>>>~2
-3
>>>~3
-4
>>>~4
-5
>>>~100
-101
这个涉及到补码的概念,感兴趣的同学,可以自己收一收。大概就是“按位取反,末尾加一”。
(四)按位异或运算,运算符号是“^”
当两个相同的二进制位的值不一样的时候,那么结果对应的二进制位的值为1.
>>>3 ^ 2
1
>>>3 ^ 4
7
例如2的二进制是010,3的二进制是011,前两位上的值都相同,最后一位的二进制值不一样,所以最后一位对应二进制结果的位也是1,所以2 ^ 3的二进制是001,也就是十进制数1;3的二进制是011,4的二进制是100,它们的三个位上的二进制的值都不一样,所以3 ^ 4的二进制结果是111,也就是十进制数7;

(五)按位左移运算 “<<”;按位右移运算 “>>”
运算符的左侧是运算对象,运算符的右侧是指定要移动的位数。
>>>bin(8)
'0b1000'
>>>8 >> 2           (把8右移2位,1000右移2位,右边的两个0被切掉了,就变成了10,对应的十进制数就是2)
2
>>>8 >> 3
1
>>>8 << 2            (相当于把1000左移2位,右边填充了两个0,变成了100000,对应的十进制数就是32)
32
>>>8 << 3
64
>>>8 // pow(2,2)        (右移n位是除以2的n次方)
2
>>>8 // pow(2,3)        (右移n位是除以2的n次方,因为移位的结果必须是整数,所以我们这里用地板除,)
1
>>>bin(9)               (因为移位它会丢失数据的,例如9的二进制是1001,它右移两位,那么最低位的1会丢失,得到二进制数10,就是十进制数2)
'0b1001'
>>>9 >> 2
2
>>>8 * pow(2,2)           (相反,左移n位就是乘以2的n次方)
32
>>>8 * pow(2,3)
64
>>>8 >> -2                 (另外,左移、右移多少位的运算符右边的表示移动多少位的这个数不能为负数,否则会发出ValueError的异常。)
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    8 >> -2
ValueError: negative shift count

(六)优先级 | 、 ^ 、 &优先级依次递增的,~x按位非(翻转)与+号(+x)、-号(-x)同一级,比按位| 、 ^ 、 &三个运算符级别高。

(七)math——数学函数
>>>0.1+0.2
0.30000000000000004
>>>0.1 + 0.2 == 0.3
False
>>>import math
>>>0.1 + 0.2 == 0.3 + math.ulp(0.3)
True
Math里面有一个ulp函数,表示对应浮点数的最低有效位。

(八)全世界有了很多年的“π”一直用错了,用Tau是更合适的选择,搜索观看bilibili视频《pi是错的,快用Tau吧》

(九)index方法
>>>class C:
    def __index__(self):
        print("被拦截了~")
        return 3

   
>>>c = C()
>>>c[2]               (这个对象发生索引的时候,它就会被拦截,返回一个3,但是不行,这里没有用,报错了)
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    c[2]
TypeError: 'C' object is not subscriptable
>>>s="FishC"            (其实当对象作为索引值和参数的时候,才会去触发这个__index__方法)
>>>s[c]                 (把对象作为索引去用的时候,它就会被拦截了,把这个“3”作为索引值,相当于说去找到s对象的下标索引为“3”的这个元素,是这个“h”
被拦截了~
'h'
>>>bin(c)                 (把它传入bin里面,把“3”作为参数,给了这个bin)
被拦截了~
'0b11'
很容易被误认为是由对象的索引访问触发的,但这个不是,由对象的索引访问触发,后面还要学习,它有专用的魔法方法与之呼应,而这个呢?是让对象作为索引值被访问,还会触发,真的是离了个大谱就是了,名字起得不好。

客服热线
400-1234-888 周一至周日:09:00 - 21:00
公司地址:襄阳市樊城区长虹路现代城5号楼188

创客帮MAKER.BAND青少年创客创意社区是一个融教育、科技、体育资讯为一体的综合服务平台,专注于教育创新、专注于科技体育、专注于教育资讯。

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表