【廖雪峰Python教程】三、高级特性

本文详细介绍了Python中的高级特性,包括列表切片、索引操作、迭代方法(for循环),以及列表生成式、生成器和迭代器的概念。重点讲解了如何使用这些特性处理数据和控制数据流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考资料Python教程 - 廖雪峰的官方网站 (liaoxuefeng.com)

三、高级特性

  1. 切片(左闭右开,索引差值为所取元素的个数)【tuple和字符串都可以看成一种list进行切片操作,操作结果仍是tuple和字符串→所以如果取出来的是数字且要用到,别忘了int一下转化为整数型。
  • 取前3个元素

    • L[0:3] (从索引0开始取,直到索引2为止)
    • 或L[:3] (第一个索引是0,可以省略)
  • 取倒数两个元素

    • L[-2:] (第一个索引是-2,第一个索引是0,取-2,-1;不取0,左闭右开。类似于数轴上负数形式。)
    • 倒数第一个元素的索引是-1
  • 前10个数,每两个取一个

    • L[:10:2]
  • 所有数,每5个取一个

    • L[::5] (取值的索引是::,即前后不限制从所有数值里取)
  • 所有数实现反转数字的顺序(从后往前取)

    • L[::-1]
  1. 迭代
  • 通过for循环来遍历这个listtuple,这种遍历我们称为迭代(Iteration)

  • 只要是可迭代对象,无论有无下标,都可以迭代

    • 列表
    • 字典
      • 默认情况下,dict迭代的是key。
      • 如果要迭代value,可以用for value in d.values()
      • 如果要同时迭代key和value,可以用for k, v in d.items()
    • 字符串
      • for character in 'ABC':
  • 1️⃣判断对象是否可迭代

    • 通过collections.abc模块的Iterable类型判断

      •   >>> from collections.abc import Iterable
          
          >>> isinstance('abc', Iterable) # str是否可迭代
          True
          >>> isinstance([1,2,3], Iterable) # list是否可迭代
          True
          >>> isinstance(123, Iterable) # 整数是否可迭代
          False
        
  • 实现下标循环

    • Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

      •   for i, value in enumerate(['A', 'B', 'C']):
          ...     print(i, value)
        
  1. 列表生成式(List Comprehensions)
  • 用来创建list,通过一个list推导出另一个list的生成式

  • 举例

    •   >>> [x * x for x in range(1, 11)]
        [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
        
        >>> [x * x for x in range(1, 11) if x % 2 == 0]
        [4, 16, 36, 64, 100]
        
        >>> [m + n for m in 'ABC' for n in 'XYZ']
        ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
      
  • 在一个列表生成式中,for前面的if ... else是表达式;而for后面的if是过滤条件,不能带else


    🚩对比学习 字典推导式Dictionary Comprehension:

    • 公式:{key_expr: value_expr for item in iterable}

      • key_expr 是对于每个 item 计算出的的表达式。
      • value_expr 是对于每个 item 计算出的的表达式。
      • iterable 是一个可迭代的对象,例如列表、集合、字符串等。
    • 示例 1: 创建一个字典,将列表中每个元素的平方作为值

      pythonCopy codenumbers = [1, 2, 3, 4, 5]
      squares_dict = {num: num**2 for num in numbers}
      print(squares_dict)
      # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
      

      示例 2: 使用条件表达式过滤元素

      pythonCopy codenumbers = [1, 2, 3, 4, 5]
      even_squares_dict = {num: num**2 for num in numbers if num % 2 == 0}
      print(even_squares_dict)
      # 输出: {2: 4, 4: 16}
      

      示例 3: 将字符串的字符作为键,其位置作为值

      pythonCopy codeword = "hello"
      char_positions = {char: index for index, char in enumerate(word)}
      print(char_positions)
      # 输出: {'h': 0, 'e': 1, 'l': 2, 'o': 3}
      
  1. 生成器列表生成式
  • 生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了
  • (初步先不用深入了解,后续再补充细节)
  1. 迭代器Iterator
  • 可迭代对象:Iterable(可以直接作用于for循环的对象)

    • 集合数据类型
      • listtupledictsetstr
    • generator
      • 生成器
      • yield的generator function
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

    • 2️⃣判断对象是否是迭代器

      •   >>> from collections.abc import Iterator
          >>> isinstance((x for x in range(10)), Iterator)  #可能类似这种式子就是迭代器?→生成器都是迭代器!
          True
          >>> isinstance([], Iterator)
          False
          >>> isinstance({}, Iterator)
          False
          >>> isinstance('abc', Iterator)
          False
        
    • 3️⃣生成器都是Iterator对象,但listdictstr虽然是可迭代对象Iterable,却不是生成器Iterator

    • 4️⃣ 所以:把listdictstrIterable变成Iterator可以使用iter()函数:

      >>> isinstance(iter([]), Iterator)
      True
      >>> isinstance(iter('abc'), Iterator)
      True
      
  • ❓ 提问:为什么listdictstr等数据类型不是Iterator

    • 这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
    • 可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
    • Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
  • 小结

    • 凡是可作用于for循环的对象都是Iterable类型❗

    • 凡是可作用于next()函数的对象都是Iterator类型❗,它们表示一个惰性计算的序列;

    • 集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值