Python入门基础(5)——数组切片与生成器

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




猜你喜欢

转载自blog.csdn.net/yuangan1529/article/details/80679817