张飞软硬开源基于STM32 BLDC直流无刷电机驱动器开发视频套件,👉戳此立抢👈

如何让你的Python代码竟优雅又地道

马哥Linux运维 2019-02-03 12:35 次阅读

如果说优雅也有缺点的话,那就是你需要艰巨的工作才能得到它,需要良好的教育才能欣赏它。

—— Edsger Wybe Dijkstra

Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic。一般说地道(idiomatic)的python代码,就是指这份代码很pythonic。Python的语法和标准库设计,处处契合着pythonic的思想。而且Python社区十分注重编码风格一的一致性,他们极力推行和处处实践着pythonic。所以经常能看到基于某份代码P vs NP (pythonic vs non-pythonic)的讨论。pythonic的代码简练,明确,优雅,绝大部分时候执行效率高。阅读pythonic的代码能体会到“代码是写给人看的,只是顺便让机器能运行”畅快。

然而什么是pythonic,就像什么是地道的汉语一样,切实存在但标准模糊。import this可以看到Tim Peters提出的Python之禅,它提供了指导思想。许多初学者都看过它,深深赞同它的理念,但是实践起来又无从下手。PEP 8给出的不过是编码规范,对于实践pythonic还远远不够。如果你正被如何写出pythonic的代码而困扰,或许这份笔记能给你帮助。

Raymond Hettinger是Python核心开发者,本文提到的许多特性都是他开发的。同时他也是Python社区热忱的布道师,不遗余力地传授pythonic之道。这篇文章是网友Jeff Paine整理的他在2013年美国的PyCon的演讲的笔记。

如何让你的Python代码竟优雅又地道

术语澄清:本文所说的集合全都指collection,而不是set。

以下是正文。

本文是Raymond Hettinger在2013年美国PyCon演讲的笔记(视频, 幻灯片)。

示例代码和引用的语录都来自Raymond的演讲。这是我按我的理解整理出来的,希望你们理解起来跟我一样顺畅!

遍历一个范围内的数字

foriin[0,1,2,3,4,5]:

printi ** 2

foriinrange(6):

printi ** 2

更好的方法

foriinxrange(6):

printi ** 2

xrange会返回一个迭代器,用来一次一个值地遍历一个范围。这种方式会比range更省内存。xrange在Python 3中已经改名为range。

遍历一个集合

colors = ['red','green','blue','yellow']

foriinrange(len(colors)):

print colors[i]

更好的方法

forcolor incolors:

print color

反向遍历

colors = ['red','green','blue','yellow']

foriinrange(len(colors)-1, -1, -1):

print colors[i]

更好的方法

forcolor inreversed(colors):

print color

遍历一个集合及其下标

colors = ['red','green','blue','yellow']

foriinrange(len(colors)):

printi,'--->',colors[i]

更好的方法

fori,color inenumerate(colors):

printi,'--->',color

这种写法效率高,优雅,而且帮你省去亲自创建和自增下标。

当你发现你在操作集合的下标时,你很有可能在做错事。

遍历两个集合

names = ['raymond','rachel','matthew']

colors = ['red','green','blue','yellow']

n = min(len(names),len(colors))

foriinrange(n):

print names[i],'--->',colors[i]

forname,color inzip(names,colors):

print name,'--->',color

更好的方法

forname,color inizip(names,colors):

print name,'--->',color

zip在内存中生成一个新的列表,需要更多的内存。izip比zip效率更高。

注意:在Python 3中,izip改名为zip,并替换了原来的zip成为内置函数。

有序地遍历

colors = ['red','green','blue','yellow']

# 正序

forcolor insorted(colors):

print colors

# 倒序

forcolor insorted(colors,reverse=True):

print colors

自定义排序顺序

colors = ['red','green','blue','yellow']

def compare_length(c1,c2):

iflen(c1) < len(c2): return -1

iflen(c1) > len(c2): return1

return0

print sorted(colors,cmp=compare_length)

更好的方法

print sorted(colors, key=len)

