Python通向百万程序员的秘籍!这些技巧你知道吗?99%的不知道!

Python通向百万程序员的秘籍!这些技巧你知道吗?99%的不知道!

Python神奇方法是指一些允许在自定义类中增加“神奇”功能方法。而在Python官方文档中,有关这些方法的介绍或描述不仅内容分散,而且组织结构也相对松散。本文便对Python神奇方法做了系统的梳理。对于初学者亦或Python行家,都或多或少的会有些帮助。

Python神奇方法是指一些允许在自定义类中增加“神奇”功能方法。而在Python官方文档中,有关这些方法的介绍或描述不仅内容分散,而且组织结构也相对松散。本文便对Python神奇方法做了系统的梳理。对于初学者亦或Python行家,都或多或少的会有些帮助。

进群:548377875   即可获取数十套PDF哦!

Python通向百万程序员的秘籍!这些技巧你知道吗?99%的不知道!

简介

何为神奇方法呢?它们是面向Python中的一切,是一些特殊的方法允许在自己的定义类中定义增加“神奇”的功能它们总是使用双下划线(比如__init__或__lt__),但它们的文档没有很好地把它们表现出来。所有这些神奇方法都出现在Python的官方文档中,但内容相对分散,组织结构也显得松散。还有你会难以发现一个实例(虽然他们被设计很棒,在语言参考中被详细描述,可之后就会伴随着枯燥的语法描述等)。

为了弥补Python官方文档的这些缺陷,作者整理了这篇有关magic method的文章,旨在用作教程、复习或参考文档。

Python通向百万程序员的秘籍!这些技巧你知道吗?99%的不知道!

如下,是是__init__和__del__的例子:

from os.path import join

class FileObject:

'''对文件对象的包装,确保文件关闭时得到删除'''

def __init__(self,filepath='~',filename='sample.txt'):

# 按filepath,读写模式打开名为filename的文件

self.file=open(join(filepath,filename),'r+')

def __del__(self):

self.file.close()

del self.file

自定义类中运用操作符

神奇方法比较:

Python有一大堆magic method,旨在使用运算符实现对象之间的直观比较,而非别扭的方法调用。它们还提供了一种方法来覆盖用于对象比较的认Python行为。下面是这些方法的列表以及它们的作用:

__cmp__(self,other)

__cmp__是神奇方法中最基础的一个。实际上它实现所有比较操作符行为(<,==,!=,等),但它有可能不按你想要的方法工作(例如,一个实例是否等于另一个这取决于比较的准则,以及一个实例是否大于其他的这也取决于其他的准则)。如果self < other,那__cmp__应当返回一个负整数;如果self == other,则返回0;如果self > other,则返回正整数。它通常是最好的定义,而不需要你一次就全定义好它们,但当你需要用类似的准则进行所有的比较时,__cmp__会是一个很好的方式,帮你节省重复性和提高明确度。

__eq__(self,other)

定义了相等操作符,==的行为。

__ne__(self,other)

定义了不相等操作符,!=的行为。

__lt__(self,other)

定义了小于操作符,<的行为。

__gt__(self,other)

定义了大于操作符,>的行为。

__le__(self,other)

定义了小于等于操作符,<=的行为。

__ge__(self,other)

定义了大于等于操作符,>=的行为。

一个例子,设想对单词进行类定义。我们可能希望按照内部对字符串的认比较行为,即字典序(通过字母)来比较单词,也希望能够基于某些其他的准则,像是长度或音节数。在本例中,我们通过单词长度排序,以下给出实现:

class Word(str):

'''单词类,比较定义是基于单词长度的'''

def __new__(cls,word):

# 注意,我们使用了__new__,这是因为str是一个不可变类型,

# 所以我们必须更早地初始化它(在创建时)

if ' ' in word:

print "单词内含有空格,截断到第一部分"

word = word[:word.index(' ')] # 在出现第一个空格之前全是字符了现在

return str.__new__(cls,word)

def __gt__(self,other):

return len(self) > len(other)

def __lt__(self,other):

return len(self) < len(other)

def __ge__(self,other):

return len(self) >= len(other)

def __le__(self,other):

