不要再写Python for轮回了!

3个月前 (11-21 18:46)阅读2回复0
lrj
lrj
  • 管理员
  • 注册排名2
  • 经验值131695
  • 级别管理员
  • 主题26339
  • 回复0
楼主

菜学Python”,抉择“星标”公家号

超等无敌干货,第一时间送达!!!

来源丨收集

各人好,我是菜鸟哥。

为什么要挑战本身在代码里不写 for loop?因为如许能够迫使你往进修利用比力高级、比力地道的语法或 library。文中以 python 为例子,讲了很多各人其其实他人的代码里都见过、但本身很少用的语法。

自从我起头摸索 Python 中惊人的语言功用已经有一段时间了。一起头,我给本身一个挑战,目标是让我操练更多的 Python 语言功用,而不是利用其他编程语言的编程体味。那让工作变得越来越有趣!代码变得越来越简洁,代码看起来愈加构造化和标准化。下面我将会介绍那些益处。

凡是如下利用场景中会用到 for 轮回:

在一个序列来提取一些信息。

从一个序列生成另一个序列。

写 for 已成习惯。

幸运的是,Python 已经有良多东西能够搀扶帮助你完成那些工做,你只需要转移你的构想,并以差别的角度来根究它。

通过制止编写 for 轮回,你能够获得什么益处:

较少的代码量

更好的代码可读性

更少的缩进(对 Python 仍是很有意义的)

我们来看一下下面的代码构造:

# 1

with...:

for...:

if...:

try:

except:

else:

在那个例子中,我们正在处置多层嵌套的代码,那很难阅读。那个例子利用了多层嵌套的代码。我在那段代码中发现它无区别利用缩进把治理逻辑(with, try-except)和营业逻辑(for, if)混在一路。假设你遵守只对治理逻辑利用缩进的标准,那么核心营业逻辑应该立即离开出来。

"扁平构造比嵌套构造更好" - The Zen of Python

能够利用的已有的东西来替代 for 轮回

1.List Comprehension / Generator 表达式

我们来看一个简单的例子。假设你想将一个数组转换为另一个数组:

result= []

foritem in item_list:

new_item= do_something_with(item)

result.append(item)

假设你喜好 MapReduce,你也能够利用 map,或者 Python 中的 List Comprehension:

result = [do_something_with(item) foritem initem_list]

同样,假设您只想迭代数组中的元素,也能够利用一样的代码 Generator Expression。result = (do_something_with(item) for item in item_list)

2.函数

假设您想要将一个数组映射成别的数组,只需挪用 map 函数,就能够用一个更高级、更适用的编程体例处理那个问题。

doubled_list= map(lambda x: x * 2, old_list)

假设要将序列削减为单个,请利用 reduce

fromfunctools importreduce

summation = reduce( lambdax, y: x + y, numbers)

别的,许多 Python 内置函数城市利用 iterables:

a = list(range( 10))

a

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

all(a)

False

any(a)

True

max(a)

9

min(a)

list(filter(bool, a))

[ 1, 2, 3, 4, 5, 6, 7, 8, 9]

set(a)

{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

dict(zip(a,a))

{ 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}

sorted(a, reverse=True)

[ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

str(a)

'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'

sum(a)

45

3.Extract Functions or Generators

上述两种办法是很好的处置更简单的逻辑。更复杂的逻辑怎么样?做为法式员,我们编写函数来抽离出复杂的营业。不异的设法适用于此。假设你是如许写的:

results = []

foritem initem_list:

# setups

# condition

# processing

# calculation

results.append(result)

显然你对一个代码块添加了太多的责任。相反,我定见你做:

defprocess_item(item):

# setups

# condition

# processing

# calculation

returnresult

results = [process_item(item) foritem initem_list]

假设换成嵌套函数会若何

results = []fori in range( 10): forj in range(i): results. append((i, j))

换成 List Comprehension 来实现是如许的:

results = [(i, j)fori inrange( 10) forj inrange(i)]

假设你的代码块需要笔录一些内部形态

# finding the max prior to the current itema = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]results = []current_max = 0for i in a:current_max = max(i, current_max)results.append(current_max)

# results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

我们利用 generator 来实现那一点:

defmax_generator(numbers):current_max= 0fori in numbers:current_max= max(i, current_max)yieldcurrent_max

a= [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]results= list(max_generator(a))

读者可能要问 “等等!你在 generator 顶用到 for 轮回,做弊啊!别急,再看看下面的代码。

不要本身写。itertools 会帮你实现了

那个模块很简单。我相信那个模块在大大都场景中能够替代你原先的 for 轮回。例如,最初一个例子能够重写为:

from itertools import accumulatea = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]resutls = list(accumulate(a, max))

别的,假设要迭代组合序列,则需要利用product, permutations, combinations。

结论

在大大都情状下,您都不需要编写 for 轮回。

你应该制止编写 for 轮回,如许会有更好的代码可读性。

进门: 最全的零根底学Python的问题 | 零根底学了8个月的Python |实战项目 | 学Python就是那条捷径

干货:爬取豆瓣短评,片子《后来的我们》 | 38年NBA更佳球员阐发 |从万寡等待到口碑扑街!唐探3令人失看 | 笑看新倚天屠龙记 | 灯谜答题王 | 用Python做个海量蜜斯姐素描图 | 碟中谍那么火,我用机器进修做个迷你选举系统片子

兴趣:弹球游戏 | 九宫格 | 标致的花 | 两百行Python《天天酷跑》游戏!

AI:会做诗的机器人 | 给图片上色 | 揣测收进 | 碟中谍那么火,我用机器进修做个迷你选举系统片子

小东西: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保留为pdf! |再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 造造一款钉钉低价机票提醒器! |60行代码做了一个语音壁纸切换器天天看蜜斯姐! |

年度爆款案牍

1). 卧槽!Pdf转Word用Python轻松搞定 !

2).学Python实香!我用100行代码做了个网站,帮人PS游览图片,赚个鸡腿食

3).首播过亿,火爆全网,我阐发了《披荆斩棘的姐姐》,发现了那些奥秘

4). 80行代码!用Python做一个哆来A梦分身

5).你必需掌握的20个python代码,短小精悍,用途无限

6). 30个Python奇淫身手集

7). 我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

8). 再见Python!我要学Go了!2500字深度阐发 !

9).发现一个舔狗福利!那个Python爬虫神器太爽了,主动下载妹子图片

0
回帖

不要再写Python for轮回了! 期待您的回复!

取消