第一种方法效率低而且写起来很不爽。另外,Python 3已经不支持比较函数了。

调用一个函数直到遇到标记

blocks = []

whileTrue:

block = f.read(32)

ifblock == '':

break

blocks.append(block)

更好的方法

blocks = []

forblock initer(partial(f.read,32),''):

blocks.append(block)

iter接受两个参数。第一个是你反复调用的函数,第二个是标记值。

译注:这个例子里不太能看出来方法二的优势,甚至觉得partial让代码可读性更差了。方法二的优势在于iter的返回值是个迭代器,迭代器能用在各种地方,set,sorted,min,max,heapq,sum……

在循环内识别多个退出点

def find(seq,target):

found = False

fori,value inenumerate(seq):

ifvalue == target:

found = True

break

ifnotfound:

return -1

returni

更好的方法

def find(seq,target):

fori,value inenumerate(seq):

ifvalue == target:

break

else:

return -1

returni

for执行完所有的循环后就会执行else。

译注:刚了解for-else语法时会困惑,什么情况下会执行到else里。有两种方法去理解else。传统的方法是把for看作if,当for后面的条件为False时执行else。其实条件为False时,就是for循环没被break出去,把所有循环都跑完的时候。所以另一种方法就是把else记成nobreak,当for没有被break,那么循环结束时会进入到else。

遍历字典的key

d = {'matthew': 'blue','rachel': 'green','raymond': 'red'}

forkind:

printk

forkind.keys():

ifk.startswith('r'):

deld[k]

什么时候应该使用第二种而不是第一种方法?当你需要修改字典的时候。

如果你在迭代一个东西的时候修改它,那就是在冒天下之大不韪,接下来发生什么都活该。

d.keys()把字典里所有的key都复制到一个列表里。然后你就可以修改字典了。

注意:如果在Python 3里迭代一个字典你得显示地写:list(d.keys()),因为d.keys()返回的是一个“字典视图”(一个提供字典key的动态视图的迭代器)。详情请看文档。

遍历一个字典的key和value

# 并不快,每次必须要重新哈希并做一次查找

forkind:

printk,'--->',d[k]

# 产生一个很大的列表

fork,vind.items():

printk,'--->',v

更好的方法

fork,vind.iteritems():

printk,'--->',v

iteritems()更好是因为它返回了一个迭代器。

注意:Python 3已经没有iteritems()了,items()的行为和iteritems()很接近。详情请看文档。

用key-value对构建字典

names = ['raymond','rachel','matthew']

colors = ['red','green','blue']

d = dict(izip(names,colors))

# {'matthew': 'blue', 'rachel': 'green', 'raymond': 'red'}

Python 3: d = dict(zip(names, colors))

用字典计数

colors = ['red','green','red','blue','green','red']

# 简单,基本的计数方法。适合初学者起步时学习。

d = {}

forcolor incolors:

ifcolor notind:

d[color] = 0

d[color] += 1

# {'blue': 1, 'green': 2, 'red': 3}

更好的方法

d = {}

forcolor incolors:

d[color] = d.get(color,0) + 1

# 稍微潮点的方法,但有些坑需要注意,适合熟练的老手。

d = defaultdict(int)

forcolor incolors:

d[color] += 1

用字典分组 — 第I部分和第II部分

names = ['raymond','rachel','matthew','roger',

'betty','melissa','judith','charlie']

# 在这个例子,我们按name的长度分组

d = {}

forname innames:

key = len(name)

ifkey notind:

d[key] = []

d[key].append(name)

# {5: ['roger', 'betty'], 6: ['rachel', 'judith'], 7: ['raymond', 'matthew', 'melissa', 'charlie']}

d = {}

forname innames:

key = len(name)

d.setdefault(key,[]).append(name)

更好的方法

d = defaultdict(list)

forname innames:

key = len(name)

d[key].append(name)

字典的popitem()是原子的吗?

d = {'matthew': 'blue','rachel': 'green','raymond': 'red'}

whiled:

key,value = d.popitem()

