书籍封面

Python教程

作者 廖雪峰
15.0 分钟

摘要

高级Python教程总结

总结: 本文总结了廖雪峰Python教程中高级特性的部分,包括切片、迭代、列表生成式、生成器和迭代器,这些都是编写简洁高效Python代码的重要工具。

你能获得:

  • 掌握Python高级特性的使用技巧,写出更优雅、更高效的代码。
  • 了解函数式编程的基本概念,学会使用map/reduce/filter等高阶函数。
  • 学习闭包和匿名函数,理解Python中函数式编程的强大之处。

核心内容:

1. 切片(Slice):

  • 可以高效地截取list, tuple, 字符串等序列类型的部分元素,避免使用循环。

  • 使用

    L[start:end:step]
    的形式,可以省略start和end,step可以定义步长。

  • 字符串也支持切片操作,结果仍然是字符串。

    • 详细解释:切片操作可以从序列中提取指定范围内的元素,非常灵活。
      start
      表示起始索引,
      end
      表示结束索引(不包含该索引),
      step
      表示步长。
    • 举例:
      L[::2]
      表示从列表L中每隔一个元素取一个,即取出索引为偶数的元素。

2. 迭代(Iteration):

  • 可以使用

    for ... in
    循环遍历list, tuple, dict, str等可迭代对象。

  • dict默认迭代key,使用

    d.values()
    迭代value,使用
    d.items()
    同时迭代key和value。

  • 使用

    collections.abc.Iterable
    判断对象是否可迭代。

  • enumerate
    可以将list转换为索引-元素对,方便在循环中同时获取索引和元素。

    • 详细解释:迭代是指按顺序访问一个集合中的每个元素。Python的for循环可以作用于任何可迭代对象,无需关心内部实现细节。
      enumerate
      函数可以将列表转换成一个包含索引和值的元组序列。
    • 举例:
      for i, value in enumerate(L): print(i, value)
      可以同时打印列表L的索引和值。

3. 列表生成式(List Comprehensions):

  • 可以用简洁的语法来创建list,避免使用循环。

  • 格式:

    [expression for variable in sequence if condition]

    • 详细解释:列表生成式是一种创建列表的简洁方式。它将循环和条件判断结合在一起,可以在一行代码中生成复杂的列表。
    • 举例:
      [x for x in range(1, 11) if x % 2 == 0]
      可以生成包含1到10之间所有偶数的列表。

4. 生成器(Generator):

  • 是一种特殊的迭代器,可以按需生成值,节省内存空间。

  • 可以通过将列表生成式的

    []
    改为
    ()
    创建,也可以通过包含
    yield
    关键字的函数创建。

  • 使用

    next()
    函数获取生成器的下一个值,直到抛出
    StopIteration
    异常。

  • 通常使用

    for
    循环迭代生成器。

    • 详细解释:生成器是一种惰性计算的机制,只有在需要的时候才会生成下一个值。它非常适合处理大数据集,可以避免一次性加载所有数据到内存中。
    • 举例:使用
      yield
      关键字定义的函数可以返回一个生成器对象。每次调用
      yield
      ,函数会暂停执行并返回一个值,下次调用时从上次暂停的地方继续执行。

5. 迭代器(Iterator):

  • 可以被

    next()
    函数调用并不断返回下一个值的对象,直到最后抛出
    StopIteration
    错误。

  • 可以使用

    iter()
    函数将
    Iterable
    对象转换为
    Iterator
    对象。

    • 详细解释:迭代器是一个可以记住遍历位置的对象。它只能往前不能后退。迭代器可以被
      next()
      函数调用,并返回序列中的下一个值,直到序列结束。
    • 举例:列表、元组、字符串都属于可迭代对象,但不是迭代器。可以通过
      iter()
      函数将它们转化为迭代器。

6. 高阶函数:

  • 变量可以指向函数,函数名是变量。
  • 允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
  • Python对函数式编程提供部分支持,但由于Python允许使用变量,因此,Python不是纯函数式编程语言。
  • map()函数:将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
  • reduce()函数:必须接收两个参数, reduce把结果继续和序列的下一个元素做累积计算。
  • filter() 函数用于过滤序列。filter() 也接收一个函数和一个序列。和map() 不同的是, filter() 把传入的函数依次作用于每个元素,然后根据返回值是True 还是False 决定保留还是丢弃该元素。
  • sorted()函数:可以接收一个key函数来实现自定义的排序。

7. 返回函数:

  • 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
  • 当我们调用 lazy_sum() 时,返回的并不是求和结果,而是求和函数。
  • 返回的闭包函数调用一切正常

8. 闭包:

  • 闭包用起来简单,实现起来可不容易。
  • 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
  • 使用闭包时,对外层变量赋值前,需要先使用nonlocal 声明该变量不是当前函数的局部变量。

问答:

Q: 什么是切片操作?它有什么优点?

A: 切片操作可以从序列类型(如list, tuple, 字符串)中提取指定范围内的元素,避免使用循环,代码简洁高效。

Q: 生成器和列表有什么区别?生成器有什么优势?

A: 列表一次性生成所有元素,占用较多内存;生成器按需生成元素,节省内存空间。适用于处理大数据集或无限序列。

Q: 如何判断一个对象是否是可迭代对象或迭代器?

A: 使用

collections.abc.Iterable
判断对象是否可迭代,使用
collections.abc.Iterator
判断对象是否为迭代器。

Q: 什么是闭包?使用闭包有什么需要注意的地方?

A: 闭包是内层函数引用了外层函数的局部变量,当外层函数执行完毕后,这些局部变量仍然可以被内层函数访问。

  • 注意返回函数不要引用任何循环变量,或者后续会发生变化的变量。 如果对外层变量赋值,由于Python解释器会把 x 当作函数 fn() 的局部变量,它会报错, 需要在使用闭包时,对外层变量赋值前,需要先使用nonlocal 声明该变量不是当前函数的局部变量。

思维导图

目标读者

This tutorial is designed for beginners who have basic computer skills but no programming experience, remember high school math equations, want to become professional software architects, and can dedicate half an hour daily to learning.

作者背景

廖雪峰 is a software developer and author known for his easy-to-understand programming tutorials.

历史背景

Python was created by Guido van Rossum in 1989 during Christmas. The language emphasizes code readability and simplicity, making it suitable for various applications from web development to data science.

章节摘要

音频

Coming Soon...