有了前面的基础,其实掌握的比较扎实的话仍是可以作出一些简单的东西的,至少解决一些个基本的数学题仍是问题不大,好比说实现一个斐波那契数列,杨辉三角什么的。多数状况下使用循环 for ... in 或者 while 再加上 if 等就可以实现些很复杂的程序了。python
接下来这部份内容的主要功能是为了简化循环而存在的,也秉持着python编程的一个原则:能一条代码解决的事儿决不写两条。就这样!编程
1,切片数据结构
切片,从字面上理解意思应该差很少可以到位。就是从一个大块儿中切出来一片或者一起。这个大块儿的东西,在程序中能够是列表,元组,集合,字典,字符串等。编程语言
举个例子,好比说从一个含有5个元素的列表中取出前三个元素,该怎么实现?
函数
若是没学切片以前,能够用循环实现,就像这样:编码
可是若是使用python的切片操做,则很简单,就像是这样:spa
能够看到,python的切片操做符使用的是“[start:end]”,start 和 end 均表示元素的索引,获取到的元素在 [start, end) 之间,就是说包含 start 而不包含 end,若是你不指定 end 那么默认就切到结尾。索引
经过切片操做对列表,元组等数据结构进行操做以后返回的数据类型和原数据类型相同。字符串
以上就是关于切片操做的基本介绍,固然,这也是它的所有。数学
那切片操做一般适用的场景就是,你但愿能够快速的从一个列表或者什么中获取其中的一部分,那么用切片操做是最合适不过了!
固然了,切片操做还支持“倒着切”和对字符串进行切割。所谓的“倒着切”是由于,不论是列表仍是元组,它们最后一个元素的索引在python中“规定为 -1”,那倒数第二个元素就是“-2”以此类推。
一个问题:切片能够对集合或者字典进行切割吗?解释一下缘由。
2,生成式
生成式是另一种操做。切片的目的是从过一个已有的列表中切出一部分返回,而生成式的目的则是从无到有的构建一个列表。
一个案例:假如我准备构建一个含有10个元素的列表,能够怎么作?
这里,能够利用python的一个内置函数xrange来生产一些数字,而后利用循环填充到一个列表中。
那么使用生成式应该怎么实现呢?我仍是画(截)个图来看看:
效果同样,可是代码是否是少了不少。这就是python的编码原则,尽量的少写代码!
同时呢,生成式还能够像for同样支持嵌套,固然了,不仅是一级嵌套,一样也支持多级,不过一般状况下最多也只能用到二级了吧。如下的例子,使用生成式来生成两个字符串的全排列:
经过上面的两个例子,想必你已经看到了生成式的运行过程了吧?
对,就是你所想的那样,不要疑惑,记住它,在你之后的python路上这个会有很大的帮助!
注意: 因为生成式只能采用“[]”这种方式,因此只能生产“list”类型的数据结构,因此生成式,一般状况下咱们称之为:列表生成式。
补充: 其实还能够生成集合,只须要把“[]”替换成“{}”
一个问题:上面的两句话矛盾吗?
3,生成器
若是你理解了生成式,那么对于生成器来讲你只须要懂一点,那就是在生成式知足不了你的时候, 你能够考虑使用生成器。
因此生成器是生成式的增强版,注意:不是替代版!
一个案例:构建一个斐波那契数列数列的列表
方案一:采用循环的方式
因为在python中支持同时给多个变量赋值,因此代码能够简化成这样:
这里,简化以后的代码,最妙的一点我认为在于:在其它编程语言中,若是要作到两个变量的交换,那么必定须要引入中间变量,可是在python中利用“赋值符号 =”支持多赋值的机制能够很容易的避免这个问题。
上例中只是采用基本的python编程方法实现了咱们的要求,可是这里能不能采用生成式来实现呢?
答案是能够的!
方案二:采用生成器
有些生成式的逻辑太过于复杂,致使咱们没办法直接经过生成式来完成,这个时候能够借助于函数来完成复杂的逻辑,而后把函数转换成生成器,这样咱们就能够“迭代”生成器来“模拟生成式”生成咱们须要的列表。
那么在这里,把普通函数转换成生成器须要借助一个关键字“yield”。
它的做用是中断操做并返回,当下次再调用“next”方法的时候或者迭代的时候,从中断出继续执行,好比这样:
那如今,对于生成器,是否是有了一个大概的影响呢?
其实还一个问题,我说生成器是做为生成式的增强版,那么是否是应该生成式具备的功能,生成器一样应该具备呢?
就好比咱们说生成式的时候的第一个案例,生成一个含有10个元素的列表,若是用生成器应该怎么实现?
能够看到,生成器和生成式,构建的方法的区别在于一个才用的是“[]”而一个采用的是“()”
同时对于生成器,若是你想构建一个列表,那么后期必需要经过“迭代”来实现,而生成式则能够直接实现。
同时,因为生成器的特殊性,致使若是你想访问生成器中的各个元素,则须要调用它的“next”方法。
以上就是对于生成器所有介绍。
通过仔细思考,对比以后,你就会有下面的一些总结:
对于生成式,它很局限,只可以帮助你快速的生成列表,而对于生成器,因为后期元素的访问必需要经过“迭代”,那么“迭代”出来的元素能够放到列表中,也能够放到集合、元组、字典中,因此采用生成器对于最终构建出来的数据类型没有限制。
那采用生成式仍是生成器,这个就须要根据状况来自行决定了!
4,补充:迭代
什么叫迭代?说白了就是作循环,并且仍是采用for ... in 这种循环结构。这就叫“迭代”!
上面这个,是咱们常常用,也是一种最简单的迭代。
一样,咱们也能够迭代字典:
默认状况下,迭代字典,迭代的是key,若是你想迭代value,你能够这样:采用 “itervalues”方法
固然,若是你想既迭代key也迭代value,那你能够这样:
而后,咱们来看看 “iteritems”这个方法获得的数据类型:
看懂了这个类型,而后再看一个案例:
这样,你对迭代是否是就已经很清楚了呢?^_^
有了迭代的基础,再想一想,咱们的生成式和生成器,它们的内部不是也应用到了 for ... in 这种结构吗?因而下面这样子的代码你还看不懂吗?
O(∩_∩)O哈! 真是有趣,在python中,你能够尽情的把你的代码写的“高大上”一些,并且这也正是python所推荐你这么作的!
---------------------------------------------------华丽的分割线---------------------------------------------
切片,生成式,生成器,迭代,做为前面对python扩展数据结构的操做的一些补充说明,在从此的python编程中应用会很是频繁,因此必定要理解透彻,这样才能编写出“高大上”的代码嘛 ^_^