return len(self) <= len(other)

神奇方法数字:

就像你可以通过重载比较操作符的途径来创建你自己的类实例,你同样可以重载数字操作符。

一元操作符:

一元运算和函数仅有一个操作数,比如负数,绝对值等。

__pos__(self)

实现一元正数的行为(如:+some_object)

__neg__(self)

实现负数的行为(如: -some_object)

__abs__(self)

实现内建abs()函数的行为

__invert__(self)

实现用~操作符进行的取反行为。

常规算数操作符:

现在我们涵盖了基本的二元运算符:+,-,*等等。其中大部分都是不言自明的。

__add__(self,other)

实现加法

__sub__(self,other)

实现减法

__mul__(self,other)

实现乘法

__floordiv__(self,other)

实现地板除法,使用//操作符

__div__(self,other)

实现传统除法,使用/操作符

__truediv__(self,other)

实现真正除法。注意,只有当你from __future__ import division时才会有效

__mod__(self,other)

实现求模,使用%操作符

__divmod__(self,other)

实现内建函数divmod()的行为

__pow__(self,other)

实现乘方,使用**操作符

__lshift__(self,other)

实现左按位位移,使用<<操作符

__rshift__(self,other)

实现右按位位移,使用>>操作符

__and__(self,other)

实现按位与,使用&操作符

__or__(self,other)

实现按位或,使用|操作符

__xor__(self,other)

实现按位异或,使用^操作符

反射算数操作符:

首先举个例子:some_object + other。这是“常规的”加法。而反射其实相当于一回事,除了操作数改变了改变下位置:other + some_object。在大多数情况下,反射算术操作的结果等价于常规算术操作,所以你尽可以在刚重载完__radd__就调用__add__。干脆痛快:

__radd__(self,other)

实现反射加法

__rsub__(self,other)

实现反射减法

__rmul__(self,other)

实现反射乘法

__rfloordiv__(self,other)

实现反射地板除,用//操作符

__rdiv__(self,other)

实现传统除法,用/操作符

__rturediv__(self,other)

实现真实除法,注意,只有当你from __future__ import division时才会有效

__rmod__(self,other)

实现反射求模,用%操作符

__rdivmod__(self,other)

实现内置函数divmod()的长除行为,当调用divmod(other,self)时被调用

__rpow__(self,other)

实现反射乘方,用**操作符

__rlshift__(self,other)

实现反射的左按位位移,使用<<操作符

__rrshift__(self,other)

实现反射的右按位位移,使用>>操作符

__rand__(self,other)

实现反射的按位与,使用&操作符

__ror__(self,other)

实现反射的按位或,使用|操作符

__rxor__(self,other)

实现反射的按位异或,使用^操作符

增量赋值:

Python也有各种各样的神奇方法允许用户自定义增量赋值行为。

这些方法都不会有返回值,因为赋值在Python中不会有任何返回值。反而它们只是改变类的状态。列表如下:

__rxor__(self,other)

实现加法和赋值

__isub__(self,other)

实现减法和赋值

__imul__(self,other)

实现乘法和赋值

__ifloordiv__(self,other)

实现地板除和赋值,用//=操作符

__idiv__(self,other)

实现传统除法和赋值,用/=操作符

__iturediv__(self,other)

实现真实除法和赋值,注意,只有当你from __future__ import division时才会有效

__imod__(self,other)

实现求模和赋值,用%=操作符

__ipow__(self,other)

实现乘方和赋值,用**=操作符

__ilshift__(self,other)

实现左按位位移和赋值,使用<<=操作符

__irshift__(self,other)

实现右按位位移和赋值,使用>>=操作符

__iand__(self,other)

实现按位与和赋值,使用&=操作符

__ior__(self,other)

实现按位或和赋值,使用|=操作符

__ixor__(self,other)

实现按位异或和赋值,使用^=操作符

类型转换的神奇方法

Python也有一组神奇方法被设计用来实现内置类型转换函数的行为,如float()。

__int__(self)

实现到int的类型转换

__long__(self)

实现到long的类型转换

__float__(self)

实现到float的类型转换

__complex__(self)

实现到复数的类型转换

__oct__(self)

