python学习-3-切片,迭代,列表生成式,生成器,迭代器

切片

  • list[0:3] 实际范围[0,3)
  • list[-3:-1] 倒数第三个,倒数第二个, 不包含倒数第一个
  • list[-3:] 倒数第三个开始到最后
  • list[:3] 前三个
  • list[start: end :步长] 从多少到多少 每几个取一个,此时包含开头
    • 例如[1,2,3,4] list[::2] = [1,3]
  • list[:] list
  • tuple的切片仍然是tuple
  • str可以切片,每个元素是字符
# 去除首尾的空白
def trim(s):
    start = 0
    for i in range(len(s)):
        if s[i]!=" ":
            start = i
            break
    end = len(s)
    for i in reversed(range(len(s))):
        if s[i]!=" ":
            end = i+1
            break
    return s[start:end]

迭代

  • for ch in str 可以直接遍历字符串中的字符
  • 判断一个对象是否可迭代, collection.abc中的Iterable类型判断
    • isinstance(xxx,Iterable)
  • 需要下标时,使用enumerate将list变为 索引-元素对
    • for i, val in enumerate(list)
  • for循环里,可以同时引用两个变量

列表生成式

  • 创建list
  • [x * x for x in range(1,11)]
  • [x * x for x in range(1,11) if x%2 == 0]
    • 此时的if放在后面,作为过滤的条件
    • 此时的if后不能加else
  • 循环也可以多层使用
    • [m+n for m in ‘ABC’ for n in ‘XYZ’]
    • 结果为AX,AY,AZ,BX,BY,BZ,CX,CY,CZ
  • for前面是一个表达式,必须要有具体的结果
    • [x if x%2 ==0 else -x for x in range(1,11)]
    • 意为偶数为正,奇数为负
    • 这里的if就不是过滤条件了,因此需要补上else,使其称为一个完整的表达式
  • 总结,if放for后,就是过滤条件,不能要else; if放for前,就是表达式,必须要else
  • practice: [s.lower() if isinstance(s,str) else s for s in L]

生成器

  • 不创建完整的list,而是在循环的过程中不断推算出后续的元素,从而节省内存
  • generator
  • 创建生成器
    • 将列表的[]改为()
    • 在函数中,yield
      • 每次调用next()时函数执行,遇到yield返回,再次执行时从上从yield后继续执行
      • def fun():xxx g = fun() ,然后使用g就ok
      • for循环访问生成器时,无法拿到return值,只能捕获StopIteration错误才行
  • 通过next(g)来访问下一个元素
    • 当没有元素时,会抛出StopIteration错误
    • 一般使用for循环来使用
      • for each in g
  • 杨辉三角行生成器实现
def yanghui_triangle(n):
    '''
    打印杨辉三角
    :param n: 一直到第几行
    :return:
    '''
    l = [1] # 初始列表
    yield l
    for i in range(n):
        res = [1]+[l[j]+l[j+1] for j in range(len(l)-1)]+[1]
        l = res
        yield res

迭代器

  • 可用于for循环的对象: 可迭代对象-Iterable
    • list,tuple,dict,set,str
    • generator
  • 可用isinstance(xx,Iterable)判断
  • 可被next()函数调用的被称为迭代器-Iterator
  • 也可用isinstance判断
  • 迭代器
    • generator
    • iter(xxx)将Iterable变成Iterator
  • Iterator对象表示一个数据流,可以不断算出下一个数据,但是不知道它的长度
  • 它是惰性的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值