廖雪峰Python笔记[3] - 切片/迭代/生成器/列表生成式

目录

 

1. 数据切片

2. 迭代

3. 列表生成式和生成器

4. 迭代器


1. 数据切片

       数据切片是为了获取集合中的某些数据,可以看作更自由地从集合中拿到想要的数据,适用于list、tuple、str。

today = ['sea','boy','tree','beach']

# 数据切片
print(today[:3]) # 索引不包括3号,为0-2
print(today[-3:]) # 倒索引第一个元素是-1
print(today[:3:2]) # 每两个取一个
print(today[::3]) # 所有数每3个取一个

# tuple可以切片
yesterday = ('winter','white','flame','girl','chrismas')
print(yesterday[::3])

# 字符串也可以切片
tomorrow = 'love you once more.'
print(tomorrow[:4])

2. 迭代

       相比于C中用下标来遍历一个数组,Python用更为简单的for...in实现这一功能,其中可以进行迭代的对象叫做可迭代对象,要判断一个对象是否可以迭代可以使用collections模块中的Iterable。有时我们需要同时获取数组中的索引,enumerate函数提供了将list变成索引-元素对的功能,加上for可以引用多个变量,所以就能实现和C语言循环同样的功能。

from collections import Iterable

print(isinstance('aaa',Iterable)) # 字符串可迭代
print(isinstance([3,1,4,5],Iterable)) # list可迭代
print(isinstance({'take':1,'key':4},Iterable)) # dict可迭代
print(isinstance(1314,Iterable)) # 整数不可迭代

for i,value in enumerate(['such','a','good','life']):
    print(i,value)

for i,v in {'such':43,'a':11,'dict':52}.items(): #dict用items()迭代key和value
    print(i,':',v)

list = [2,5,11,62,342,7,86,99,1,321,432]
# 练习:返回一个list中的最大最小值
def findMinandMax(L):
    max = L[0]
    min = L[0]
    for i in L:
        if i > max:
            max = i
        if i < min:
            min = i
    return max,min

findMinandMax(list)

3. 列表生成式和生成器

       列表生成式用于生成一个有一定规则的列表,比如1*1,2*2...,它可以简化代码量,能写一行就不写多行。

print([x*x for x in range(10) if x > 4]) # if
print([m+n for m in 'home' for n in 'life']) #两层循环

list = ['Hello', 'World', 18, 'Apple', None]
[s.lower() for s in list if(isinstance(s,str))]

       对于一个占据内存很大,但是又只用到前面一部分元素的列表,后面的大量数据使得内存空间被浪费,生成器就可以解决这个问题。生成器通过推算得到列表元素,不用创建完整的表,可以节省很多空间,它与列表生成式很像,只是将[]换成了()。用next()可以不断得到推算的元素,但是由于generator是一个可迭代对象,所以可以用for遍历。

g = (x*x for x in range(8)) #生成器

from collections import Iterable
print(isinstance(g,Iterable)) # g是一个可迭代对象
for i in g:
    print(i)

       另一种定义生成器的方式是在函数中使用yield关键字,这时的函数就会变成generator,同样可以使用next()和for...in查看每次生成的值,与一般函数运行到return就返回不同,generator运行到yield结束,调用next()后从上次中断的地方开始继续运行,遇到yield结束。这样的话你会发现我们无法得到函数的返回值,要想拿到返回值,需要捕捉StopIteration错误。

# 计算斐波那契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a+b
        n = n+1
    return 
print(fib(6))
for i in fib(6):
    print(i)
    
g = fib(5)
while True:
    try:
        x = next(g)
        print("g:",x)
    except StopIteration as e:
        print("return: ",e.value)
        break

4. 迭代器

       可以用for...in迭代的对象叫Iterable对象,可以用next()的对象叫Iterator对象,有些数据结构是Iterable的,但是不是Iterator,比如list、dict、str,可以用iter()将它转换为Iterator对象。

from collections import Iterator

print(isinstance([],Iterable))
print(isinstance([],Iterator))
print(isinstance(iter([]),Iterator))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值