Python中的列表List

目录

列表

列表中常见的函数  

列表的操作(增删改查)

列表生成式

列表生成器

列表生成器的取值

生成式和生成器的区别

将一个函数变为生成器


列表

a=[1,"htll",(5,6)]     

列表是Python中非常重要的数据类型,通常作为函数的返回类型。

列表中的元素的值可以改变,元素类型可以不同(可以是数字、字符、或者序列),元素可重复。

列表中的元素可以是元组或其他序列

>>b=[(1,2),(3,4),(5,6)]
>>for x,y in b:
>>    print (x,y)
1   2
3   4
5   6

列表可以相加和乘以一个整数,列表不支持相减、相除和除以一个数 

>>a=[1,2,3]
>>b=[4,5,6]
>>print(a+b)         //列表的相加
>>print(a*2)         //列表乘以一个整数
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 1, 2, 3]

列表中常见的函数  

列表的操作(增删改查)

>>a=[1,'xie',('age',20)]
>>print(a)
>>a.append('hello')        //增,在最后加一个元素
>>print(a)
>>a.pop(-1)               //删,删除并返回索引为-1的元素
>>print(a)
>>a.insert(1,'hello')    //增,在索引为1的元素前加一个元素
>>print(a)
>>a.remove('hello')      //删,移除 'hello' 元素
>>print(a)
>>a[1]='xiao'           //改,修改索引为1的元素
>>print(a)
>>print(a[1])           //查,查询索引为1的元素
[1, 'xie', ('age', 20)]
[1, 'xie', ('age', 20), 'hello']
[1, 'xie', ('age', 20)]
[1, 'hello', 'xie', ('age', 20)]
[1, 'xie', ('age', 20)]
[1, 'xiao', ('age', 20)]
xiao

列表生成式

根据已有列表,高效创建新列表的方式。列表生成式是Python迭代机制的一种应用,它常用于实现创建新的列表,因此用在[ ]中。

语法:[ expression  for iter_val in iterable if  cond_expr ]

>>>[i for i in range(10) if i<5]
[0, 1, 2, 3, 4]

列表生成器

通过列表生成式,我们可以直接创建一个新的列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的 list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator
列表生成器是列表生成式的 [] 换成 (),这样就生成了一个  generator生成器

列表生成式:[ expression  for iter_val in iterable if  cond_expr ]

列表生成器:( expression  for iter_val in iterable if  cond_expr )

>>>[i for i in range(10) if i<5]
[0, 1, 2, 3, 4]
>>>(i for i in range(10) if i<5)
<generator object <genexpr> at 0x000002512EB6D318>

列表生成器的取值

列表生成器是一个Iterator迭代器,所以可以通过 next() 函数不断取值,直到取到最后没有值了,然后抛出StopIteration错误表示

>>a=(i for i in range(10) if i<5)
>>print(next(a))
0
>>print(next(a))
1
>>print(next(a))
2
>>print(next(a))
3
>>print(next(a))
4
>>print(next(a))
StopIteration

因为是Iterator迭代器,所以也是Iterable可迭代对象,所以可以使用for循环取值

>>a=(i for i in range(10) if i<5)
>>for i in a:
>>    print(i)
0
1
2
3
4

注: 生成式是一个list,而生成器是一个 generator,list是可以直接就打印出来的,而generator要打印出来,可以使用迭代,因为generator生成器是一个可迭代的对象(Iterable),也是一个迭代器 (Iterator)。

可以用list( )方法将其转换为 list 列表,然后直接打印出来

>>>a=(i for i in range(10) if i<5)
>>>b=list(a)
>>>print(b)
[0, 1, 2, 3, 4]

生成式和生成器的区别

  • 生成器格式最外层是一个 () ,而列表生成式格式最外层是一个 []
  • 生成器是将数据不用一次读取,而列表生成式是一次读取所有数据(耗内存)
  • 生成器返回的是一个生成器对象(不能直接循环),而列表生成式返回的是一个新列表
  • 生成式是Iterable可迭代对象,但不是Iterator迭代器
  • 生成器既是Iterator迭代器,也是Iterable可迭代对象

将一个函数变为生成器

写一个斐波拉契数列的函数

def fib(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
        n=n+1

仔细观察,可以看出,fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似 generator
也就是说,上面的函数和 generator仅一步之遥。要把fib函数变成 generator,只需要把 print(b) 改为 yield b 就可以了
写一个斐波拉契数列的generator

def fib(max):
    n,a,b=0,0,1
    while n<max:
        yield b           //如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
        a,b=b,a+b
        n=n+1

最难理解的就是 generator 和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用 next() 的时候执行,遇到 yield 语句返回,再次执行时从上次返回的yield语句处继续执行
要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束
 

相关文章:Python中的迭代Iterable和迭代器Iterator

猜你喜欢

转载自blog.csdn.net/qq_36119192/article/details/83585254