print key,'-->',value

popitem是原子的,所以多线程的时候没必要用包着它。

连接字典

defaults = {'color': 'red','user': 'guest'}

parser = argparse.ArgumentParser()

parser.add_argument('-u','--user')

parser.add_argument('-c','--color')

namespace = parser.parse_args([])

command_line_args = {k: vfork,vinvars(namespace).items()ifv}

# 下面是通常的作法,默认使用第一个字典,接着用环境变量覆盖它,最后用命令行参数覆盖它。

# 然而不幸的是,这种方法拷贝数据太疯狂。

d = defaults.copy()

d.update(os.environ)

d.update(command_line_args)

更好的方法

d = ChainMap(command_line_args, os.environ, defaults)

ChainMap在Python 3中加入。高效而优雅。

提高可读性

位置参数和下标很漂亮

但关键字和名称更好

第一种方法对计算机来说很便利

第二种方法和人类思考方式一致

用关键字参数提高函数调用的可读性

twitter_search('@obama', False, 20, True)

更好的方法

twitter_search('@obama', retweets=False, numtweets=20, popular=True)

第二种方法稍微(微秒级)慢一点,但为了代码的可读性和开发时间,值得。

用namedtuple提高多个返回值的可读性

# 老的testmod返回值

doctest.testmod()

# (0, 4)

# 测试结果是好是坏?你看不出来,因为返回值不清晰。

更好的方法

# 新的testmod返回值, 一个namedtuple

doctest.testmod()

# TestResults(failed=0, attempted=4)

namedtuple是tuple的子类,所以仍适用正常的元组操作,但它更友好。

创建一个nametuple

TestResults = namedTuple('TestResults', ['failed', 'attempted'])

unpack序列

p = 'Raymond','Hettinger',0x30,'python@example.com'

# 其它语言的常用方法/习惯

fname = p[0]

lname = p[1]

age = p[2]

email = p[3]

更好的方法

fname, lname, age, email = p

第二种方法用了unpack元组,更快,可读性更好。

更新多个变量的状态

def fibonacci(n):

x = 0

y = 1

foriinrange(n):

printx

t = y

y = x + y

x = t

更好的方法

def fibonacci(n):

x,y = 0,1

foriinrange(n):

printx

x,y = y,x + y

第一种方法的问题

x和y是状态,状态应该在一次操作中更新,分几行的话状态会互相对不上,这经常是bug的源头。

操作有顺序要求

太底层太细节

第二种方法抽象层级更高,没有操作顺序出错的风险而且更效率更高。

同时状态更新

tmp_x = x + dx *t

tmp_y = y + dy *t

tmp_dx = influence(m,x,y,dx,dy,partial='x')

tmp_dy = influence(m,x,y,dx,dy,partial='y')

x = tmp_x

y = tmp_y

dx = tmp_dx

dy = tmp_dy

更好的方法

x,y,dx,dy = (x + dx *t,

y + dy *t,

influence(m,x,y,dx,dy,partial='x'),

influence(m,x,y,dx,dy,partial='y'))

效率

优化的基本原则

除非必要,别无故移动数据

稍微注意一下用线性的操作取代O(n**2)的操作

总的来说,不要无故移动数据

连接字符串

names = ['raymond','rachel','matthew','roger',

'betty','melissa','judith','charlie']

s = names[0]

forname innames[1:]:

s += ', ' + name

prints

更好的方法

print ', '.join(names)

更新序列

names = ['raymond','rachel','matthew','roger',

'betty','melissa','judith','charlie']

del names[0]

# 下面的代码标志着你用错了数据结构

names.pop(0)

names.insert(0,'mark')

更好的方法

names = deque(['raymond','rachel','matthew','roger',

'betty','melissa','judith','charlie'])

# 用deque更有效率

del names[0]

names.popleft()

names.appendleft('mark')

装饰器和上下文管理

用于把业务和管理的逻辑分开

分解代码和提高代码重用性的干净优雅的好工具

起个好名字很关键