实现到8进制的类型转换

__hex__(self)

实现到16进制的类型转换

__index__(self)

实现一个当对象被切片到int的类型转换。如果你自定义一个数值类型,考虑到它可能被切片,所以你应该重载__index__。

__trunc__(self)

当math.trunc(self)被调用调用。__trunc__应当返回一个整型的截断,(通常是long)。

__coerce__(self,other)

方法用来实现混合模式的算术。如果类型转换不可能那__coerce__应当返回None。否则,它应当返回一对包含self和other(2元组),且调整到具有相同的类型。

描述自定义

一个字符串来说明一个类这通常是有用的。在Python中提供了一些方法让你可以在你自己的类中自定义内建函数返回你的类行为的描述。

__str__(self)

当你定义的类中一个实例调用str(),用于给它定义行为

__repr__(self)

当你定义的类中一个实例调用repr(),用于给它定义行为。str()repr()主要的区别在于它的阅读对象。repr()产生的输出主要为计算机可读(在很多情况下,这甚至可能是一些有效的Python代码),而str()则是为了让人类可读。

__unicode__(self)

当你定义的类中一个实例调用了unicode(),用于给它定义行为。unicode()像是str(),只不过它返回一个unicode字符串。警惕!如果用户用你的类中的一个实例调用str(),而你仅定义了__unicode__(),那它是不会工作的。以防万一,你应当总是定义好__str__(),哪怕用户不会使用unicode。

__hash__(self)

当你定义的类中一个实例调用了hash(),用于给它定义行为。它必须返回一个整型,而且它的结果是用于来在字典中作为快速键比对。

__nonzero__(self)

当你定义的类中一个实例调用了bool(),用于给它定义行为。返回True或False,取决于你是否考虑一个实例是True或False的。

我们已经相当漂亮地干完了神奇方法无聊的部分(无示例),至此我们已经讨论了一些基础的神奇方法,是时候让我们向高级话题移动了。

控制属性访问

Python通过神奇的方法实现了大量的封装,而不是通过明确的方法或字段修饰符。例如:

__getattr__(self,name)

你可以为用户在试图访问不存在(不论是存在或尚未建立)的类属性时定义其行为。这对捕捉和重定向常见的拼写错误,给出使用属性警告是有用的(只要你愿意,你仍旧可选计算,返回那个属性)或抛出一个AttributeError异常。这个方法只适用于访问一个不存在的属性,所以,这不算一个真正封装的解决之道。

__setattr__(self,name,value)

不像__getattr__,__setattr__是一个封装的解决方案。它允许你为一个属性赋值时候的行为,不论这个属性是否存在。这意味着你可以给属性值的任意变化自定义规则。然而,你需要在意的是你要小心使用__setattr__,在稍后的列表中会作为例子给出。

__delattr__

这等价于__setattr__,但是作为删除属性而不是set它们。它需要相同的预防措施,就像__setattr__,防止无限递归(当在__delattr__中调用del self.name会引起无限递归)。

__getattribute__(self,name)

__getattribute__良好地适合它的同伴们__setattr__和__delattr__。可我却不建议你使用它。

__getattribute__只能在新式类中使用(在Python的最新版本中,所有的类都是新式类,在稍旧的版本中你可以通过继承object类来创建一个新式类。它允许你定规则,在任何时候不管一个属性的值那时候是否可访问的。)它会因为他的同伴中的出错连坐受到某些无限递归问题的困扰(这时你可以通过调用基类的__getattribute__方法来防止发生)。当__getattribute__被实现而又只调用了该方法如果__getattribute__被显式调用或抛出一个AttributeError异常,同时也主要避免了对__getattr__的依赖。这个方法可以使用,不过我不推荐它是因为它有一个小小的用例(虽说比较少见,但我们需要特殊行为以获取一个值而不是赋值)以及它真的很难做到实现0bug。

你可以很容易地在你自定义任何类属性访问方法时引发一个问题。参考这个例子:

def __setattr__(self,value):

self.name = value

# 当每次给一个属性赋值时,会调用__setattr__(),这就形成了递归

# 因为它真正的含义是 self.__setattr__('name',value)

