显卡,我不想用for循环,庾澄庆

来历:https://blog.csdn.net/sinat_38682860/article显卡,我不想用for循环,庾澄庆/details/呼吸道感染83868107

为什么要应战自己在代码里不写for loop?由于这样能够迫使你去运用比较高档、地道的语法或库。文中以python为比如,讲了不少咱们其实在他人的代码里都见过、但自己很少用的语法。

这是一个应战。我要你防止在任何情况下写for循环。相同的,我也要你找到一种场景——除了用for循环以外,用其他办法写都太难。请共享你的发现,我十分想听到这些

间隔我开端探究超棒的Python言语特性现已有一段时间了。一开端,这仅仅我给自己的一个应战,操练运用更多的言语特性来代替我从其他编程言语那里所br学到的。可是工作逐渐变得更风趣了!代码不止变得更简略显卡,我不想用for循环,庾澄庆整齐,并且看起来愈加结构化和有规则,在这篇文章中我将更多地介绍这些优点。

首要,让咱们退一步看看在写一个for循环背面的直觉是什么:

遍历一个序列提取出一些信息

从当时的序列中生成别的的序列

写for循环现已是我的第二天分了,由于我是一个程序员

走运的是,Python里边现已有很棒的东西我和女帮你到达这些方针!你需求做的仅仅转变思想,用不同的视点看问题。

不处处写for循环你将会取得什么

更少的代码行数

更好的代码阅览性

只将缩进用于办理代码文本

Let’s see the code skeleton below:

看看下面这段代码的构架:

# 1
with ...:
for ...:
if ...:
try:
excep春意盎然t:
else:

这个比如运用了多层嵌套的代码,这是十分难以阅览的。我在这段代码中发现它无差别运用缩进把办理逻辑(with, try-except)和事务逻辑(for, if)混在一同。假如你恪守只对办理逻辑运用缩进的标准,那么中心事务逻辑应该马上脱离出来。

为了防止for循环,你能够运用这些东西

1. 列表解析/生成器表达式

看一个简略的比如,这个比如主要是依据一个现已存在的序列编译一个新序列:

result = []
for item in item_list:
new_item = do_something_with(item)
result.append(item)

假如你喜人体结构欢MapReduce,那你能够运用map,或许Python的列表解析:

result = [do_something_with(item) for item in item_list]

相同的,假如你仅仅想要获取一个迭代器,你能够运用语法简直相通的生成器表达式。(你怎样能不爱上P苏妤陆历承ython的一致性?)

result = (do_something_with(item) for ite显卡,我不想用for循环,庾澄庆m in item_list)

2. 函数

站在更高阶、更函数化的变成办法考虑一下,假如你想映射一个序列到另一个序列,直接调用map函数。(也可用列表解析来代替。)

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

假如你想使一个序列削减到一个元素,运用reduce

from functools import reduce
s继母ummation = re生完孩子多久来月经duce(lambda x, y: x + y, numbers)

别的,Python中许多的内嵌功用可/会(我不知道这是功德仍是坏事,你选一个,不加这个语句有点难明)耗费迭代器:

>>> 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)
0
>>> 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. 抽取函数或许表达式

上面的两种办法很好地处理了较为简略的逻辑,那更杂乱的逻辑怎样办呢?作为一个程序员,咱们会把困难的工作天山雪莲笼统成函数,这种办法也能够用在这里。假如你写下了这种代码:

results = []
for显卡,我不想用for循环,庾澄庆 item in item_list:
# setups
# condition
# process显卡,我不想用for循环,庾澄庆ing
# calculation
results.append(result)

明显你赋予了一段代码太多的职责。为了改善,我主张你这样做:

def process_item(item):
# setups
# condition
# processing
# calculation
return result
results = [process_item(item) for item in item_list]

嵌套的for循环怎样样?

results = []
for i in range(10):
for j in range(i):
resu显卡,我不想用for循环,庾澄庆lts.append((i, j))

列表解析能够协助你:

r肖怀忠esults = [(i, j)
for i in range(10)
fo3366小游戏r j in range(i)]

假如你要保存许多的内部状况怎样办呢?

# python学习沟通群:516107834
# finding the max prior to the current item
a = [3, 4, 意思6, 2, 1, 9, 0, 7, 5, 8]
results = []
current_max = 0
for i in a:
current_max = max(i, current_max)
results.append(current_max)
# results = [3, 4, 6, 生旦净末丑6, 6, 9, 9, 9, 9, 9]

让咱们提取一个表达式来完成这些:

def max_generator(numbers):
current_max = 0
for i in numbers:
current_max = max(i, current_max)
yield current_max
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = lis韩潮军哥t(max_generator(a))

“等等,你刚刚在那个函数的表达式中运用了一个for循环,这是诈骗!”

好吧,自作聪明的家伙,试试下面的这个。

4. 你自己不要写for循环,itertools会为你代庖

这个模块真是妙。我信任这个模块能掩盖80%你想写下for循环的时分。例如,上一个比如能够这样改写:

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

别的,假如你在迭代组合的序列,还有product(),permutat显卡,我不想用for循环,庾澄庆ions(),combinations()能够用。

定论

大多数情况下是不需求写for循环的。

应该防止运用for循环,这样会使得代码有更好的阅览性。

举动

再看一遍你的代码,找出任何曾经凭直觉写下for循环的当地,再次思格列卫考一下,不必for循马诗环再写一遍是不是有意义的。

共享你很难不运用for循环的比如。