与君共勉"/>
学习Python的一个心得, 与君共勉
在说心得之前, 我们先说一个问题, 根据解决问题的思路, 最后说一下自己的一个小心得.
有一组数据arr=[1,2,3,4], 筛选出能被2整除的nums=[2,4],然后再加3,最后得到[5,7]
我们使用Python实现一下
def filter(arr):nums = []for v in arr:if v % 2 == 0:nums.append(v)return numsarr = [1, 2, 3, 4]
nums = filter(arr)for v in nums:print(v + 3)
从代码中我们发现, 存在两个数组,arr和nums
arr是用来存放原始数据
nums是用来存放被2整除的数据
我们来算一笔账
从arr中筛选出来数据共循环了4次
循环nums共2次
所以加起来循环了6次
当数据量非常大的时候, 意味着arr很大, nums也很大, 一次性将数据放入内存肯定是不现实不可能的.而且即便内存放的下, 两次循环可就不是简单的4+2=6这么少的次数了.
因此为了解决数据量大和循环次数多的问题, 我们对代码进行改进
def filter(arr):for v in arr:if v % 2 == 0:yield v #1arr = [1, 2, 3, 4]
nums = filter(arr)for v in nums:print(v + 3) #2
和之前的代码比较, 一个是nums消失了, 第二个就是多了一个yield
经过这么一改动, 第一减少了内存空间(数据量大), 第二减少一个循环操作
- 一方面我们少用了一个nums, 的确少用了内存空间, 其实更重要的是我们可以处理大数据量的情况了, 不需要将大数据量一次性加载到内存, 而是像流水一样, 慢慢地流入到我们的程序, 它是需要yield协助的.
- 同时yield也解决了减少循环
上面的代码执行流程是这样的
当代码执行到第4行时, 接下来会执行第9行代码, 此时的nums里面就一个值.
在循环arr时, 只要代码执行到第4行接下来就会执行第9行.
所以说代码里面虽然写了两个for, 但是其实只是循环了一个for, 我们甚至可以简单的理解成如下代码
def filter(arr):for v in arr:if v % 2 == 0:print(v + 3)arr = [1, 2, 3, 4]
filter(arr)
读者可不要问, 对呀, 那你为啥不这么写呢.
其实我这里只是举例, 毕竟业务复杂的时候, 每个函数需要完成独立的功能, 对修改关闭, 对扩展开放, 我们不可能把所有的东东都写到一个函数里.
我们是基于不同函数之间传递数据而讲的.
在没有学习Python之前(我是搞Java开发的), 我对于类似的处理也是一开始那样的处理方式, 当我学习了Python, 学到了这个思路以后, 会觉得思路开阔了许多.
有时候你不要简单的考虑, 反正我是Java开发, 学习Python能干啥, 顶多就是用它写写脚本吧, 才不学呢. 其实有时候我们学习新的知识, 并不是为了学习知识而学习, 更重要学习过程, 或者说更重要的是升华出来的思想, 解决问题的思路, 而并不是知识本身.
习技固然可以成为人杰, 悟道才能羽化升仙, 思想才是王道.
个人网站
微信公众号
更多推荐
学习Python的一个心得, 与君共勉
发布评论