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循环来访问,貌似除了这个作作用,没有其他的作用了