记住蜘蛛侠的格言:能力越大,责任越大

使用装饰器分离出管理逻辑

# 混着业务和管理逻辑,无法重用

def web_lookup(url,saved={}):

ifurl insaved:

returnsaved[url]

page = urllib.urlopen(url).read()

saved[url] = page

returnpage

更好的方法

@cache

def web_lookup(url):

returnurllib.urlopen(url).read()

注意:Python 3.2开始加入了functools.lru_cache解决这个问题。

分离临时上下文

# 保存旧的,创建新的

old_context = getcontext().copy()

getcontext().prec = 50

print Decimal(355) / Decimal(113)

setcontext(old_context)

更好的方法

with localcontext(Context(prec=50)):

print Decimal(355) / Decimal(113)

译注:示例代码在使用标准库decimal,这个库已经实现好了localcontext。

如何打开关闭文件

f = open('data.txt')

try:

data = f.read()

finally:

f.close()

更好的方法

with open('data.txt')asf:

data = f.read()

如何使用锁

# 创建锁

lock = threading.Lock()

# 使用锁的老方法

lock.acquire()

try:

print'Critical section 1'

print'Critical section 2'

finally:

lock.release()

更好的方法

# 使用锁的新方法

with lock:

print'Critical section 1'

print'Critical section 2'

分离出临时的上下文

try:

os.remove('somefile.tmp')

except OSError:

pass

更好的方法

with ignored(OSError):

os.remove('somefile.tmp')

ignored是Python 3.4加入的, 文档。

注意:ignored 实际上在标准库叫suppress(译注:contextlib.supress).

试试创建你自己的ignored上下文管理器。

@contextmanager

def ignored(*exceptions):

try:

yield

except exceptions:

pass

把它放在你的工具目录,你也可以忽略异常

译注:contextmanager在标准库contextlib中,通过装饰生成器函数,省去用__enter__和__exit__写上下文管理器。详情请看文档。

分离临时上下文

# 临时把标准输出重定向到一个文件,然后再恢复正常

with open('help.txt','w')asf:

oldstdout = sys.stdout

sys.stdout = f

try:

help(pow)

finally:

sys.stdout = oldstdout

更好的写法

with open('help.txt','w')asf:

with redirect_stdout(f):

help(pow)

redirect_stdout在Python 3.4加入(译注:contextlib.redirect_stdout), bug反馈。

实现你自己的redirect_stdout上下文管理器。

@contextmanager

def redirect_stdout(fileobj):

oldstdout = sys.stdout

sys.stdout = fileobj

try:

yield fieldobj

finally:

sys.stdout = oldstdout

简洁的单句表达

两个冲突的原则:

一行不要有太多逻辑

不要把单一的想法拆分成多个部分

Raymond的原则:

一行代码的逻辑等价于一句自然语言

列表解析和生成器

result = []

foriinrange(10):

s = i ** 2

result.append(s)

print sum(result)

更好的方法

print sum(i**2 for i in xrange(10))

第一种方法说的是你在做什么,第二种方法说的是你想要什么。

原文标题:让你的 Python 代码优雅又地道

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

小梅哥FPGA设计思想与验证方法视频教程

刚刚录制了一个fpga开发流程的视频,该视频为投石问路,主要是想听听大家对于小梅哥在录制视频时需要注意的内容以及希望系列
发表于 03-24 00:00 37952次 阅读
小梅哥FPGA设计思想与验证方法视频教程

什么是迭代器?我们为什么要使用迭代器?

事实上,迭代器是一个伴随着迭代器模式(Iterator Pattern)而生的抽象概念,其目的是分离....
的头像 AI科技大本营 发表于 07-21 07:45 21次 阅读
什么是迭代器?我们为什么要使用迭代器?

【Toybrick RK3399Pro AI开发板试用体验】ACT III:开发环境搭建python升级3.6,安装opencv等

