切片可以获取某个区间段的元素
li = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 切片
print(li[2:5]) # 2<= idx < 5 左闭右开
print(li[:4]) # 从第一个元素开始
print(li[5:]) # 到最后一个元素
print(li[:]) # 全部输出
print(li[0:6:2]) # 2为步长
print(li[3::2]) # 到最后一个元素,且步长为2
#负数索引和step
print(li[::-1]) # 反向逐个元素输出,-1不能出现在冒号的左侧
print(li[::-2]) # 反向输出,步长为2
print(li[-6:-1:1]) # 反向输出 [5, 6, 7, 8, 9]
print(li[-1::-1]) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 等同 li[::-1]
print(li[-1::]) # 这里仅输出一个元素 10
# 一维数组
print([i * 2 for i in range(10)]) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print([i * i for i in range(10) if (i % 3) == 0]) # [0, 9, 36, 81]
print([(x, y) for x in range(3) for y in range(3)]) # [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
# 二维数组
a = [[3] * (i + 1) for i in range(3)] # [[3], [3, 3], [3, 3, 3]]
print(a[2]) # [3, 3, 3]
# 乘法的问题
a = [[1, 2, 3]] *3 # [[1, 2, 3], [1, 2, 3], [1, 2, 3]] 等于直接将原来的数组出现三次,我理解,这三个数组的性质应该都一样
a[1][1] = 100 # [[1, 100, 3], [1, 100, 3], [1, 100, 3]] 这里会出现错误,都被修改成了100
print(a) #
# 解决方法(正确的写法)
a = [[1, 2, 3] for i in range(3)] # [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
a[1][1] = 100 # [[1, 2, 3], [1, 100, 3], [1, 2, 3]]
print(a)
# 生成器
# 简单方法
x = range(10)
print(type(x)) # <type'list'>
sx = (x * x for x in range(10))
print(type(x)) # <type'generator'> 如果是[]在外面,则直接生成list
# 然后利用函数进行循环输出
'''
print(next(sx))
print(next(sx))
print(next(sx))
print(next(sx))
print(next(sx))
print(next(sx))
print(next(sx))
print(next(sx))
print(next(sx))
print(next(sx))
'''
for i in sx:
print(i) # 依次进行输出
# 生成器生成fib数列
def fib(limit):
n, a, b = 0, 0, 1
while n < limit: # 注意此处是小于
yield b # 生成值
a, b = b, a + b
n += 1
return 'done'
for i in fib(10):
print(i)
# 输出
1
1
2
3
5
8
13
21
34
55
1
这里我们看下yield生成器的用法:
任何使用yield函数都称为生成器,是一个返回迭代器的函数,使用yield,可以让函数生成一个序列
该函数返回的对象是"generator",通过该对象连续调用netx()方法返回序列值。
#生成器
def count(n):
while n > 0:
yield n # 生成值 n
n -= 1
# 调用,此时不输出内容,生成器只有在调用next()等执行操作的时候,才会有输出
c = count(5)
# 第一次调用,在第一次碰见yield处停止,此处n为5
c.next() # 输出5
# 第二次调用 , 在上次碰见yield地方,即n=5的地方,继续执行 n -= 1,然后等再次碰见yield的时候,停止。
c.next() # 输出4
为了更加直观的看到执行步骤,详细见以下代码:
def count(n):
print("counting")
while n > 0:
print('before yield')
yield n
n -= 1
print('after yield')
输出:
>>> c.next()
counting
before yield
5
>>> c.next()
after yield
before yield
4
>>> c.next()
after yield
before yield
3
在清楚了以上的执行顺序的后,我们用print()来进行循环输出
>>> for i in count(5):
... print(i)
...
counting
before yield
5
after yield
before yield
4
after yield
before yield
3
after yield
before yield
2
after yield
before yield
1
after yield