一切皆对象。
“在Python中,魔法方法是指Python内部已经包含的,被双下划线所包围的方法,这些方法在进行特定的操作时会自动被调用,它们是Python面向对象下智慧的结晶,而使用Python的魔法方法可以使Python的自由度变得更高。”
首先我们先来看一下几个符号的“另类”使用:
反斜杠
\
在Python中主要有两种用法:
print("hello"\
"world")
不需要使用反斜杠的场景:
当出现具有定义、注释性质,规定范围的符号时,则不需要续行符就可以换行:
例如:[]
,()
,{}
,或者注释语句
annotion = ``` A is not
B ```
通过定义其他的符号进行分割的场景,例如 plotly
'''构造trace,配置相关参数'''
# 散点图
trace = go.Scatter(
x = random_x,
y = random_y,
mode = 'markers'
)
+= 与 =+
+=
在之前的推送中使用还算频繁,这里就简单辨别一下这两个区别:
首先变量可以分为不可变类型和可变类型,对于不可变类型例如字符串、元组、数字,无论是执行 a = a+b 还是 a += b,a 的内存地址都会变,即生成了新的变量;对于可变变量时,例如列表:
my_list = my_list + new_list,my_list 会成为一个新的变量;
my_list += new_list,my_list 内存地址并不会发生变化,相当于 extend。
从方法的背后魔法方法可以清楚的解释这种现象:
+= 背后的魔法方法是 __iadd__ +背后的魔法方法是 __add__ 如果一个类,没有实现 __iadd__方法的话,python就会退一步调用__add__方法 总体来说,可变类型都有__iadd__方法,而不可变类型没有__iadd__方法
举个魔法方法的小例子:
>>> list1 = [a,b,c]
>>> list2 =[1,2,3]
>>> list1.__add__(list2)
[a,b,c,1,2,3]
# reduce方法
>>> from functools import reduce
>>> reduce(list.__add__, (list1,list2))
[a,b,c,1,
2,3]
同理,=* 和 *=,区别是背后的魔法方法分别为__imul__和__mul__。在上述的场景中还可以使用 * 进行处理:
*
我们都知道,列表支持符号运算,例如+-*
;我们在列表生成式中也聊过迭代方式去快速进行列表处理,其中值得一提是itertools
内置模块,通过from itertools import chain
等方式调用。
*还可以用于列表解包后合并,
>>> list1 = [a,b,c]
>>> list2 =[1,2,3]
>>> [*list1,*list2]
[a,b,c,1,2,3]
“魔法方法是python内置方法,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法("__方法名__"),可以理解为重写内置函数。”
更多的魔法方法在原文链接包含详细解释。
推荐阅读
使用Python实现基本初等函数可视化
如何在 Rstudio 中使用 python 语言 (图文详解)
适用于任何学科| 10个好用的 Python数据可视化库
参考资料
magic-python:https://github.com/iswbm/magic-python
Hipeson: 关于python中的+、+=、、=
PPPPPython:python 的魔法方法是什么?
文末友情推荐
要想真正入门生物信息学建议务必购买全套书籍,一点一滴攻克计算机基础知识,书单在:什么,生信入门全套书籍仅需160 。如果大家没有时间自行慢慢摸索着学习,可以考虑我们生信技能树官方举办的学习班:
•数据挖掘学习班第5期(线上直播3周,马拉松式陪伴,带你入门),原价4800的数据挖掘全套课程, 疫情期间半价即可抢购。•生信爆款入门-第7期(线上直播4周,马拉松式陪伴,带你入门),原价9600的生信入门全套课程,疫情期间3.3折即可抢购。
如果你课题涉及到转录组,欢迎添加一对一客服:详见:你还在花三五万做一个单细胞转录组吗?