又到周末,腾出空来玩板子,之前把wifi连接上了,现在肯定是配置开发环境。 之前一直是玩ubuntu的对feroda不是很熟悉,但是li...
发表于 07-20 22:56 158次 阅读
【Toybrick RK3399Pro AI开发板试用体验】ACT III:开发环境搭建python升级3.6,安装opencv等

软件测试的定义及如何进行分类

1.软件测试的定义: 官方释义:a.用来促进鉴定软件的正确性、完整性、安全性和质量的过程。b.是一种....
的头像 ARM嵌入式Linux之家 发表于 07-20 09:58 107次 阅读
软件测试的定义及如何进行分类

国内首款支持源码与二进制文件的漏洞扫描工具的性能及优势

第三方代码的使用是企业能够快速高效建立新系统、新产品、新平台的关键因素,能大幅度缩短开发周期,减少人....
发表于 07-20 08:20 25次 阅读
国内首款支持源码与二进制文件的漏洞扫描工具的性能及优势

韩国开发出三进制半导体,以后的计算机代码要加上2了?

三星已经在芯片代工业务部门验证这一技术。
的头像 嵌入式资讯精选 发表于 07-19 17:18 338次 阅读
韩国开发出三进制半导体,以后的计算机代码要加上2了?

我什么时候应该使用NDEF_writeNDEF()和TT4_WriteURI()?

M24SR Cube扩展示例代码 以上来自于谷歌翻译 以下为原文 M24SR Cube Expansion example code...
发表于 07-19 11:48 168次 阅读
我什么时候应该使用NDEF_writeNDEF()和TT4_WriteURI()?

Uber发布“柏拉图研究对话系统,程序员们可以轻松了!

不写代码也能玩转AI
的头像 人工智能观察 发表于 07-19 10:25 151次 阅读
Uber发布“柏拉图研究对话系统,程序员们可以轻松了!

如何实现I2c主电机控制中心的代码

你好,在我以前的帖子中,我确信关于MCC如何设置它们我有一些注册问题,但是我已经确认了注册是正确的。使用调试器,我发现当...
发表于 07-19 09:29 8次 阅读
如何实现I2c主电机控制中心的代码

加拿大大四学霸,天才程序员和他的逆天语言模型

一位来自加拿大的大四学霸,开发了一款”Deep TabNine“代码补全工具,实现了这一大胆的想法。
的头像 新机器视觉 发表于 07-19 09:03 154次 阅读
加拿大大四学霸,天才程序员和他的逆天语言模型

浅析Linux的Pip命令

一、说明 pip是一个安装和管理Python包的工具
发表于 07-19 08:42 53次 阅读
浅析Linux的Pip命令

基于linux的python调试

之前一直在window下写python脚本,习惯用eclipse调试编辑,突然换到在linux环境下,有点不适应。。。...
发表于 07-19 08:22 98次 阅读
基于linux的python调试

python的入门考试题免费下载

本文档的主要内容详细介绍的是python的入门考试题免费下载。
发表于 07-19 08:00 15次 阅读
python的入门考试题免费下载

浅析64B//66B编码

作者:黄刚 上文说完了8B/10B之后,我们再来说说貌似更复杂的64B/66B编码。很多人可能在想,8B/10B编码主要作用的优化直流...
发表于 07-19 07:35 7次 阅读
浅析64B//66B编码

目标误差配方错误

嗨,我想写一个简单的LED电压表程序,并可以真正使用一些帮助。最初我有很多PLIB错误,但是我安装了外围库,这似乎解决了...
发表于 07-19 06:57 8次 阅读
目标误差配方错误

请问裸机中断控制器代码的问题该怎么解决?

这段代码是中断的引脚的配置,和中断使能,不太明白的是优先级的设置,按照老大的代码解释说 ARBMODE0 要设置为0 , A...
发表于 07-19 05:45 69次 阅读
请问裸机中断控制器代码的问题该怎么解决?

请问z轴加速度除去重力加速代码是什么意思?

