菜学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爬虫神器太爽了,主动下载妹子图片