娱乐城白菜论坛

如何让你的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 = n(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):

len(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'}

whi:

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开发流程的视频,该视频为投石问路,主要是想听听大家对于小梅哥在录制视频时需要注意的内容以及希望系列
发表于 03-24 00:00 ? 37952次 阅读

需要用芯片硬件进行编码,不知可否实现?
发表于 06-26 13:01 ? 47次 阅读

大家好,在过去的几天里,我在PIC24FJ256GB406上工作。它有256KB的闪存。我已经准备好了我的SW设计和代码。现在我想确...
发表于 06-26 12:11 ? 3次 阅读

大家好 ... 我在使用case语句时遇到问题....虽然我使用它如下:: -------------------------------------------------- --- ...
发表于 06-26 11:47 ? 6次 阅读

这里是我写的一些代码,因为我真的需要一个具有多功能多主支持的主接口,并且以全总线速度工作,没有任何延迟,降低了传输速度。...
发表于 06-26 08:59 ? 7次 阅读

你好。 我在ISE 14.2上编写了一个代码并在spartan 6上进行合成 使它适用于斯巴达3E我使用选项 -use_new_parser是的 这个...
发表于 06-26 08:54 ? 4次 阅读

你好,我想用Mab1768工具包作为CyPress 3272 PLC工具包的主人。我已经查看了应用笔记的详细内容。写了一个代码,但我无法与...
发表于 06-26 08:48 ? 28次 阅读

你好 我是STM8S-Discovery和STM8S105的新手。 我通常在汇编程序中编写代码,因此我对微硬件有了更深入的了解。但是...
发表于 06-26 07:38 ? 6次 阅读

大家好,我用的是PIC24FJ256GB406。我用PICTIT3把代码闪到控制器。但是现在我的领导要我使用UART来闪亮代码。有...
发表于 06-26 07:29 ? 84次 阅读

为了实现一个从x“8F”到x“00”的8位递减计数器,我编写了以下代码: counter_P:进程(rst_b,clk)如果rst_b ='0'则开始计...
发表于 06-26 06:41 ? 4次 阅读

**** Build of configuration Debug for project mmw_dss_16xx **** "C:\\ti\\ccsv7\\utils\\bin\\gmake" -k -j 4 all -O ...
发表于 06-26 06:23 ? 5次 阅读

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

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

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

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

开源机器学习管理平台TRAINS

不论是对于团队还是企业,TRAINS都能将所有内容记录在一个中央服务器中,并实现可视化和出处,这样生....
的头像 新智元 发表于 06-23 08:09 ? 295次 阅读
开源机器学习管理平台TRAINS

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

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

Microbit Python学习免费平台BXY python编辑器免费下载

本文档的主要内容详细介绍的是Microbit Python学习免费平台BXY python编辑器免....
发表于 06-21 08:00 ? 24次 阅读
Microbit Python学习免费平台BXY  python编辑器免费下载

蛋白质研究“游戏化”,玩家也能创造全新疫苗、癌症疗法及更多应用

近日,一支研究团队将他们的专业知识编码成了一款名为“ Foldit ”的电脑游戏,使每个普通人都可能....
的头像 DeepTech深科技 发表于 06-19 09:16 ? 213次 阅读
蛋白质研究“游戏化”,玩家也能创造全新疫苗、癌症疗法及更多应用

Git的使用说明四个点详细说明

本文档的主要内容详细介绍的是Git的使用说明四个点详细说明包括了:一、创建版本库 ,二、VS2017....
发表于 06-18 08:00 ? 28次 阅读
Git的使用说明四个点详细说明

Google 推出免费利器,无需具备代码知识,小白也能做游戏

创建游戏不再是程序员的专利,普通游戏玩家也可以随心所欲地创造自己的游戏王国。
的头像 人工智能 发表于 06-17 16:36 ? 295次 阅读
Google 推出免费利器,无需具备代码知识,小白也能做游戏

精通Django Django1.8LTS全解PDF电子书免费下载

为什么要关注 Django?虽然 Django 不是完成工作唯一的 Web 框架,但是我可以确信一点....
发表于 06-17 08:00 ? 31次 阅读
精通Django Django1.8LTS全解PDF电子书免费下载

如何使用Python优化比特币交易机器人

上个月,AI 工程师 Adam King 结合人工智能在预测方面得天独厚的优势,提出使用深度强化学习....
的头像 AI科技大本营 发表于 06-16 10:53 ? 344次 阅读
如何使用Python优化比特币交易机器人

如何使用50行Python代码实现AI的动作平衡

本文将为大家展示如何通过 Numpy 库和 50行 Python 代码,使用标准的 OpenAI G....
的头像 AI科技大本营 发表于 06-16 10:40 ? 363次 阅读
如何使用50行Python代码实现AI的动作平衡

现在为什么有这么多人想学习Python人工智能娱乐城白菜论坛?

最近,网上流传一组《人工智能实验教材》的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的!Py....
的头像 半导体界 发表于 06-16 10:22 ? 364次 阅读
现在为什么有这么多人想学习Python人工智能娱乐城白菜论坛?

Tiobe月度排行趋势中,Python获得了有史以来的最高评级

TIOBE索引基于Web搜索跟踪编程语言的流行程度,使用一个公式来评估搜索引擎(如Google,Ya....
的头像 新智元 发表于 06-15 09:45 ? 375次 阅读
Tiobe月度排行趋势中,Python获得了有史以来的最高评级

科创板正式开板 采取市场化询价制度

6月13日,中国证监会和上海市人民政府联合举办了上海证券交易所科创板开板仪式。
的头像 半导体投资联盟 发表于 06-14 11:53 ? 541次 阅读
科创板正式开板 采取市场化询价制度

关于嵌入式系统的可裁剪性

公司在研发嵌入式产品过程中,产品的功能会不断的添加和更新,产品的型号也会越来越多。这时产品的软件研发....
发表于 06-14 11:03 ? 82次 阅读
关于嵌入式系统的可裁剪性

python 3.72应用程序免费下载

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(s....
发表于 06-14 08:00 ? 47次 阅读
python 3.72应用程序免费下载

实验python进行图像识别的示例代码资料免费下载

本文档的主要内容详细介绍的是实验python进行图像识别的示例代码资料免费下载。
发表于 06-14 08:00 ? 68次 阅读
实验python进行图像识别的示例代码资料免费下载

精通Python设计模式的PDF电子书免费下载

本书分三部分、共 16 章,介绍一些常用的设计模式。第一部分介绍处理对象创建的设计模式,包括工厂模式....
发表于 06-13 08:00 ? 55次 阅读
精通Python设计模式的PDF电子书免费下载

Abaqus和python学习入门体会资料免费下载

自己的论文要用到有限元进行数值模拟分析,以前都用ansys计算,可ansys中岩土的本构模型只有D-....
发表于 06-12 15:29 ? 35次 阅读
Abaqus和python学习入门体会资料免费下载

什么是栈式自编码

如果你只对以分类为目的的微调感兴趣,那么惯用的做法是丢掉栈式自编码网络的“解码”层,直接把最后一个隐....
发表于 06-11 16:09 ? 65次 阅读
什么是栈式自编码

为什么那么多人想学Python?

为什么这几年Python这么火?
的头像 半导体界 发表于 06-10 13:49 ? 702次 阅读
为什么那么多人想学Python?

深入Python3中文版PDF电子书免费下载

如果使用的是托管服务器上的帐号, ISP[互联网供应商] 可能已经安装了 Python 3 。如果是....
发表于 06-10 08:00 ? 49次 阅读
深入Python3中文版PDF电子书免费下载

PYTHON自然语言处理中文版PDF电子书免费下载

作为一个自然语言处理的初学者,看书看到“训练模型”,这模型那模型的,一直不知道模型究竟是什么东西。看....
发表于 06-10 08:00 ? 43次 阅读
PYTHON自然语言处理中文版PDF电子书免费下载

简明Python教程PDF电子书免费下载

Python语言可能是第一种即简单又功能强大的编程语言。它不仅适合于初学者,也适合于专业人员使用,更....
发表于 06-10 08:00 ? 60次 阅读
简明Python教程PDF电子书免费下载

Pytho就像一匹超强的黑马,完成自己的逆袭

2018年1月16日上午,教育部召开新闻发布会,在此次「新课标」改革中,正式将人工智能、物联网、大数....
的头像 AI科技大本营 发表于 06-07 17:01 ? 677次 阅读
Pytho就像一匹超强的黑马,完成自己的逆袭

这个时代,程序员究竟该学什么语言?

虽然各大城市的薪资标准略有不同,但是这也确实传递出一个信息,如果想要年薪百万、一夜暴富、成功走上人生....
的头像 AI科技大本营 发表于 06-07 16:50 ? 200次 阅读
这个时代,程序员究竟该学什么语言?

用PyTorch实现了基本的RL算法

近日,有开发人员用PyTorch实现了基本的RL算法,比如REINFORCE, vanilla ac....
的头像 新智元 发表于 06-07 15:36 ? 258次 阅读
用PyTorch实现了基本的RL算法

Swift“背景硬”:背后有强大的支持

在这篇文章中,作者将尝试回答这些问题,并告诉你为什么要认真遵循S4TF以及Swift语言本身。 本文....
的头像 新智元 发表于 06-07 11:01 ? 187次 阅读
Swift“背景硬”:背后有强大的支持

毫米波 | 大规模MIMO系统中的预编码娱乐城白菜论坛

大规模多输入多输出(MIMO)娱乐城白菜论坛能够大幅度提升系统容量,降低不同用户间的干扰,但因其系统中信道维度....
的头像 微波射频网 发表于 06-04 11:49 ? 576次 阅读
毫米波 | 大规模MIMO系统中的预编码娱乐城白菜论坛

solr中的cache的实现原理

顺序扫描法:对5个文档依次查找,包含目标字段的文档就记录下来,最后查找的结果可能是在2,3文档中,这....
发表于 06-03 14:52 ? 97次 阅读
solr中的cache的实现原理

教你防止代码崩掉的小技巧

我们经常会遇到比如需要输入密码,当你输错密码的时候,你不希望退出这个系统,而是重新输入密码;又或者是....
发表于 06-03 11:11 ? 304次 阅读
教你防止代码崩掉的小技巧

Python要从娃娃抓起,未来将人人会编程

作为程序员的编程语言,它的历史比起其他兄弟姐妹,则显得年轻很多,最近Python的这把火已经烧到了程....
的头像 AI科技大本营 发表于 06-02 10:14 ? 341次 阅读
Python要从娃娃抓起,未来将人人会编程

影响力超高的Python入门书《Python编程无师自通——专业程序员的养成》

《Python编程无师自通——专业程序员的养成》作者是一名自学成才的程序员,作为一名文科生他通过自学....
的头像 AI科技大本营 发表于 06-02 10:00 ? 329次 阅读
影响力超高的Python入门书《Python编程无师自通——专业程序员的养成》

用户选择使用Python的原因有哪些

如今有众多可选的编程语言,这往往是入门者首先要面对的问题。开发工具的选择有时取决于特定的约束条件或者....
的头像 嵌入式资讯精选 发表于 06-02 09:49 ? 656次 阅读
用户选择使用Python的原因有哪些

Redis 分布式锁的正确实现方式

分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKe....
发表于 05-31 14:19 ? 232次 阅读
Redis 分布式锁的正确实现方式

音频几个很重要的参数

但音频帧跟编码格式相关,它是各个编码标准自己实现的。因为如果以PCM(未经编码的音频数据)来说,它根....
发表于 05-31 13:39 ? 157次 阅读
音频几个很重要的参数

DHT11温湿度传感器的应用程序代码免费下载

本文档的主要内容详细介绍的是DHT11温湿度传感器的应用程序代码免费下载。
发表于 05-31 08:00 ? 55次 阅读
DHT11温湿度传感器的应用程序代码免费下载

用Python写的一个电影推荐系统的程序和工程文件资料免费下载

本文档的主要内容详细介绍的是用Python写的一个电影推荐系统的资料免费下载。
发表于 05-31 08:00 ? 56次 阅读
用Python写的一个电影推荐系统的程序和工程文件资料免费下载

行为和结构及表现分离的CSS选项卡的代码免费下载

本文档的主要内容详细介绍的是行为和结构及表现分离的CSS选项卡的代码免费下载。
发表于 05-30 17:07 ? 32次 阅读
行为和结构及表现分离的CSS选项卡的代码免费下载

微软是如何确保代码质量的呢?

微软代码评审是一种被广泛采用的工程实践。成千上万的工程师认为这是一个伟大的最佳实践。大多数高绩效团队....
发表于 05-29 14:08 ? 286次 阅读
微软是如何确保代码质量的呢?

python微服务开发的PDF电子书免费下载

如果我们试图将Web应用程序部署到云中,则需要我们的代码与许多第三方服务进行交互。使用微服务体系结构....
发表于 05-29 08:00 ? 280次 阅读
python微服务开发的PDF电子书免费下载

GitHub添加新工具 帮助开发人员保护代码

GitHub宣布推出了几款新的安全工具和功能,旨在帮助开发者保护代码的安全。
的头像 E安全 发表于 05-28 16:15 ? 362次 阅读
GitHub添加新工具 帮助开发人员保护代码

不可错过的LabVIEW使用技巧

发现了程序的问题再回头去调试,往往要花费大量时间在在查找程序错误上。要提高开发效率,最好是在编写代码....
的头像 嵌入式资讯精选 发表于 05-27 14:55 ? 739次 阅读
不可错过的LabVIEW使用技巧

一个让Python代码运行更快的最佳方式是什么

Python因其强大、灵活且易于使用等特性,而赢得了声誉。这些优点使其在各种各样的应用程序、工作流程....
发表于 05-26 10:21 ? 360次 阅读
一个让Python代码运行更快的最佳方式是什么

Oracle中国裁员的事情已有定论,约裁1600人,

在过去的互联网时代,我们看到太多这样的例子了,举一个简单的说明:就如10多年前选择Java人和201....
发表于 05-25 11:14 ? 1614次 阅读
Oracle中国裁员的事情已有定论,约裁1600人,

Python语言的发展历程和特点

无论是对于广大学习者还是程序员,简单就拥有了最大的吸引力。既然都能实现同样的功能,人们有什么理由不去....
发表于 05-25 11:00 ? 548次 阅读
Python语言的发展历程和特点

测试你的爬虫能力是否及格

最近在网上看到一个非常有意思的 Python 游戏通关网站,一共有 33 关,每一关都需要利用 Py....
发表于 05-22 17:29 ? 480次 阅读
测试你的爬虫能力是否及格

人工合成并彻底改变了首个全基因组生物

所有生物的遗传信息均储存在 DNA 中,DNA 又由 A 、T、G 和 C 四种碱基来编码。野生大肠....
发表于 05-22 16:19 ? 299次 阅读
人工合成并彻底改变了首个全基因组生物