if (!isCalibrated) /*У׼*/ {   baseZacc = tempacc.x* vecxZ + tempacc.y * vecyZ + tempacc.z * veczZ...
发表于 07-19 04:36 8次 阅读
请问z轴加速度除去重力加速代码是什么意思?

请问用串口屏做的显示界面是代码开发还是拉控件形式的开发?

没搞过,一直用串口屏做的显示界面。STemWin和UCGUI,是代码开发还是拉控件形式的开发,比如说和vb比。...
发表于 07-19 02:04 8次 阅读
请问用串口屏做的显示界面是代码开发还是拉控件形式的开发?

Google推出了超级强大的在线编辑器Colaboratory

colab作为一款在线编辑器,除了能让大家方便协作使用外,colab还有另外一个身份:帮助传播机器学....
的头像 AI科技大本营 发表于 07-18 15:45 58次 阅读
Google推出了超级强大的在线编辑器Colaboratory

和你一起一步步看懂排序算法的运行过程

由于右边的 2 已经是排好序的数字,就不再参与比较,所以本轮冒泡结束,本轮冒泡最终冒到顶部的数字 5....
的头像 AI科技大本营 发表于 07-18 14:55 130次 阅读
和你一起一步步看懂排序算法的运行过程

过去一年,哪些编程语言被使用?

对此,JetBrains 根据最新的数据报告结果得出,最受欢迎的编程语言是 Java 和 Pytho....
的头像 AI科技大本营 发表于 07-18 14:49 132次 阅读
过去一年,哪些编程语言被使用?

如何在大型数据集中使用datatable包进行数据处理

为了能够更准确地构建模型,现在机器学习应用通常要处理大量的数据并生成多种特征,这已成为必要的。而 P....
的头像 AI科技大本营 发表于 07-18 14:24 155次 阅读
如何在大型数据集中使用datatable包进行数据处理

从代码设计到应用开发,入坑深度学习看这本书就够了

在第9章我们将介绍如何加载预训练网络(该网络是Keras提供的五个预训练网络之一),研究图像输入网络....
的头像 AI科技大本营 发表于 07-18 14:19 92次 阅读
从代码设计到应用开发,入坑深度学习看这本书就够了

拖动验证码的具体实现

.验证码的一个功能就是来规避机器的自动操作,所以我们需要通过轨迹来判断这个拖动过程是真实的人还是机器....
的头像 AI科技大本营 发表于 07-18 11:02 112次 阅读
拖动验证码的具体实现

Python告诉你充气娃娃什么感觉?

我们常常看到一些有关充气娃娃的表情包和图片或新闻,但是这种东西很少会像一些小视频一些相互交流,大家可....
的头像 AI科技大本营 发表于 07-18 10:55 155次 阅读
Python告诉你充气娃娃什么感觉?

你如何鉴别谁会是一位“10x工程师”呢?

他们很少用奇技淫巧。他们写的代码质量高,并清楚知道代码会如何演化,对整个代码结构胸有成竹。他们最多编....
的头像 AI科技大本营 发表于 07-18 10:09 207次 阅读
你如何鉴别谁会是一位“10x工程师”呢?

如何学习Python这一门语言

Python现在非常火,语法简单而且功能强大。
发表于 07-18 09:17 76次 阅读
如何学习Python这一门语言

如何转行Python人工智能

Python 已经是数据分析和 AI的第一语言,网络攻防的第一黑客语言,正在成为编程入门教学的第一语....
发表于 07-18 09:11 26次 阅读
如何转行Python人工智能

Python 为何能坐稳 AI 人工智能 的 头牌语言

Python 是众多主流语言中唯一一个战略定位明确,而且始终坚持原有战略定位不动摇的语言。
发表于 07-18 08:50 45次 阅读
Python 为何能坐稳 AI 人工智能 的 头牌语言

Python编程从入门到实践PDF电子书免费下载

本书是一本针对所有层次的 Python 读者而作的 Python 入门书。全书分两部分 :第一部分介....
发表于 07-18 08:00 35次 阅读
Python编程从入门到实践PDF电子书免费下载

龙格-库塔法的MATLAB代码及含义的详细资料说明

本文档的主要内容详细介绍的是龙格-库塔法的MATLAB代码及含义的详细资料说明。
发表于 07-17 17:02 19次 阅读
龙格-库塔法的MATLAB代码及含义的详细资料说明

MATLAB的经典代码资料免费下载

本文档的主要内容详细介绍的是MATLAB的经典代码资料免费下载。
发表于 07-16 17:08 25次 阅读
MATLAB的经典代码资料免费下载

超简单的C语言心形代码免费下载

本文档的主要内容详细介绍的是超简单的C语言心形代码免费下载。
发表于 07-16 16:35 33次 阅读
超简单的C语言心形代码免费下载

vue2.0 构建单页应用最佳实战教程详细资料免费下载

我们将会选择使用一些 vue 周边的库 vue-cli,vue-router,vue-resourc....
发表于 07-16 08:00 21次 阅读
vue2.0 构建单页应用最佳实战教程详细资料免费下载

贴片元件代码查询表资料免费下载

本文档主要内容详细介绍的是贴片元件代码查询表资料免费下载。
发表于 07-16 08:00 28次 阅读
贴片元件代码查询表资料免费下载

爱抠图人士的福利!3行代码5秒抠图

曾几何时,「抠图」是一个难度系数想当高的活儿
的头像 AI科技大本营 发表于 07-15 09:59 226次 阅读
爱抠图人士的福利!3行代码5秒抠图

一款地理空间可视化库 kepler.gl要逊色不少

不过它的效果相比今天要介绍的一款地理空间可视化库 kepler.gl要逊色不少,后者是由大名鼎鼎的独....
的头像 AI科技大本营 发表于 07-13 07:58 295次 阅读
一款地理空间可视化库 kepler.gl要逊色不少

时间序列的特征分析,一文帮你全Get!

首先我们来看 panda 包里面的 read_csv() 函数,它可以将时间序列数据集(关于澳大利亚....
的头像 AI科技大本营 发表于 07-13 07:37 291次 阅读
时间序列的特征分析,一文帮你全Get!

Python文本编辑器实用工具免费下载

用labVIEW2018使用ScintllaNET控件制作的一Python的文本编辑器 可实现功能如....
发表于 07-10 08:00 53次 阅读
Python文本编辑器实用工具免费下载

廖雪峰Python3基础教程完整版电子书免费下载

Python 是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的 C 语....
发表于 07-10 08:00 63次 阅读
廖雪峰Python3基础教程完整版电子书免费下载

用Python写网络爬虫的PDF电子书免费下载

本书讲解 了 如何使用Python 来编写网络爬虫程序 , 内 容包括 网络爬虫简介 , 从页面 中....
发表于 07-08 08:00 58次 阅读
用Python写网络爬虫的PDF电子书免费下载

机器学习实战中文版PDF电子书免费下载

机器学习是人工智能研究领域中的一个极其重要的方向。在现今大数据时代的背景下,捕获数据并从中萃取有价值....
发表于 07-08 08:00 64次 阅读
机器学习实战中文版PDF电子书免费下载

北大内部教材python版算法与数据结构PDF电子书免费下载

自从第一台需要人们用线缆和交换机向其传达指令的电子计算机问世以来,编程已发生了巨大改变。计算机科技的....
发表于 07-08 08:00 90次 阅读
北大内部教材python版算法与数据结构PDF电子书免费下载

Python中最常用十大图像处理库详细介绍

本文主要介绍了一些简单易懂最常用的Python图像处理库当今世界充满了各种数据,而图像是其中高的重要....
的头像 新机器视觉 发表于 07-06 11:08 321次 阅读
Python中最常用十大图像处理库详细介绍

PyCharm + Docker:打造最舒适的深度学习炼丹炉

一份深度学习炼丹教程!
的头像 人工智能与大数据技术 发表于 07-05 15:15 298次 阅读
PyCharm + Docker:打造最舒适的深度学习炼丹炉

Python编程用于数据科学和机器学习

Python是一种通用的,高级的,面向对象的,易于学习的编程语言。它由Guido van Rossu....
发表于 07-05 14:44 73次 阅读
Python编程用于数据科学和机器学习

如何用OpenCV、Python和深度学习实现面部识别?

Face ID 的兴起带动了一波面部识别技术热潮。
的头像 新机器视觉 发表于 07-05 09:57 242次 阅读
如何用OpenCV、Python和深度学习实现面部识别?

树莓派编程快速入门手册之爱上树莓派第二版PDF电子书免费下载

 树莓派是创客们喜爱使用的智能硬件,它是一款功能强大的微型计算机,能够为艺术家、创客、制作爱好者和做....
发表于 07-04 08:00 236次 阅读
树莓派编程快速入门手册之爱上树莓派第二版PDF电子书免费下载

IE6IE7和Firefox对Div处理有哪些差异

请注意,这里的Style中用到了min-height,这个和height是不同的,min-heigh....
发表于 07-03 16:40 29次 阅读
IE6IE7和Firefox对Div处理有哪些差异

Python ROS十天学基础电子教程免费下载

身为在中国的 ubuntu 使用者,当您费劲千辛万苦安装好 ubuntu,准备开始体验一下开源操作系....
发表于 07-03 08:00 53次 阅读
Python ROS十天学基础电子教程免费下载

千视电子视频编码器支持NDI协议

NDI是Network Device Interface的简称,是由美国NewTek公司于2015年....
发表于 07-01 15:57 45次 阅读
千视电子视频编码器支持NDI协议

如何在U盘安装绿色版嵌入式 Python

Python在Windowns下是提供了安装包,安装后也能简单的拷贝出来,形成portable的绿色....
发表于 07-01 11:48 121次 阅读
如何在U盘安装绿色版嵌入式 Python

如何进行Strong手机模板首页默认风格配置的教程免费下载

本文档的主要内容详细介绍的是如何进行Strong手机模板首页默认风格配置的教程免费下载。
发表于 07-01 08:00 35次 阅读
如何进行Strong手机模板首页默认风格配置的教程免费下载

Java跌落神坛,Python继续夺冠....凭啥?

编程语言流行指数(PYPL)排行榜近日公布了2019年6月份榜单。
的头像 AI科技大本营 发表于 06-30 13:05 760次 阅读
Java跌落神坛,Python继续夺冠....凭啥?

如何用 Python 实现所有算法?

一个牛逼的开源项目!
的头像 人工智能爱好者社区 发表于 06-30 11:50 451次 阅读
如何用 Python 实现所有算法?

Python3.2.3官方文档中文版免费下载

本文档的主要内容详细介绍的是Python3.2.3官方文档中文版免费下载包括了:第一章 Python....
发表于 06-27 08:00 53次 阅读
Python3.2.3官方文档中文版免费下载

python标准库详细电子书资料免费下载

本文档的主要内容详细介绍的是python标准库详细电子书资料免费下载包括了:1. 核心模块 ,2. ....
发表于 06-27 08:00 58次 阅读
python标准库详细电子书资料免费下载

如何才能快速的创建机器人模型

机器人模型是如何创建的?需要工程师一行一行敲写代码吗?每一次模型创建都需要重新开始吗?创建过程总是艰....
发表于 06-25 15:34 108次 阅读
如何才能快速的创建机器人模型

使用树莓派设计智能小车教程之树莓派智能车系统启动的详细资料说明

本文档的主要内容详细介绍的是使用树莓派设计智能小车教程之树莓派智能车系统启动的详细资料说明。
发表于 06-24 08:00 102次 阅读
使用树莓派设计智能小车教程之树莓派智能车系统启动的详细资料说明

这可能是Python面向对象编程的最佳实践

本节介绍了attrs和cattrs两个库,让实现Python面向对象编程不再难。
的头像 AI科技大本营 发表于 06-22 12:07 593次 阅读
这可能是Python面向对象编程的最佳实践