# 所以这方法不停地调用它自己,变成了一个无法退出的递归最终引发crash

def __setattr__(self,value):

self.__dict__[name] = value # 给字典中的name赋值

# 在此自定义行为

以下是一个关于特殊属性访问方法的实际例子(注意,我们使用super因为并非所有类都有__dict__类属性):

class AccessCounter:

'''一个类包含一个值和实现了一个访问计数器。

当值每次发生变化时,计数器+1'''

def __init__(self,val):

super(AccessCounter,self).__setattr__('counter',0)

super(AccessCounter,self).__setattr__('value',val)

def __setattr__(self,value):

if name == 'value':

super(AccessCounter,self.counter + 1)

# Make this unconditional.

# 如果你想阻止其他属性被创建,抛出AttributeError(name)异常

super(AccessCounter,self).__setattr__(name,value)

def __delattr__(self,name)

if name == 'value':

super(AccessCounter,self.counter + 1)

super(AccessCounter,self).__delattr__(name)

制作自定义序列

很有多种方式可以让你的类表现得像内建序列(字典,元组,列表,字符串等)。这些是我迄今为止最喜欢的神奇方法了,因为不合理的控制它们赋予了你一种魔术般地让你的类实例整个全局函数数组漂亮工作的方式。

__len__(self)

返回容器的长度。部分protocol同时支持可变和不可变容器

__getitem__(self,key)

定义当某一个item被访问时的行为,使用self[key]表示法。这个同样也是部分可变和不可变容器protocol。这也可抛出适当的异常:TypeError 当key的类型错误,或没有值对应Key时。

__setitem__(self,key,value)

定义当某一个item被赋值时候的行为,使用self[key]=value表示法。这也是部分可变和不可变容器protocol。再一次重申,你应当在适当之处抛出KeyError和TypeError异常。

__delitem__(self,key)

定义当某一个item被删除(例如 del self[key])时的行为。这仅是部分可变容器的protocol。在一个无效key被使用后,你必须抛出一个合适的异常。

__iter__(self)

应该给容器返回一个迭代器。迭代器会返回若干内容,大多使用内建函数iter()表示。当一个容器使用形如for x in container:的循环。迭代器本身就是其对象,同时也要定义好一个__iter__方法来返回自身。

__reversed__(self)

当定义调用内建函数reversed()时的行为。应该返回一个反向版本的列表。

__contains__(self,item)

__contains__为成员关系,用in和not in测试时定义行为。那你会问这个为何不是一个序列的protocol的一部分?这是因为当__contains__未定义,Python就会遍历序列,如果遇到正在寻找的item就会返回True。

__concat__(self,other)

最后,你可通过__concat__定义你的序列和另外一个序列的连接。应该从self和other返回一个新构建的序列。当调用2个序列时__concat__涉及操作符+

在我们的例子中,让我们看一下一个list实现的某些基础功能性的构建。可能会让你想起你使用的其他语言(比如Haskell)。

class FunctionalList:

'''类覆盖了一个list的某些额外的功能性魔法,像head,

tail,init,last,drop,and take'''

def __init__(self,values=None):

if values is None:

self.values = []

else:

self.values = values

def __len__(self):

return len(self.values)

def __getitem__(self,key):

# 如果key是非法的类型和值,那么list valuse会抛出异常

return self.values[key]

def __setitem__(self,value):

self.values[key] = value

def __delitem__(self,key):

del self.values[key]

def __iter__(self):

return iter(self.values)

def __reversed__(self):

return reversed(self.values)

def append(self,value):

self.values.append(value)

def head(self):

# 获得第一个元素

return self.values[0]

def tail(self):

# 获得在第一个元素后的其他所有元素

return self.values[1:]

def init(self):

# 获得除最后一个元素的序列

return self.values[:-1]

def last(last):

# 获得最后一个元素

return self.values[-1]

def drop(self,n):

# 获得除前n个元素的序列

return self.values[n:]

def take(self,n):

# 获得前n个元素

return self.values[:n]

反射

你也可以通过定义神奇方法来控制如何反射使用内建函数isinstance()和issubclass()的行为。这些神奇方法是:

