高级特性
利用python的高级特性,实现用少量代码实现功能,做到代码少,开发效率高。
切片
普通索引对经常取定范围索引操作,需采用循环方式,显得十分的繁琐,slice就是为了简化这繁琐操作衍生出来的产品。切片(slice)是对序列型对象(如list, string, tuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。例子:
列表:
Lt = [1,'hello','早上好']
只想获取后面两个参数:
普通索引
>>> Lt = [1,'hello','早上好']
>>> Lt
[1, 'hello', '早上好']
>>> LtNew = []
>>> for i in range(3):
... if i > 0:
... LtNew.append(Lt[i])
...
>>>
>>> LtNew
['hello', '早上好']
切片
>>> Lt[1:3]
['hello', '早上好']
迭代
迭代就是遍历,也就是for循环。怎么判断是否可以迭代呢?
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
列表生成式
列表生成式即List Comprehensions,字译–>用来创建list的生成式
如:[1,2,3,4,5,6],可以用list(range(1,7))
>>> L = range(1,11)
>>> list(L)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
利用列表生成式和迭代的方式可以快速的拿到想要的列表,如Lt = [1,‘hello’,‘早上好’],想要获取Lt中字符串:
>>> Lt = [1, 'hello', '早上好']
>>> LtString = [s.lower() for s in Lt if isinstance(s, str)]
>>> LtString
['hello', '早上好']
临时跳跃一下知识点: s.lower 最后把一个list中所有的字符串变成小写
for s in L1 for循环
if isinstance(s, str) 判断条件,isinstance函数用于判断,第一个参数是需要被判断的变量,第二个是判断条件,这是判断s变量是不是字符串
生成器
一边循环一边计算的机制称之为生成器,简单的创建方式是将列表生成式的[]改为()就可以了
>>> Lg = (1, 'hello', '早上好')
>>> for n in Lg:
... print('n:', n)
...
n: 1
n: hello
n: 早上好
上面没有运算,无法体现生成器的优势,下面就拿廖雪峰老师的练习题杨辉三角来体验一下吧!
>>> def triangles():
... L = [1]
... while True:
... yield L
... L = [sum(i) for i in zip([0] + L, L + [0])]
...
>>> n = 0
>>> results = []
>>> for t in triangles():
... results.append(t)
... n = n + 1
... if n == 10:
... break
...
>>> for t in results:
... print(t)
...
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator(生成器)。
需要特别注重理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回,再次执行就是重新开始。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
补充知识:
sum函数式对序列进行求和计算;zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。