前端工程师一天上手 Python 的学习手册

184 阅读13分钟

前言

在这个由人工智能(AI)主导的时代,选择学习 Python 不仅是跟上潮流的决定,更是一步明智的选择。Python 凭借其在数据科学、机器学习和深度学习领域的强大功能,已成为这些领域的首选语言。我根据自己在探索这门语言的旅程中积累的经验,整理了一系列实用的笔记,希望能够帮助初学者迅速适应 Python 的世界,特别是那些对 AI 充满热情的朋友们。这些内容将为您揭开 Python 在 AI 领域应用的神秘面纱,帮助您快速找到自己的定位,开始在 AI 的激流中乘风破浪。

介绍 Python 与 JavaScript 的区别

Python 和 JavaScript 都是动态类型语言,即变量的类型在运行时确定,而非编译时。虽然在类型系统上相似,但两者在其他方面有显著差异。

相似性:动态类型系统

在 Python 和 JavaScript 中,变量无需在声明时指定类型,而是在赋值时自动确定。例如:

# Python 示例
my_var = 5       # 初始为整数
my_var = "hello" # 变为字符串
// JavaScript 示例
let myVar = 5;       // 初始为数字
myVar = "hello";     // 变为字符串

不同之处

  1. 设计理念与用途

    • Python:以易读性和易学性著称,适用于web开发、数据科学、机器学习等多种应用。
    • JavaScript:作为客户端脚本语言而生,主要用于增强网页交互性。现已发展为全栈语言,在前后端均有广泛应用。
  2. 语法与结构

    • Python 语法简洁,使用缩进来定义代码块。
    • JavaScript 语法受 Java 影响,使用花括号 {} 定义代码块。
  3. 并发处理

    • Python 传统上并不擅长并发任务,但现已通过 asyncio 等库支持异步编程。
    • JavaScript 以事件循环和异步编程著称,特别适合处理并发Web请求。
  4. 标准库与生态系统

    • Python 拥有广泛的标准库,覆盖从文件处理到数学运算等多种功能。第三方库生态丰富,尤其在科学计算和数据分析方面。
    • JavaScript 的标准库相对较小,但第三方模块生态系统庞大,尤其是 npm。
  5. 运行环境

    • Python 通常在服务器端或作为脚本语言运行。
    • JavaScript 最初设计用于浏览器,但现在也广泛用于服务器端(如 Node.js)。

尽管 Python 和 JavaScript 都采用动态类型系统,但它们在设计理念、应用领域、语法风格、并发处理、标准库及其生态系统和运行环境方面存在显著差异。

快速上手 Python

1. 安装 Python

访问 Python 官网,下载并安装适合您操作系统的最新版本。安装时,请确保选择了“Add Python to PATH”选项,以便在命令行中直接使用 Python。

2. 设置开发环境

选择适合的文本编辑器,如 VS Code、Sublime Text 或 PyCharm,这些编辑器提供语法高亮、代码提示和调试工具。

3. 编写第一个 Python 程序

创建 hello.py 文件,输入以下代码:

print("Hello, Python!")

4. 运行程序

在包含 hello.py 的目录下,打开命令行并执行:

python hello.py

成功运行后,您会在命令行中看到 “Hello, Python!” 的输出。

基础学习

Python 的数据类型

Python 中的数据类型分为多个类别,为构建复杂数据结构和执行各种任务提供基础。

基本数据类型:

  • 整型(Integers):如 1, 100, -45。
  • 浮点型(Floats):如 1.23, 3.14。
  • 布尔型(Booleans)TrueFalse

序列数据类型:

  • 字符串(Strings):如 "Hello, World!"。
  • 列表(Lists):如 [1, 2, 3, 'apple']
  • 元组(Tuples):不可变,如 (1, 2, 3)

集合数据类型:

  • 集合(Sets):无序且唯一,如 {1, 2, 3}
  • 冻结集合(Frozensets):不可变集合。

映射数据类型:

  • 字典(Dictionaries):键值对映射,如 {'name': 'Alice', 'age': 25}

特殊类型:

  • None:表示空值或不存在,类似于 null 或 nil。

Python 还支持更复杂的类型,如自定义类(对象)和各种库中定义的特殊类型(如 NumPy 的 ndarray)。

控制流程

Python 的控制流程包括条件语句和循环,是编程中的基础。

if 语句

用于基于条件执行代码。

if 条件:
    # 条件为 True 时执行
elif 另一个条件:
    # 第一个条件 False 但第二个条件 True 时执行
else:
    # 所有条件都不满足时执行

for 循环

用于遍历序列。

for 元素 in 序列:
    # 执行代码

while 循环

在条件为真时重复执行代码。

while 条件:
    # 执行代码

循环控制

  • break:退出循环。
  • continue:跳过当前循环剩余部分,继续下一次循环。
  • else(与循环结合):循环正常结束时执行。

示例

# if 语句
x = 10
if x > 5:
    print("x is greater than 5")
elif x == 5:
    print("x is equal to 5")
else:
    print("x is less than 5")

