1 特性
1.1 切片操作
可以对列表、字符串、元组等序列类型操作
list1=[1,2,3];a=list1[:2];a[0]=2 #list1 由于列表元素是不可变的数值类型,所以改变数据时,显式的创建了新的数据,因此改变a,list1不受影响(但是对于numpy的array类型,切片只是原数组的视图,任何改变都会反映到原数组,应该用.copy()方法复制一份)
从0开始计数
list1=[1,2,3,4,5]list1[:3] #[1,2,3]不包含索引为3(即元素4)
最后一个元素 list1[-1]
最后十个元素 list1[-10:]
步长 list1[::-1]翻转
1.2 迭代器
1.2.1 迭代器(Iterator)
是一个实现了__next__()方法的对象。迭代器同时也是可迭代对象。而不是通过索引来计数。不能向后移动,不能回到开始,也不能被复制。
*注:Iterator实现的__iter__是为了兼容Iterable的接口,从而让Iterator成为Iterable的一种实现。
Iterator也是一种Iterable,所以也需要实现Iterable的接口,也就是__iter__,这样在for当中两者都可以使用。Iterator的__iter__只需要返回自己就行了。比如for i in list1: 和for i in iter(list1):都对。
list、dict等对象可以重复和并发遍历,通过__iter__每次返回一个独立的迭代器,可以保证不同的迭代过程不互相影响。而生成器表达式的结果往往是一次性的,不可以重复遍历,所以直接返回一个Iterator就好。让Iterator也实现Iterable的兼容就可以很灵活地选择返回哪一种。
1.2.2 可迭代对象(lterable)
可以直接作用于for循环的对象统称为可迭代对象。是实现了__iter__()方法的对象,可以被迭代。
一类是集合数据类型,如list、tuple、dict、set、str等,一类是generator,包括生成器表达式和带yield的generatorfunction返回的生成器对象。
可以调用iter()函数,返回一个迭代器。
可以使用如下语句判断一个对象xx是否是Iterable对象。
from collectionsimport Iterable
isinstance(xx,Iterable)
内建函数iter(): 调用对象的__iter__()方法。例如 i=iter([1,2,3,4]);i.next() #
字典:字典的迭代器会迭代它的键。iter(dict1) # 会返回键的迭代器
文件:for循环可以自动调用文件对象的readline() 方法.
for eachLine in myFile:
*不要在迭代可变对象的时候修改它们。比如遍历列表时删除满足条件的项。而迭代器是与原始对象捆绑在一起,语法上禁止迭代中改变对象长度。
1.2.3 相关模块:itertools
1.3 列表解析
迭代 iterable 对象的所有条目. 前边的expr应用于序列的每个成员, 最后的结果值是该表达式产生的列表.con_exdr是筛选或过滤条件
[expr for iter_val in iterable]
[expr for iter_val in iterable ifcond_expr]
[x**2 for x in range(8) if not x % 2]
迭代二维对象,相当于循环嵌套:
[expr for iter_val1 in iterable1 ifcond_expr2 for iter_val2 in iterable2 ifcond_expr2]
[(x+1,y+1) for x in range(3) for y inrange(5)]
len([word for line in myFile for wordin line.split()])#迭代每个单词
1.4 生成器(generator)
1.4.1 生成器表达式
与列表解析式相似,但是不生成整个列表,而是每次计算出一个条目,就把它yield出来,内存上更有效。
(expr for iter_var in iterable if cond_expr)
例1:计算文本中非空白字符总和
sum(len(word) for line in data for wordin line.split())#每计算出一个len(word)就传给sum()
1.4.2 生成器
生成器实现了__next__()方法,因此本身是一个迭代器,同时也是可迭代对象。它是一个带yield 语句的函数, 生成器能暂停执行并返回一个中间的结果.
生成器函数的默认返回值是一个生成器。调用生成器函数将返回一个生成器:val1=gen()
当到达函数结束或return,(当调用next()),抛出StopIteration异常。
def foo(): print(1) yield ('yield:1') print(2) yield ('yield:2') return 'done' | o=foo() next(o) next(o) next(o) | #必须用变量调用生成器函数,才能获得一个生成器 #或者o.__next__(), 返回1 yield:1 #返回2 yield:2 # 返回异常StopIteration: done |
.send()函数:在生成器函数中,将yield变成一个表达式,使其有一个值n = (yield n),这个值就是外部调用send(val)时传进来的参数,可供生成器下一次使用。
.close()函数:用于关闭生成器。
1.4.3 相关模块:pipe
2 语句
2.1 语句基础
换行:跨行符: \ 语句分行; 三引号:''' 字符串跨行; 括号元素:() {} []等
同一行写多个语句:用分号 ;(不提倡)
2.2 成员关系操作(in, not in)
可以对列表、字符串、元组、字典(查询的是键)类型操作,返回bool逻辑值
2.3 三元操作符
val1=1 if x==1 else 2 #如果x==1,则val1=1,否则val1=2
2.4 for循环
for循环访问一个可迭代对象,序列、迭代器。
2.4.1 迭代序列
①通过序列项迭代:for item in seq1:
②通过索引: for index in range(len(seq1)):
③使用项和索引: for index,item in enumerate(seq1):
2.4.2 用于迭代器类型
迭代器对象有一个next()方法, 调用后返回下一个条目. 所有条目迭代完后,自动地调用迭代器的next()方法, 捕获 StopIteration 异常并结束循环。
2.4.3 range函数
range() 函数返回的是一个可迭代对象,不是整个列表(可以用list())。
range(start, end, step =1) | 生成k,start <= k < end,以step步长 |
range(end) | 返回[0,end)的可迭代对象 |
2.5 continue
在开始下一次迭代前,如果是条件循环,将验证条件表达式.如果是迭代循环,将验证是否还有元素可以迭代. 只有在验证成功的情况下, 才会开始下一次迭代.
2.6 循环中的else
循环执行完毕正常退出(而不是通过break退出),执行else中的内容。
while xxx: [codes] else: [codes] | for i in XXX: [codes] else: [codes] |