1、数组切片
li = list(range(10)) #创建数组,从0到9,步长为1
print(li)
(1)切片三个参数
# 切片 [start:end:steps] >= start 并且 < end,steps为步长 print(li[2:5]) # [3, 4, 5],缺省steps print(li[:4]) # [0, 1, 2, 3],缺省start和steps print(li[5:]) # [6, 7, 8, 9],缺省end和steps print(li[0:20:3]) # [0, 3, 6, 9]
注意事项:如果start缺省,则从0开始;如果end缺省,则一直到末尾;如果steps缺省,则步长默认为1
(2)负值怎么处理
# 负值怎么处理? print(li[5: -2]) # [5, 6, 7],倒数第二为结束 print(li[9:0:-1]) # [9, 8, 7, 6, 5, 4, 3, 2,1],负数大于0 print(li[9::-1]) # [9 ... 0],这里包含0,一直到结束 print(li[::-2]) # [9, 7, 5, 3, 1],从0开始,倒数 # 切片生成一个新的对象 print(li) # 还是保持原样 re_li = li[::-1] #快速反转,[9 ... 0] print(re_li)
2、生成器:
# 平方表,5000个数据,但是只用其中几个,这样大量的数据就浪费了 square_table = [] for i in range(5000): square_table.append(i * i) for i in range(5): print(square_table[i])生成器的作用:用来节省资源和空间
#根据上面的平方表创建的生成器,用到了才会计算,不用的话,不计算 square_generator = (x * x for x in range(50000)) print(type(square_generator)) for i in range(5): print(next(square_generator))
#生成器的又一个实例: def fib(limit): n, a, b = 0, 0, 1 while n < limit: yield b #表示每当出现一个next,就会从这里开始循环一次 a, b = b, a + b n += 1 return 'done' import traceback f = fib(5) print(type(f)) #这里f是一个生成器 print(next(f)) #第一次调用 print(next(f)) #第二次调用 print(next(f)) #第三次调用 print(next(f)) #第四次调用 print(next(f)) #第五次调用 try: print(next(f)) #这里再次调用,就已经结束了 except StopIteration: traceback.print_exc() for i in fib(5): print(i)
注意:在2.7版本中,range一次,就会生成所有的数值列表,但是3.5版本以后,range一次,不会全部生成,你next一次,就会生成一个,节省了大量的内存。
3、迭代器:
(1)
(2)判断是否可以迭代:
from collections import Iterable from collections import Iterator #判断是否可以迭代 print(isinstance([1, 2, 3], Iterable)) print(isinstance({}, Iterable)) print(isinstance(123, Iterable)) print(isinstance('abc', Iterable)) #判断是否可以迭代 print(isinstance([1, 2, 3], Iterator)) #判断列表是否是迭代器 g = (x * x for x in range(10)) #这是一个生成器,但是否可以迭代呢? print(type(g)) #返回结果表示是可以迭代的 print(isinstance(g, Iterable)) print(isinstance(g, Iterator)) for i in g: #如果可以迭代,就可以用for进行调用 print(i)
#判断下面这个函数(本身是一个生成器),是否是迭代器 def fib(limit): n, a, b = 0, 0, 1 while n < limit: yield b a, b = b, a + b n += 1 return 'done' f = fib(6) print(type(f)) print(isinstance(f, Iterable)) print(isinstance(f, Iterator)) for i in f: #上面判断,f函数是迭代器,所以可以用for循环 print(i)好吧,说白了,判断是否是迭代器,就是为了验证它是否可以用for循环来访问,貌似除了这个作作用,没有其他的作用了