在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
基于这一思想,Python中有非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。
切片
(Slice)
-
切片操作符在python中的原型是 [start:stop:step] ,即:[开始索引:结束索引:步长值] ->
开始索引:默认从0开始。序列从左向右方向中,第一个值的索引为0,最后一个为-1 ;
结束索引:切片操作符将取到该索引为止,不包含该索引的值;
步长值:默认是一个接着一个切取(值为1),如果为2,则表示进行隔一取一操作。步长值为正时表示从左向右取,如果为负,则表示从右向左取。步长值不能为0 。
Sequence[start:end:step] python的序列切片中,第一个:隔离了 起始索引 和 结束索引,第二个:隔离了 结束索引 和 步长
step为正,则从左到右切片,如果 start > end,则为空
step为负,则从右到左切片,如果 start < end,则为空
start 和 end 填空,前者表示最开始,后者表示最后一个, 同时为空的时候,表示取所有。至于方向,取决于 step
可以总结一句规律,step 为正表示从左到右切片,反之为右到左。
如:
L[a:b:c]
->表示,从索引a开始每隔c个间隔取,直到索引b为止,但不包括索引b。
- 只写[:]就可以原样复制一个list。字符串也可以用切片操作,Python没有针对字符串的截取函数,只需要切片一个操作就可以完成。
迭代
可以通过for循环来遍历,这种遍历我们称为迭代(Iteration)。任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环。
- 在Python中,迭代是通过for … in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的。
- enumerate函数 :Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身。
#enumerate把list表索引
for i,value in enumerate(['A','B','C']):
print(i,value)
输出:
0 A
1 B
2 C
列表生成式
列表生成式(range())即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
-
list() 方法用于将元组转换为列表。
注:元组(tuple)与列表(list)是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中。
- 运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
- for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value。
执行表达式 for 变量(k,v) in 集合(range())
- isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
isinstance() 函数用法:
生成器
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
- 创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。
- generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
- generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
- for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。关于如何捕获错误,查看后面的错误处理。
-
对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
注:请注意区分普通函数和generator函数,普通函数调用直接返回结果;generator函数的“调用”实际返回一个generator对象。
#斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得 到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
代码如下:
#使用生成器:generator
def fib(max):
n,a,b = ,,
while n < max:
yield (b)
a,b = b,a+b #把a赋值给n会导致n的个数随fib数增长
n = n+
return 'done'
for n in fib(): #循环迭代
print(n)
获取return的返回值’done’
while True:
try:
x = next(g)
print('g:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
迭代
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
-
可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象。
- iter()函数:生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。把list、dict、str等Iterable变成Iterator可以使用iter()函数.
16.Python的Iterator对象表示的是一个数据流,Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
总结:
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
学习网站: www.liaoxuefeng.com