为什么要挑战自己在代码里不写for loop?因为这样可以迫使你去使用比较高级、地道的语法或库。文中以python为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。

这是一个挑战。我要你避免在任何情况下写for循环。同样的,我也要你找到一种场景――除了用for循环以外,用其他方法写都太难。请分享你的发现,我非常想听到这些

距离我开始探索超棒的Python语言特性已经有一段时间了。一开始,这只是我给自己的一个挑战,练习使用更多的语言特性来替代我从其他编程语言那里所学到的。但是事情渐渐变得更有趣了!代码不止变得更简短整洁,而且看起来更加结构化和有规律,在这篇文章中我将更多地介绍这些好处。

首先,让我们退一步看看在写一个for循环背后的直觉是什么:

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

2.从当前的序列中生成另外的序列

3.写for循环已经是我的第二天性了,因为我是一个程序员

幸运的是,Python里面已经有很棒的工具帮你达到这些目标!你需要做的只是转变思想,用不同的角度看问题。

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

1.更少的代码行数

2.更好的代码阅读性

3.只将缩进用于管理代码文本

Let"s see the code skeleton below:

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

# 1

with ...:

for ...:

if ...:

try:

except:

else:

这个例子使用了多层嵌套的代码,这是非常难以阅读的。我在这段代码中发现它无差别使用缩进把管理逻辑(with, try-except)和业务逻辑(for, if)混在一起。如果你遵守只对管理逻辑使用缩进的规范,那么核心业务逻辑应该立刻脱离出来。

“扁平结构比嵌套结构更好” �C 《Python之禅》

为了避免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]

同样的,如果你只是想要获取一个迭代器,你可以使用语法几乎相通的生成器表达式。(你怎么能不爱上Python的一致性?)

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

2. 函数

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

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

如果你想使一个序列减少到一个元素,使用reduce

from functools import reduce

summation = reduce(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 item in item_list:

# setups

# condition

# processing

# 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):

results.append((i, j))

列表解析可以帮助你:

results = [(i, j)

for i in range(10)

for j in range(i)]

如果你要保存很多的内部状态怎么办呢?

# 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 = list(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(),permutations(),combinations()可以用。

结论

1.大多数情况下是不需要写for循环的。

2.应该避免使用for循环,这样会使得代码有更好的阅读性。

行动

1.再看一遍你的代码,找出任何以前凭直觉写下for循环的地方,再次思考一下,不用for循环再写一遍是不是有意义的。

2.分享你很难不使用for循环的例子。

python中for循环-python中关于for循环的碎碎念相关推荐

  1. pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器

    1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...

  2. python中while嵌套循环_python中的while循环

    循环 目标 程序的三大流程  while 循环基本使用  break 和 continue  while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 -- 从上向下,顺 ...

  3. python中break可以用在for和if中吗_Python的for和break循环结构中使用else语句的技巧...

    在Python中的while或者for循环之后还可以有else子句,作用是for循环中if条件一直不满足,则最后就执行else语句. for i in range(5): if i == 1: pri ...

  4. python程序如何循环_在Python的一段程序中如何使用多次事件循环详解

    背景 本文主要给大家介绍了关于在Python一段程序中使用多次事件循环的相关内容,我们在Python异步程序编写中经常要用到如下的结构 import asyncio async def doAsync ...

  5. python程序多次运行_[Python]在一段Python程序中使用多次事件循环

    背景 我们在Python异步程序编写中经常要用到如下的结构 import asyncio async def doAsync(): await asyncio.sleep(0) #... if __n ...

  6. python中循环结构关键字_Python的循环结构,也简单!

    Python语言的循环结构包括两种:遍历循环和无限循环.其中遍历循环由for保留字建立,用来一次访问元素组中的每一个元素:无限循环由while保留字建立,依据是否满足特定条件决定是否结束循环. 1.遍 ...

  7. python结束循环_python中break、continue 、exit() 、pass终止循环的区别

    python中break.continue .exit() .pass区分 1.break:跳出循环,不再执行 Python break语句,就像在C语言中,打破了最小封闭for或while循环. b ...

  8. python中遍历结构可以是哪些数据类型_全!Python基础之原生数据类型、判断和循环、函数和文件操作合集...

    长文预警! Python基础系列会将基础内容大致分为三到五个板块,每块着重讲一方面,知识不会很难,主要是以小例子的形式解读,如果你已经入门Python,希望可以帮你温习一下:如果你想入门Python, ...

  9. Python如何在循环语句中加入两个变量_python学习笔记(第一章)

    大家好,我是天钧,因为我是今年参加的春季高考并且考上了信息安全专业,在家里自学完C语言(其实就是过一遍),然后开始自学Python,可能后期的笔记大多数以这个Python编程语言为主,跟着我一起学习吧 ...

  10. 下列选项中不属于python循环语句的是哪一项_下列选项中,不属于字典操作的方法是哪一项?_学小易找答案...

    [简答题]字符串有哪几种表现形式? [简答题]简述Python程序的执行过程. [单选题]Python 语句x='char';y=2,print(x+y)输出的结果是哪一项?() [编程题]输入三角形 ...

最新文章

  1. 【今日互联网大事儿】网易陌陌开火,孰是孰非我们慢慢看
  2. r语言python print包_python : 批量下载R语言库包
  3. Spring中的Bean配置、属性配置、装配内容详细叙述
  4. python unit test_Python Unittest
  5. 网络编程—代码—TCP网络传输
  6. 汽车短视频大行其道,新能源汽车平台杉车网如何“领风骚”?
  7. Kotlin基础学习第5章—表达式
  8. git项目合并(本地上传到已有的仓库)
  9. 点云深度学习——点云配准网络DCP复现
  10. 基于FPGA的智能家具之PM2.5传感器,温湿度传感器驱动设计
  11. 15个素材下载网站,从此不做「伸手党」!
  12. 坦克世界怎么显示服务器准心,坦克世界设置方法 坦克世界如何设置图像
  13. 为什么要去学习函数式编程
  14. 修改服务器线路,介绍几种常见的网络服务器线路
  15. 详解 物理四大神兽————薛定谔的猫
  16. This inspection highlights chained comparisons that can be simplified.
  17. 【Java】文件管理器
  18. Mysql主从延时-Multi-threaded slave statistics for channel
  19. 【Nginx】configure 报错checking for C compiler … not found
  20. 【目标检测】小目标检测问题及解决方法

热门文章

  1. docker下使用solr
  2. go语言web开发 排坑指南
  3. SpringBoot中 pagehelper插件使用
  4. Python3十大经典错误及解决办法
  5. Linux 基础知识系列第一篇
  6. .NET开发 程序员必备工具 -- Regulator:生成正则表达式工具
  7. python解决列表IndexError: list index out of range
  8. Windows/Linux如何查看动态库的依赖关系?
  9. 深度学习的实用层面 —— 1.4 正则化
  10. leetcode - 474. 一和零