__instancecheck__(self,instance)

检查一个实例是否是你定义类中的一个实例(比如,isinstance(instance,class))

__subclasscheck__(self,subclass)

检查一个类是否是你定义类的子类(比如,issubclass(subclass,class))

调用对象

这是Python中一个特别的神奇方法,它允许你的类实例函数。所以你可以“调用”它们,把他们当做参数传递给函数等等。这是另一个强大又便利的特性让Python的编程变得更可爱了。

__call__(self,[args…])

允许类实例函数一样被调用。本质上,这意味着x()等价于x.__call__()。注意,__call__需要的参数数目是可变的,也就是说可以对任何函数按你的喜好定义参数的数目定义__call__。

__call__可能对于那些经常改变状态的实例来说是极其有用的。“调用”实例是一种顺应直觉且优雅的方式来改变对象的状态。下面一个例子是一个类表示一个实体在一个平面上的位置:

class Entity:

'''描述实体的类,被调用的时候更新实体的位置'''

def __init__(self,size,x,y):

self.x,self.y = x,y

self.size = size

def __call__(self,y):

'''改变实体的位置'''

self.x,y

#省略...

上下文管理器

上下文管理允许对对象进行设置和清理动作,用with声明进行已经封装的操作。上下文操作的行为取决于2个神奇方法

__enter__(self)

定义块用with声明创建出来时上下文管理应该在块开始做什么。

__exit__(self,exception_type,exception_value,traceback)

定义在块执行(或终止)之后上下文管理应该做什么。

你也可以使用这些方法去创建封装其他对象通用的上下文管理。看下面的例子:

class Closer:

'''用with声明一个上下文管理用一个close方法自动关闭一个对象'''

def __init__(self,obj):

self.obj = obj

def __enter__(self):

return self.obj # 绑定目标

def __exit__(self,exception_val,trace):

try:

self.obj.close()

except AttributeError: #obj不具备close

print 'Not closable.'

return True # 成功处理异常

以下是一个对于Closer实际应用的一个例子,使用一个FTP连接进行的演示(一个关闭套接字):

>>> from magicmethods import Closer

>>> from ftplib import :;;

>>> with Closer(FTP('ftp.somsite.com')) as conn:

... conn.dir()

...

# 省略的输出

>>> conn.dir()

# 一个很长的AttributeError消息, 不能关闭使用的一个连接

>>> with Closer(int(5)) as i:

... i += 1

...

Not closeable.

>>> i

6

构建描述符对象

描述符可以改变其他对象,也可以是访问类中任一的getting,setting,deleting。

作为一个描述符,一个类必须至少实现__get__,__set__,和__delete__中的一个。让我们快点看一下这些神奇方法吧:

__get__(self,instance,owner)

当描述符的值被取回时定义其行为。instance是owner对象的一个实例,owner是所有类。

__set__(self,value)

当描述符的值被改变时定义其行为。instance是owner对象的一个实例,value是设置的描述符的值

__delete__(self,instance)

当描述符的值被删除时定义其行为。instance是owner对象的一个实例。

现在,有一个有用的描述符应用例子:单位转换策略

class Meter(object):

'''米描述符'''

def __init__(self,value=0.0):

self.value = float(value)

def __get__(self,owner):

return self.value

def __set__(self,value):

self.value = float(value)

class Foot(object):

'''英尺描述符'''

def __get__(self,owner):

return instance.meter * 3.2808

def __set__(self,value):

instance.meter = float(value) / 3.2808

class distance(object):

'''表示距离的类,控制2个描述符:feet和meters'''

meter = Meter()

foot = Foot()

总结

这份指南的目标就是让任何人都能读懂它,不管读者们是否具备Python或面向对象的编程经验。如果你正准备学习Python,那你已经获得了编写功能丰富、优雅、易用的类的宝贵知识。如果你是一名中级Python程序员,你有可能已经拾起了一些概念、策略和一些好的方法来减少你编写的代码量。如果你是一名Python专家,你可能已经回顾了某些你可能已经遗忘的知识点,或者你又又有一些新的发现。不管你的经验等级如何,希望你在这次Python神奇方法之旅中有所收获!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实