# for 循环
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)

# while 循环
count = 0
while count < 5:
    print(count)
    count += 1

这些控制流程构成了 Python 编程的基础,适用于各种编程任务和逻辑处理。

编写函数和使用标准库模块

函数和标准库模块是 Python 编程的核心。

编写函数

函数是组织好的、可重复使用的代码块,使用 def 关键字定义。

基本语法:
def function_name(parameters):
    # 函数体
    return result  # 可选
示例:
def add_numbers(a, b):
    return a + b

result = add_numbers(5, 3)
print(result)  # 8

使用标准库模块

Python 的标准库提供了许多有用的功能,通过 import 语句导入。

基本语法:
import module_name
# 或者
from module_name import some_function
示例:
import math
print(math.sqrt(16))  # 4.0

from datetime import datetime
now = datetime.now()
print(now)  # 当前日期和时间

在编写函数时,建议遵循 Python 的编码规范,例如 PEP 8,以提高代码的可读性和可维护性。

函数作为参数

Python 支持将函数作为参数传递,体现了函数是一等公民的概念。

def process_name(func, name):
    return func(name)

print(process_name(lambda name: f"Hello, {name}!", "Eve"))

面向对象编程(OOP)

Python 支持面向对象的编程风格,包括类、对象和继承等概念。

类(Class)

类是对象的蓝图,定义属性和方法。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"Hello, I am {self.name} and I am {self.age} years old."

对象(Object)

对象是类的实例,具有类的属性和方法。

person1 = Person("Alice", 30)
print(person1.greet())  # "Hello, I am Alice and I am 30 years old."

继承(Inheritance)

子类继承父类的属性和方法,并可以添加或重写方法。

class Student(Person):
    def study(self):
        return f"{self.name} is studying."

student = Student("Charlie", 20)
print(student.greet())    # "Hello, I am Charlie and I am 20 years old."
print(student.study())    # "Charlie is studying."

进阶学习

Python 如何响应式编程

响应式编程是一种编程范式,Python 通过多种特性支持这一范式。

  1. 异步编程(Async Programming):

    • asyncio 库提供异步编程支持,使用 asyncawait 编写非阻塞代码。
  2. 迭代器和生成器:

    • 迭代器和生成器用于惰性生成和处理数据,适合创建响应式数据流。
  3. 函数式编程:

    • 高阶函数、纯函数和不可变数据结构强调使用函数处理数据流。
  4. 事件循环(Event Loop):

    • asyncio 的事件循环支持程序在处理异步任务时继续运行。
  5. 观察者模式(Observer Pattern):

    • 虽无直接实现,但可以在 Python 中构建观察者模式,允许对象订阅并响应状态变化。

Python 的核心虽非专为响应式编程设计,但提供的工具和特性使其能有效支持这种需求。

Python 的异步编程

异步编程提高了程序在处理 I/O 密集型任务时的性能和响应能力。

关键概念:
  1. 事件循环

    • 管理和分发事件和消息,允许非阻塞执行。
  2. 回调

    • 异步操作完成时调用的函数。
  3. Promise/Future

    • 表示未来完成的操作。
  4. Async/Await

    • 简化异步编程的关键字,避免回调地狱。
示例:
async def async_task():
    print('异步任务开始')
    await asyncio.sleep(1)
    print('异步任务结束')

asyncio.run(async_task())

Python 的迭代器(Iterators)和生成器(Generators)

迭代器和生成器是 Python 中处理数据序列的强大工具,它们提供了一种高效的方法来处理数据流,特别是在数据集较大或无限时。

迭代器(Iterators)

迭代器是访问集合元素的一种方式,一次访问一个元素。任何实现了迭代器协议的 Python 对象都可以作为迭代器使用。迭代器协议包括 __iter__()__next__() 两个方法。

创建和使用迭代器
  • 任何 Python 序列(如列表、元组)都可以通过内置函数 iter() 转换成迭代器。
  • 使用 next() 函数访问迭代器中的下一个元素。
  • 当迭代器中无更多元素时,next() 抛出 StopIteration 异常。
示例:
my_list = [1, 2, 3]
my_iter = iter(my_list)

print(next(my_iter))  # 输出 1
print(next(my_iter))  # 输出 2
# 当迭代器中无更多元素时,将抛出 StopIteration 异常

生成器(Generators)

生成器是一种特殊类型的迭代器,可以用函数的形式来定义。使用 yield 语句,生成器在每次生成一个值后会暂停其执行,直到下一次调用。

创建和使用生成器
  • 生成器函数使用 def 关键字定义,但与普通函数不同,它包含一个或多个 yield 语句。
  • 当调用生成器函数时,它不会立即执行,而是返回一个生成器对象。
  • 通过 next() 函数或在 for 循环中使用生成器对象,可以逐个获取生成的值。
示例:
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()

print(next(gen))  # 输出 1
print(next(gen))  # 输出 2
# 和迭代器一样,当没有更多元素时,next() 会抛出 StopIteration 异常

区别和应用场景

  • 迭代器:通常用于访问集合中的元素,例如列表或文件等。它们提供了一种遍历集合的方法,而不需要了解集合的底层实现。
  • 生成器:用于按需生成和处理数据,特别适合处理大数据集或无限序列,因为它们不需要在内存中存储整个数据集,从而节省资源。

迭代器和生成器是 Python 编程中处理数据序列的强大工具。理解它们的工作原理和应用场景对于编写高效和优雅的 Python 代码至关重要。通过使用迭代器和生成器,开发者可以有效管理大型数据集,实现复杂的数据处理任务,并保持代码的可读性和性能。

Python 的函数式编程

函数式编程(Functional Programming)

Python 支持函数式编程元素,允许代码以声明性和不可变的方式编写。

函数式编程特性:
  1. 不可变性

    • 鼓励使用不可变数据,以避免副作用。
  2. 纯函数

    • 给定相同输入总是产生相同输出,无副作用。
  3. 高阶函数

    • 接受函数作为参数或返回函数的函数。
  4. Lambda 函数

    • 简洁的匿名函数,常用于小型、一次性操作。
  5. 列表推导式

    • 用于创建列表的简洁语法,可以代替某些 map()filter() 操作。
  6. 闭包

    • 函数内定义的函数,可以捕获外部函数的局部变量。
示例:
numbers = [1, 2, 3, 4, 5]
squared = [x ** 2 for x in numbers]  # 列表推导式

def outer_function(msg):
    def inner_function():
        print(msg)
    return inner_function

my_function = outer_function("Hello!")
my_function()  # 输出 "Hello!"

Python 的事件循环(Event Loop)

事件循环是 Python 异步编程的核心组件,允许执行异步任务,同时保持单线程的简单性。这一机制特别适用于 I/O 密集型和高延迟的操作,使程序在等待时能够继续执行其他任务。

事件循环的工作原理

  1. 循环机制

    • 事件循环持续运行,等待和分发事件或消息。它处理如 I/O 请求完成、定时器事件等异步操作的通知。
    • 当异步操作完成时,相关的回调函数或协程将被调度并执行。
  2. 协程和任务

    • 使用 async def 定义的协程可以暂停并在等待异步操作完成时释放事件循环。
    • 事件循环负责管理这些协程,它们在 await 关键字处暂停并在异步操作完成时恢复。
  3. 调度和执行

    • 事件循环维护一个待执行任务队列。当事件发生(如 I/O 完成)时,相应的任务被取出队列并执行。

示例

以下示例展示了如何使用 Python 的 asyncio 库创建和运行一个简单的异步任务:

import asyncio

async def async_task():
    print('任务开始')
    await asyncio.sleep(1)  # 模拟异步操作
    print('任务结束')

# 获取事件循环
loop = asyncio.get_event_loop()
try:
    # 运行事件循环,直到指定任务完成
    loop.run_until_complete(async_task())
finally:
    # 关闭事件循环
    loop.close()

在这个示例中,async_task 函数定义了一个异步任务,它在 await asyncio.sleep(1) 处暂停,模拟了一个耗时的异步操作。

事件循环的重要性

  • 性能提升:事件循环使得单线程 Python 程序能够同时处理多个异步任务,提高性能,特别是在涉及到 I/O 等待的场景。
  • 简化异步编程:相比传统的多线程或多进程模型,事件循环提供了一种更简单和安全的方式来处理并发。

事件循环是 Python 中实现高效异步编程的关键。正确理解和使用事件循环,可以显著提高程序在处理异步操作时的性能和响应速度,同时保持代码的可读性和易于维护性。虽然它增加了一定的复杂性,但对于现代网络应用和服务而言,这是一个非常有价值的工具。

Python 的观察者模式(Observer Pattern)

观察者模式在 Python 中用于实现对象间的发布-订阅机制。

实现步骤:
  1. 定义观察者

    • 观察者拥有 update 方法,用于接收通知。
  2. 定义主题

    • 维护观察者列表,提供注册和移除观察者的方法。
  3. 通知机制

    • 主题状态变化时,通知所有观察者。
示例代码:
class Observer:
    def update(self, message):
        raise NotImplementedError

class Subject:
    def __init__(self):
        self._observers = []

    def register_observer(self, observer):
        self._observers.append(observer)

    def notify_observers(self, message):
        for observer in self._observers:
            observer.update(message)

class ConcreteObserver(Observer):
    def update(self, message):
        print(f"Received message: {message}")

subject = Subject()
observer_a = ConcreteObserver()
observer_b = ConcreteObserver()

subject.register_observer(observer_a)
subject.register_observer(observer_b)
subject.notify_observers("Hello!")  # 通知所有观察者

结语

以上内容为您提供了 Python 编程的全面介绍,从基础知识到高级特性、面向对象编程和响应式编程。这些指南旨在帮助初学者快速掌握 Python 的核心概念,并为进一步的学习和应用打下坚实基础。随着实践的增加,您将更加深入地理解这些概念,并能灵活运用它们解决实际问题。祝您在 Python 编程之旅中取得成功!