首页 > 编程语言 >Python速成指南:进阶篇

Python速成指南:进阶篇

时间:2024-06-30 19:57:55浏览次数:3  
标签:__ return Python self 速成 进阶篇 print import def

前言

欢迎来到Python速成指南的进阶篇。如果你已经完成了基础篇的学习(Python速成指南:从零开始的编程之旅-CSDN博客),并且对Python的基本概念有了扎实的理解,那么你已经为进入更深层次的Python世界做好了准备。在这个进阶篇中,我们将深入探讨Python的高级特性,并着重于如何在实际工作中应用这些知识。

本指南的目标是帮助你:

  1. 深入理解Python的高级特性
  2. 掌握在实际项目中常用的技巧和最佳实践
  3. 提高代码质量和性能
  4. 了解Python在各个领域的专业应用

让我们开始这段激动人心的Python进阶之旅吧!

1. 高级数据结构和算法

1.1 Collections模块

Python的Collections模块提供了额外的数据结构,这些结构在某些特定场景下比Python的内建类型更加高效和适用。

1.1.1 defaultdict

defaultdict 是一个字典的子类,它重写了一个方法并添加了一个可写的实例变量。其他功能与字典相同,但 defaultdict 会为不存在的键提供一个默认值,而不是引发 KeyError

from collections import defaultdict

# 创建一个defaultdict,默认值为list
word_count = defaultdict(list)

# 使用defaultdict统计单词出现的位置
text = "the quick brown fox jumps over the lazy dog"
for i, word in enumerate(text.split()):
    word_count[word].append(i)

print(word_count)
# 输出:defaultdict(<class 'list'>, {'the': [0, 6], 'quick': [1], 'brown': [2], 'fox': [3], 'jumps': [4], 'over': [5], 'lazy': [7], 'dog': [8]})

# 尝试访问不存在的键
print(word_count['cat'])  # 输出:[]

工作中的应用:

  1. 在处理日志文件时,可以用 defaultdict 来统计不同类型的错误出现的次数。
  2. 在自然语言处理中,可以用来构建单词的倒排索引。
1.1.2 Counter

Counter 是一个字典的子类,用于计数可哈希对象。它是一个集合,其中元素存储为字典键,它们的计数存储为字典值。

from collections import Counter

# 创建Counter对象
c = Counter('gallahad')
print(c)  # 输出:Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})

# 更新计数
c.update('ad')
print(c)  # 输出:Counter({'a': 4, 'l': 2, 'd': 2, 'g': 1, 'h': 1})

# 获取最常见的元素
print(c.most_common(2))  # 输出:[('a', 4), ('l', 2)]

工作中的应用:

  1. 在数据分析中,可以用来快速统计数据集中各项的频率。
  2. 在文本处理中,可以用来统计词频。
1.1.3 deque

deque(double-ended queue)是一种双端队列,它可以从两端快速添加和删除元素。

from collections import deque

# 创建deque对象
d = deque(['a', 'b', 'c'])
d.append('d')          # 在右端添加元素
d.appendleft('e')      # 在左端添加元素
print(d)  # 输出:deque(['e', 'a', 'b', 'c', 'd'])

d.pop()                # 从右端删除元素
d.popleft()            # 从左端删除元素
print(d)  # 输出:deque(['a', 'b', 'c'])

d.rotate(1)            # 将元素向右旋转1位
print(d)  # 输出:deque(['c', 'a', 'b'])

工作中的应用:

  1. 实现一个固定大小的缓存,当达到最大大小时,最老的项目被自动删除。
  2. 在需要频繁在两端添加或删除元素的场景中,deque 比 list 更高效。

1.2 高级排序技巧

Python的排序功能非常强大,但有时我们需要更复杂的排序逻辑。

1.2.1 使用key函数进行复杂排序

# 按字符串长度排序
words = ['python', 'java', 'c++', 'javascript', 'go']
sorted_words = sorted(words, key=len)
print(sorted_words)  # 输出:['go', 'c++', 'java', 'python', 'javascript']

# 按多个条件排序
students = [
    ('Alice', 'A', 15),
    ('Bob', 'B', 12),
    ('Charlie', 'A', 13),
    ('David', 'B', 15)
]

# 先按成绩排序,成绩相同则按年龄排序
sorted_students = sorted(students, key=lambda x: (x[1], -x[2]))
print(sorted_students)
# 输出:[('Alice', 'A', 15), ('Charlie', 'A', 13), ('David', 'B', 15), ('Bob', 'B', 12)]

工作中的应用:

  1. 在处理复杂数据结构时,可以根据多个属性进行排序。
  2. 在数据分析中,可以根据特定的业务逻辑对数据进行排序。
1.2.2 使用operator模块优化排序

对于复杂对象的排序,使用 operator 模块可以提高代码的可读性和性能。

from operator import itemgetter, attrgetter

# 使用itemgetter排序列表的字典
people = [
    {'name': 'Alice', 'age': 25, 'score': 95},
    {'name': 'Bob', 'age': 30, 'score': 85},
    {'name': 'Charlie', 'age': 22, 'score': 90}
]

# 按年龄排序
sorted_people = sorted(people, key=itemgetter('age'))
print(sorted_people)

# 按多个键排序
sorted_people = sorted(people, key=itemgetter('score', 'age'), reverse=True)
print(sorted_people)

# 使用attrgetter排序对象
class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age

students = [
    Student('Alice', 'A', 15),
    Student('Bob', 'B', 12),
    Student('Charlie', 'A', 13)
]

sorted_students = sorted(students, key=attrgetter('grade', 'age'))
for student in sorted_students:
    print(f"{student.name}: {student.grade}, {student.age}")

工作中的应用:

  1. 在处理大量数据时,使用 itemgetter 和 attrgetter 可以提高排序的性能。
  2. 在处理复杂的对象列表时,可以更清晰地指定排序条件。

1.3 高效的数据结构算法

1.3.1 使用集合进行高效的成员检查

当需要频繁检查元素是否存在于一个集合中时,使用 set 比 list 更高效。

import time

# 创建一个大列表和对应的集合
big_list = list(range(1000000))
big_set = set(big_list)

# 检查元素是否存在
start = time.time()
500000 in big_list
end = time.time()
print(f"List查找时间: {end - start}")

start = time.time()
500000 in big_set
end = time.time()
print(f"Set查找时间: {end - start}")

工作中的应用:

  1. 在处理大量数据时,使用集合可以显著提高查找性能。
  2. 在需要去除重复元素时,使用集合可以高效完成任务。
1.3.2 使用字典实现简单的缓存

字典可以用来实现一个简单的缓存机制,避免重复计算。

import time

# 一个耗时的函数
def expensive_function(n):
    time.sleep(1)  # 模拟耗时操作
    return n * n

# 使用字典作为缓存
cache = {}

def cached_function(n):
    if n in cache:
        return cache[n]
    else:
        result = expensive_function(n)
        cache[n] = result
        return result

# 测试缓存效果
start = time.time()
print(cached_function(5))
end = time.time()
print(f"第一次调用时间: {end - start}")

start = time.time()
print(cached_function(5))
end = time.time()
print(f"第二次调用时间: {end - start}")

工作中的应用:

  1. 在Web应用中,可以用来缓存数据库查询结果。
  2. 在需要频繁计算但结果变化不大的场景中,可以大幅提高程序性能。

2. 函数式编程

Python支持函数式编程范式,这为我们提供了一种强大的编程方式。

2.1 lambda函数

lambda函数是一种小型匿名函数,可以有任意数量的参数,但只能有一个表达式。

# 基本lambda函数
square = lambda x: x**2
print(square(5))  # 输出:25

# 在排序中使用lambda
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs)  # 输出:[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

# 在函数式编程中使用lambda
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出:[1, 4, 9, 16, 25]

工作中的应用:

  1. 在需要传递简单函数作为参数时,lambda可以让代码更简洁。
  2. 在数据处理中,lambda常用于map、filter等高阶函数。

2.2 高阶函数

高阶函数是那些接受函数作为参数或返回函数的函数。Python的内建函数map、filter和reduce都是高阶函数。

2.2.1 map函数

map 函数将给定函数应用到可迭代对象的每个元素上,并返回一个迭代器。

# 使用map将列表中的每个元素平方
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出:[1, 4, 9, 16, 25]

# 使用map处理多个列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]
sums = list(map(lambda x, y: x + y, list1, list2))
print(sums)  # 输出:[5, 7, 9]
2.2.2 filter函数

filter 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器。

# 使用filter获取偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # 输出:[2, 4, 6, 8, 10]

# 使用filter删除列表中的None值
mixed = [1, None, 2, None, 3, None]
cleaned = list(filter(None, mixed))
print(cleaned)  # 输出:[1, 2, 3]
2.2.3 reduce函数

reduce 函数将一个函数作用在一个序列上,这个函数必须接受两个参数,reduce把结果继续和序列的下一个元素做累积计算。

from functools import reduce

# 使用reduce计算阶乘
def multiply(x, y):
    return x * y

factorial = reduce(multiply, range(1, 6))
print(factorial)  # 输出:120 (5的阶乘)

# 使用reduce实现sum函数
numbers = [1, 2, 3, 4, 5]
sum_result = reduce(lambda x, y: x + y, numbers)
print(sum_result)  # 输出:15

工作中的应用:

  1. 在数据处理中,这些高阶函数可以大大简化代码,提高可读性。
  2. 在函数式编程风格的项目中,这些函数是核心工具。

2.3 装饰器

装饰器是可调用的对象,它用于修改函数或类。装饰器可以让我们在不修改原函数的情况下,增加额外的功能。

2.3.1 简单装饰器

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 执行时间: {end - start:.5f} 秒")
        return result
    return wrapper

@timing_decorator
def slow_function():
    time.sleep(1)
    print("Function executed")

slow_function()


#### 2.3.2 带参数的装饰器

```python
def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")  # 将打印三次 "Hello, Alice!"
2.3.3 类装饰器

class CountCalls:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0
    
    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print(f"Call {self.num_calls} of {self.func.__name__}")
        return self.func(*args, **kwargs)

@CountCalls
def say_hello():
    print("Hello!")

say_hello()
say_hello()

工作中的应用:

  1. 性能监控:使用装饰器来记录函数的执行时间,有助于识别性能瓶颈。
  2. 访问控制:可以使用装饰器来检查用户权限,控制对特定功能的访问。
  3. 缓存:实现简单的缓存机制,避免重复计算。
  4. 日志记录:自动记录函数的调用信息,便于调试和监控。

2.4 闭包

闭包是一个函数,它记住了它的外部变量,并且可以访问这些外部变量。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(10)
print(closure(5))  # 输出: 15
print(closure(10))  # 输出: 20

工作中的应用:

  1. 实现简单的状态管理,无需使用类。
  2. 创建工厂函数,根据参数生成特定的函数。

3. 并发编程

并发编程允许程序同时执行多个任务,这在处理I/O密集型任务或需要充分利用多核处理器时非常有用。

3.1 多线程

Python的 threading 模块允许创建和管理线程。

import threading
import time

def worker(name):
    print(f"Worker {name} starting")
    time.sleep(2)
    print(f"Worker {name} finished")

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print("All workers finished")

注意: 由于Python的全局解释器锁(GIL),多线程在CPU密集型任务中可能无法提供真正的并行性。

3.2 多进程

对于CPU密集型任务,可以使用 multiprocessing 模块来实现真正的并行计算。

from multiprocessing import Process
import os

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(name):
    info('function f')
    print('hello', name)

if __name__ == '__main__':
    info('main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

3.3 异步编程

Python 3.5+ 引入了 async 和 await 关键字,使得编写异步代码变得更加简单。

import asyncio

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print("started at", time.strftime('%X'))
    
    await say_after(1, 'hello')
    await say_after(2, 'world')
    
    print("finished at", time.strftime('%X'))

asyncio.run(main())

工作中的应用:

  1. Web服务器:使用异步编程处理大量并发连接。
  2. 数据处理:使用多进程加速大规模数据处理任务。
  3. GUI应用:使用多线程保持界面响应性while执行后台任务。

4. 高级文件和数据处理

4.1 使用context managers进行文件操作

class File:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

# 使用自定义的context manager
with File('test.txt', 'w') as f:
    f.write('Hello, World!')

4.2 处理大文件

当处理大文件时,一次性读取整个文件可能会导致内存问题。我们可以使用生成器来逐行读取文件。

def read_large_file(file_path):
    with open(file_path, 'r') as file:
        while True:
            line = file.readline()
            if not line:
                break
            yield line

for line in read_large_file('large_file.txt'):
    print(line, end='')

4.3 CSV文件处理

Python的 csv 模块提供了读写CSV文件的功能。

import csv

# 写入CSV文件
with open('data.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["Name", "Age", "City"])
    writer.writerow(["Alice", "30", "New York"])
    writer.writerow(["Bob", "25", "Los Angeles"])

# 读取CSV文件
with open('data.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

4.4 JSON数据处理

json 模块提供了编码和解码JSON数据的功能。

import json

# 编码JSON
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}
json_string = json.dumps(data, indent=4)
print(json_string)

# 解码JSON
decoded_data = json.loads(json_string)
print(decoded_data['name'])

工作中的应用:

  1. 数据导入导出:处理各种格式的数据文件。
  2. 配置文件:使用JSON或YAML格式存储配置信息。
  3. API开发:处理JSON格式的请求和响应数据。

5. 数据库操作

5.1 SQLite

SQLite是一个轻量级的磁盘数据库,不需要单独的服务器进程。Python标准库包含SQLite模块。

import sqlite3

# 连接到数据库(如果不存在则创建)
conn = sqlite3.connect('example.db')
c = conn.cursor()

# 创建表
c.execute('''CREATE TABLE IF NOT EXISTS stocks
             (date text, trans text, symbol text, qty real, price real)''')

# 插入数据
c.execute("INSERT INTO stocks VALUES ('2020-01-05','BUY','RHAT',100,35.14)")

# 保存(提交)更改
conn.commit()

# 查询数据
c.execute("SELECT * FROM stocks WHERE symbol = 'RHAT'")
print(c.fetchall())

# 关闭连接
conn.close()

5.2 MySQL

对于更大规模的应用,可能需要使用如MySQL这样的数据库系统。Python可以使用 mysql-connector 库来连接MySQL数据库。

import mysql.connector

# 连接到MySQL数据库
cnx = mysql.connector.connect(user='your_username', password='your_password',
                              host='127.0.0.1',
                              database='your_database')
cursor = cnx.cursor()

# 执行查询
query = ("SELECT * FROM employees WHERE hire_date BETWEEN %s AND %s")
hire_start = '1990-01-01'
hire_end = '2000-12-31'
cursor.execute(query, (hire_start, hire_end))

for (first_name, last_name, hire_date) in cursor:
    print(f"{last_name}, {first_name} was hired on {hire_date}")

# 关闭游标和连接
cursor.close()
cnx.close()

5.3 ORM (Object-Relational Mapping)

ORM允许你使用面向对象的方式来操作数据库。SQLAlchemy是Python中最流行的ORM库之一。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

engine = create_engine('sqlite:///example.db', echo=True)
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

# 创建新用户
new_user = User(name='Alice', age=30)
session.add(new_user)
session.commit()

# 查询用户
users = session.query(User).filter_by(name='Alice').all()
for user in users:
    print(f"User: {user.name}, Age: {user.age}")

session.close()

工作中的应用:

  1. Web应用后端:存储和检索用户数据、内容等。
  2. 数据分析:从数据库中提取数据进行分析。
  3. 日志系统:将系统日志存储在数据库中for易于查询和分析。

6. Web开发进阶

6.1 RESTful API设计

使用Flask创建RESTful API:

from flask import Flask, jsonify, request

app = Flask(__name__)

# 模拟数据库
users = [
    {"id": 1, "name": "Alice", "email": "[email protected]"},
    {"id": 2, "name": "Bob", "email": "[email protected]"}
]

@app.route('/users', methods=['GET'])
def get_users():
    return jsonify(users)

@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = next((user for user in users if user["id"] == user_id), None)
    if user:
        return jsonify(user)
    return jsonify({"error": "User not found"}), 404

@app.route('/users', methods=['POST'])
def create_user():
    if not request.json or 'name' not in request.json or 'email' not in request.json:
        return jsonify({"error": "Invalid data"}), 400
    new_user = {
        "id": len(users) + 1,
        "name": request.json['name'],
        "email": request.json['email']
    }
    users.append(new_user)
    return jsonify(new_user), 201

if __name__ == '__main__':
    app.run(debug=True)

6.2 Web安全

在Web开发中,安全性至关重要。以下是一些基本的安全实践:

  1. 输入验证:

from flask import request
import re

@app.route('/register', methods=['POST'])
def register():
    username = request.form.get('username')
    if not re.match(r'^[a-zA-Z0-9_]{3,20}$', username):
        return "Invalid username", 400
    # 继续处理注册逻辑
  1. 密码哈希:

from werkzeug.security import generate_password_hash, check_password_hash

def set_password(password):
    return generate_password_hash(password)

def check_password(hashed_password, password):
    return check_password_hash(hashed_password, password)
  1. CSRF保护:

使用Flask-WTF扩展来提供CSRF保护:

from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect(app)

@app.route('/protected', methods=['POST'])
@csrf.exempt
def unprotected_route():
    # 这个路由不会被CSRF保护
    pass

6.3 异步Web框架

对于需要处理大量并发连接的应用,可以考虑使用异步Web框架,如FastAPI:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items")
async def create_item(item: Item):
    return {"item_name": item.name, "item_price": item.price}

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

工作中的应用:

  1. 微服务架构:使用RESTful API设计原则构建可扩展的微服务。
  2. 前后端分离:为前端应用提供API接口。
  3. 性能优化:使用异步框架处理高并发场景。

7. 测试和调试

7.1 单元测试

Python的 unittest 模块提供了一个丰富的测试框架。

import unittest

def add(a, b):
    return a + b

class TestAddFunction(unittest.TestCase):
    def test_add_positive_numbers(self):
        self.assertEqual(add(2, 3), 5)
    
    def test_add_negative_numbers(self):
        self.assertEqual(add(-1, -1), -2)
    
    def test_add_zero(self):
        self.assertEqual(add(5, 0), 5)

if __name__ == '__main__':
    unittest.main()

7.2 Mock对象

使用 unittest.mock 模块创建mock对象,用于模拟复杂的对象行为。

from unittest.mock import Mock

# 创建一个mock对象
mock = Mock()

# 设置mock对象的属性和方法

mock.some_attribute = 'value'
mock.some_method.return_value = 42

# 使用mock对象
print(mock.some_attribute)  # 输出: value
print(mock.some_method())   # 输出: 42

# 断言mock对象的使用情况
mock.some_method.assert_called_once()

7.3 代码覆盖率

使用 coverage 库来测量代码覆盖率:

pip install coverage
coverage run -m unittest discover
coverage report -m

这将运行所有测试并生成一个覆盖率报告。

7.4 调试技巧

  1. 使用 pdb 模块进行交互式调试:

import pdb

def complex_function(x, y):
    result = x * y
    pdb.set_trace()  # 程序会在这里暂停,进入交互式调试模式
    return result * 2

complex_function(3, 4)
  1. 使用日志进行调试:

import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

def divide(x, y):
    logger.debug(f"Dividing {x} by {y}")
    try:
        result = x / y
    except ZeroDivisionError:
        logger.error("Division by zero!")
        raise
    logger.info(f"Result: {result}")
    return result

divide(10, 2)
divide(10, 0)

工作中的应用:

  1. 持续集成/持续部署(CI/CD):将单元测试集成到自动化构建和部署流程中。
  2. 代码质量控制:使用代码覆盖率工具确保测试覆盖了关键代码路径。
  3. 生产环境问题诊断:使用日志和调试技术快速定位和解决生产环境中的问题。

8. 性能优化

8.1 性能分析

使用 cProfile 模块来分析代码性能:

import cProfile

def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

cProfile.run('fibonacci(30)')

8.2 使用生成器优化内存使用

生成器可以帮助处理大量数据时节省内存:

def fibonacci_generator(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

# 使用生成器
for num in fibonacci_generator(1000000):
    # 处理每个斐波那契数
    pass

8.3 使用 collections 模块优化数据结构

from collections import defaultdict, Counter

# 使用defaultdict避免键错误
word_count = defaultdict(int)
for word in ['apple', 'banana', 'apple', 'cherry']:
    word_count[word] += 1

print(dict(word_count))

# 使用Counter快速计数
fruits = ['apple', 'banana', 'apple', 'cherry']
fruit_counter = Counter(fruits)
print(fruit_counter)

8.4 并行计算

使用 multiprocessing 模块进行并行计算:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3, 4, 5]))

工作中的应用:

  1. 大数据处理:使用生成器和并行计算处理大规模数据集。
  2. 实时系统:优化关键路径代码以降低延迟。
  3. 资源受限环境:使用内存优化技术在资源有限的系统(如嵌入式设备)上运行Python程序。

9. 设计模式

设计模式是软件开发中常见问题的典型解决方案。以下是几个常用的设计模式示例:

9.1 单例模式

确保一个类只有一个实例,并提供一个全局访问点。

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

# 使用
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出: True

9.2 工厂模式

定义一个创建对象的接口,让子类决定实例化哪一个类。

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

class AnimalFactory:
    def create_animal(self, animal_type):
        if animal_type == "dog":
            return Dog()
        elif animal_type == "cat":
            return Cat()
        else:
            raise ValueError("Unknown animal type")

# 使用
factory = AnimalFactory()
dog = factory.create_animal("dog")
print(dog.speak())  # 输出: Woof!

9.3 观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

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

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

    def detach(self, observer):
        self._observers.remove(observer)

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

class Observer:
    def update(self, message):
        pass

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

# 使用
subject = Subject()
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()

subject.attach(observer1)
subject.attach(observer2)

subject.notify("Hello, observers!")

工作中的应用:

  1. 配置管理:使用单例模式管理全局配置。
  2. 插件系统:使用工厂模式创建不同类型的插件。
  3. 事件处理:使用观察者模式实现事件驱动的程序。

10. 网络编程

10.1 Socket编程

使用 socket 模块进行低级网络编程:

import socket

# 服务器
def server():
    host = 'localhost'
    port = 12345

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))
    s.listen(1)

    conn, addr = s.accept()
    print(f"Connected by {addr}")

    while True:
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)

    conn.close()

# 客户端
def client():
    host = 'localhost'
    port = 12345

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
    print(f"Received: {data}")
    s.close()

# 运行服务器和客户端
import threading
threading.Thread(target=server).start()
client()

10.2 使用 requests 库进行HTTP请求

import requests

# GET请求
response = requests.get('https://api.github.com/users/github')
print(response.json())

# POST请求
data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())

10.3 异步网络编程

使用 aiohttp 库进行异步HTTP请求:

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html[:100])

asyncio.run(main())

工作中的应用:

  1. 微服务通信:使用Socket或HTTP请求实现服务间通信。
  2. Web爬虫:使用 requests 或 aiohttp 爬取网页数据。
  3. 高并发服务器:使用异步编程处理大量并发连接。

11. 数据科学和机器学习

11.1 NumPy基础

NumPy是Python中用于科学计算的基础库。

import numpy as np

# 创建数组
arr = np.array([1, 2, 3, 4, 5])
print(arr)

# 数组操作
print(arr * 2)
print(np.sqrt(arr))

# 矩阵操作
matrix = np.array([[1, 2], [3, 4]])
print(np.dot(matrix, matrix))

11.2 Pandas数据分析

Pandas提供了强大的数据结构和数据分析工具。

import pandas as pd

# 创建DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['a', 'b', 'c'],
    'C': [4.0, 5.0, 6.0]
})

print(df)

# 数据过滤
print(df[df['A'] > 1])

# 数据分组和聚合
print(df.groupby('B').mean())

11.3 Matplotlib数据可视化

Matplotlib是一个绘图库,用于创建静态、动画和交互式可视化。

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Simple Line Graph')
plt.show()

11.4 Scikit-learn机器学习

Scikit-learn提供了一系列机器学习算法。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 训练模型
model = SVC()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

工作中的应用:

  1. 数据清洗和预处理:使用Pandas处理和清洗原始数据。
  2. 特征工程:使用NumPy和Pandas创建新特征。
  3. 模型训练和评估:使用Scikit-learn构建和评估机器学习模型。
  4. 结果可视化:使用Matplotlib创建数据可视化报告。

12. Python与大数据

12.1 PySpark基础

PySpark是Apache Spark的Python API,用于大规模数据处理。

from pyspark.sql import SparkSession

# 创建SparkSession
spark = SparkSession.builder.appName("PythonWordCount").getOrCreate()

# 读取文本文件
lines = spark.read.text("path/to/file.txt").rdd.map(lambda r: r[0])

# 单词计数
counts = lines.flatMap(lambda x: x.split(' ')) \
              .map(lambda x: (x, 1)) \
              .reduceByKey(lambda a, b: a + b)

# 输出结果
output = counts.collect()
for (word, count) in output:
    print(f"{word}: {count}")

spark.stop()

12.2 Dask并行计算

Dask提供了大规模并行计算的能力。

import dask.dataframe as dd

# 读取大型CSV文件
df = dd.read_csv('large_file.csv')

# 进行计算
result = df.groupby('column').mean().compute()

print(result)

工作中的应用:

  1. 日志分析:使用PySpark处理和分析大规模日志数据。
  2. 推荐系统:使用Dask进行大规模并行计算,构建推荐模型。
  3. 实时数据处理:结合Spark Streaming进行实时数据处理和分析。

13. Python安全编程

13.1 输入验证

防止SQL注入:

import re

def is_valid_input(input_string):
    return re.match(r'^[a-zA-Z0-9_]+$', input_string) is not None

user_input = input("Enter username: ")
if is_valid_input(user_input):
    # 进行数据库操作
    pass
else:
    print("Invalid input")

13.2 安全的密码存储

使用 bcrypt 库进行密码哈希:

import bcrypt

def hash_password(password):
    salt = bcrypt.gensalt()
    return bcrypt.hashpw(password.encode('utf-8'), salt)

def check_password(hashed_password, user_password):
    return bcrypt.checkpw(user_password.encode('utf-8'), hashed_password)

# 使用
password = "mysecretpassword"
hashed = hash_password(password)
print(check_password(hashed, password))  # True
print(check_password(hashed, "wrongpassword"))  # False

13.3 HTTPS请求

使用 requests 库进行安全的HTTPS请求:

import requests

response = requests.get('https://api.github.com', verify=True)
print(response.status_code)

工作中的应用:

  1. Web应用安全:实施输入验证、安全的密码存储等措施。
  2. API安全:使用HTTPS进行安全的API通信。

3. 数据加密:在存储和传输敏感数据时使用加密技术。

14. Python与云计算

14.1 AWS SDK (Boto3)

使用 Boto3 与 Amazon Web Services (AWS) 交互:

import boto3

# 创建S3客户端
s3 = boto3.client('s3')

# 上传文件到S3
s3.upload_file('local_file.txt', 'my-bucket', 'remote_file.txt')

# 列出S3桶中的对象
response = s3.list_objects_v2(Bucket='my-bucket')
for obj in response['Contents']:
    print(obj['Key'])

14.2 Google Cloud SDK

使用 Google Cloud SDK 与 Google Cloud Platform (GCP) 交互:

from google.cloud import storage

# 创建存储客户端
storage_client = storage.Client()

# 获取bucket
bucket = storage_client.get_bucket('my-bucket')

# 上传文件
blob = bucket.blob('remote_file.txt')
blob.upload_from_filename('local_file.txt')

# 列出bucket中的对象
blobs = bucket.list_blobs()
for blob in blobs:
    print(blob.name)

14.3 Azure SDK

使用 Azure SDK for Python 与 Microsoft Azure 交互:

from azure.storage.blob import BlobServiceClient

# 创建BlobServiceClient
connection_string = "your_connection_string"
blob_service_client = BlobServiceClient.from_connection_string(connection_string)

# 获取容器客户端
container_client = blob_service_client.get_container_client("my-container")

# 上传文件
with open("local_file.txt", "rb") as data:
    container_client.upload_blob(name="remote_file.txt", data=data)

# 列出容器中的blobs
blob_list = container_client.list_blobs()
for blob in blob_list:
    print(blob.name)

工作中的应用:

  1. 云存储:使用云存储服务存储和管理大量数据。
  2. 无服务器计算:使用AWS Lambda或Google Cloud Functions部署Python函数。
  3. 云数据库:连接和管理云数据库服务。

15. Python与DevOps

15.1 自动化部署

使用 Fabric 进行远程服务器操作:

from fabric import Connection

def deploy():
    with Connection('user@host') as c:
        c.run('cd /path/to/project')
        c.run('git pull')
        c.run('pip install -r requirements.txt')
        c.run('systemctl restart myapp')

deploy()

15.2 配置管理

使用 Ansible 进行配置管理:

import ansible_runner

r = ansible_runner.run(private_data_dir='/tmp/demo', playbook='playbook.yml')
print(r.status)
print(r.stats)

15.3 容器化

使用 Docker SDK for Python 管理 Docker 容器:

import docker

client = docker.from_env()

# 拉取镜像
client.images.pull('ubuntu:latest')

# 运行容器
container = client.containers.run('ubuntu:latest', 'echo hello world', detach=True)
print(container.logs())

工作中的应用:

  1. 持续集成/持续部署(CI/CD):自动化测试、构建和部署流程。
  2. 基础设施即代码(IaC):使用Python脚本管理和配置基础设施。
  3. 容器编排:使用Python管理Docker容器和Kubernetes集群。

16. 高级Python特性

16.1 元类

元类是类的类,它定义了类的行为:

class Meta(type):
    def __new__(cls, name, bases, attrs):
        # 将所有属性名改为大写
        uppercase_attrs = {
            key.upper(): value for key, value in attrs.items()
        }
        return super().__new__(cls, name, bases, uppercase_attrs)

class MyClass(metaclass=Meta):
    x = 1
    y = 2

print(MyClass.X)  # 输出: 1
print(MyClass.Y)  # 输出: 2

16.2 描述符

描述符允许你自定义属性的访问行为:

class Positive:
    def __init__(self):
        self._value = 0

    def __get__(self, obj, type=None):
        return self._value

    def __set__(self, obj, value):
        if value < 0:
            raise ValueError("Must be positive")
        self._value = value

class MyClass:
    x = Positive()

obj = MyClass()
obj.x = 10  # 正常
try:
    obj.x = -1  # 引发ValueError
except ValueError as e:
    print(str(e))

16.3 上下文管理器

自定义上下文管理器:

class MyContextManager:
    def __enter__(self):
        print("Entering the context")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("Exiting the context")
        if exc_type is not None:
            print(f"An exception occurred: {exc_value}")
        return False  # 不抑制异常

with MyContextManager() as cm:
    print("Inside the context")
    # raise Exception("Test exception")

工作中的应用:

  1. ORM设计:使用元类实现数据库ORM。
  2. 插件系统:使用元类创建可扩展的插件架构。
  3. 资源管理:使用上下文管理器确保资源的正确获取和释放。

17. Python性能优化高级技巧

17.1 使用 Cython 加速代码

Cython 允许你将 Python 代码编译成 C 代码,显著提高性能:

# 文件名: example.pyx
def fibonacci(n):
    cdef int i
    cdef long long a = 0, b = 1
    for i in range(n):
        a, b = b, a + b
    return a

# 编译: cythonize -i example.pyx
# 使用:
# import example
# print(example.fibonacci(100))

17.2 使用 Numba 进行即时编译

Numba 使用LLVM编译器基础设施将Python函数编译成机器码:

from numba import jit
import numpy as np

@jit(nopython=True)
def monte_carlo_pi(nsamples):
    acc = 0
    for i in range(nsamples):
        x = np.random.random()
        y = np.random.random()
        if (x**2 + y**2) < 1.0:
            acc += 1
    return 4.0 * acc / nsamples

print(monte_carlo_pi(1000000))

17.3 内存优化

使用 __slots__ 减少内存使用:

class Point:
    __slots__ = ['x', 'y']
    def __init__(self, x, y):
        self.x = x
        self.y = y

# 比较内存使用
import sys
point_with_slots = Point(1, 2)
point_without_slots = type('PointWithoutSlots', (), {'x': 1, 'y': 2})()

print(sys.getsizeof(point_with_slots))
print(sys.getsizeof(point_without_slots))

工作中的应用:

  1. 数值计算:使用Cython或Numba优化计算密集型任务。
  2. 大规模对象创建:在创建大量对象时使用 __slots__ 优化内存使用。
  3. 性能关键部分:识别并优化程序的性能瓶颈。

18. Python与区块链

18.1 创建简单的区块链

import hashlib
import json
from time import time

class Blockchain:
    def __init__(self):
        self.chain = []
        self.current_transactions = []
        
        # 创建创世块
        self.new_block(previous_hash='1', proof=100)
    
    def new_block(self, proof, previous_hash=None):
        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transactions,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.chain[-1]),
        }
        
        self.current_transactions = []
        self.chain.append(block)
        return block
    
    def new_transaction(self, sender, recipient, amount):
        self.current_transactions.append({
            'sender': sender,
            'recipient': recipient,
            'amount': amount,
        })
        return self.last_block['index'] + 1
    
    @staticmethod
    def hash(block):
        block_string = json.dumps(block, sort_keys=True).encode()
        return hashlib.sha256(block_string).hexdigest()
    
    @property
    def last_block(self):
        return self.chain[-1]
    
    def proof_of_work(self, last_proof):
        proof = 0
        while self.valid_proof(last_proof, proof) is False:
            proof += 1
        return proof
    
    @staticmethod
    def valid_proof(last_proof, proof):
        guess = f'{last_proof}{proof}'.encode()
        guess_hash = hashlib.sha256(guess).hexdigest()
        return guess_hash[:4] == "0000"

# 使用示例
blockchain = Blockchain()
blockchain.new_transaction("Alice", "Bob", 50)
blockchain.new_transaction("Bob", "Charlie", 25)
blockchain.new_block(blockchain.proof_of_work(blockchain.last_block['proof']))

print(json.dumps(blockchain.chain, indent=2))

工作中的应用:

  1. 加密货币开发:创建自定义加密货币或代币。
  2. 供应链管理:使用区块链技术追踪产品流通。
  3. 智能合约:实现和部署基于区块链的智能合约。

19. Python与人工智能

19.1 自然语言处理 (NLP)

使用 NLTK 库进行文本分析:

import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer

nltk.download('punkt')
nltk.download('stopwords')

text = "Natural language processing is a subfield of linguistics, computer science, and artificial intelligence."

# 分词
tokens = word_tokenize(text)

# 去除停用词
stop_words = set(stopwords.words('english'))
filtered_tokens = [word for word in tokens if word.lower() not in stop_words]

# 词干提取
stemmer = PorterStemmer()
stemmed_tokens = [stemmer.stem(word) for word in filtered_tokens]

print(stemmed_tokens)

19.2 计算机视觉

使用 OpenCV 进行图像处理:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')

# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 边缘检测
edges = cv2.Canny(gray, 100, 200)

# 显示结果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

19.3 深度学习

使用 TensorFlow 创建简单的神经网络:

import tensorflow as tf
from tensorflow.keras import layers, models

# 创建模型
model = models.Sequential([
    layers.Dense(64, activation='relu', input_shape=(784,)),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 假设我们有训练数据 x_train 和 y_train
# model.fit(x_train, y_train, epochs=5)

工作中的应用:

  1. 情感分析:使用NLP技术分析客户反馈。
  2. 图像识别:在安全系统或质量控制中应用计算机视觉。
  3. 预测模型:使用深度学习构建各种预测模型,如销售预测、用户行为分析等。

结语

本Python速成指南的进阶篇涵盖了广泛的高级主题,从数据结构和算法优化,到Web开发、数据科学、云计算,再到最前沿的人工智能和区块链技术。这些知识和技能将帮助你在Python开发领域更上一层楼

标签:__,return,Python,self,速成,进阶篇,print,import,def
From: https://blog.csdn.net/weixin_44067082/article/details/140084617

相关文章

  • MATLAB的.m文件与Python的.py文件:比较与互参
    simulinkMATLAB的.m文件与Python的.py文件:比较与互参相似之处**1.基本结构****2.执行逻辑****3.可读性和维护性**差异性**1.语法特性****2.性能和应用****3.开发环境**互相学习的可能性结论MATLAB的.m文件与Python的.py文件:比较与互参在编程语言的选择上,MA......
  • 用Python的pynput和pyautogui实现自动化操作
    哈喽,大家好,我是木头左!一、前言在日常生活和工作中,常常需要重复执行一些机械性的操作,如复制粘贴、点击按钮等。这些操作虽然简单,但频繁执行会浪费大量时间。为了提高效率,可以使用Python编写脚本来实现这些操作的自动化。本文将介绍如何使用pynput库记录各种按键操作,并结合pyaut......
  • 揭秘Python:对象类型打印
    哈喽,大家好,我是木头左!一、Python数据类型简介在Python的世界中,了解你正在处理的数据类型是至关重要的。Python提供了多种内置数据类型,包括数字(整数和浮点数)、字符串、列表、元组、字典等。这些数据类型决定了你可以对数据执行哪些操作,以及如何高效地存储和处理数据。1.数字......
  • IPython的%macro魔法命令:自动化和重用代码的利器
    IPython是一个强大的交互式Python解释器,它提供了许多增强功能来提升开发效率,其中之一就是魔法命令(magiccommands)。魔法命令以%开头,用于执行特定的操作,如控制IPython的行为或执行特殊的代码转换。%macro是IPython中一个非常有用的魔法命令,它允许用户定义和存储一段代码,以便......
  • Python和MATLAB粘性力接触力动态模型半隐式欧拉算法
    ......
  • 【Python】 模型训练数据归一化的原理
    那年夏天我和你躲在这一大片宁静的海直到后来我们都还在对这个世界充满期待今年冬天你已经不在我的心空出了一块很高兴遇见你让我终究明白回忆比真实精彩                     ......
  • 【Python机器学习】聚类算法的对比与评估——在人脸数据集上比较算法
    数据探查:我们将k均值、DBSCAN和凝聚聚类算法应用于Wild数据集中的LabeledFaces,并查看它们是否找到了有趣的结构。我们将使用数据的特征脸表示,它由包含100个成分的PCA(whiten=True)生成:people=fetch_lfw_people(data_home="C:\\Users\\86185\\Downloads\\",min_faces_per_......
  • 【操作系统期末速成】 EP03 | 学习笔记(基于五道口一只鸭)
    文章目录一、前言......
  • Python教程--基本技能
    】@TOC5.1解析命令行参数在Python中,解析命令行参数是一项常见的任务,尤其是在开发命令行工具或脚本时。Python标准库提供了argparse模块,它可以帮助你轻松地编写用户友好的命令行接口。下面是使用argparse模块解析命令行参数的基本步骤:引入argparse模块首先,你需要引入arg......
  • Python基础之网络编程
    目录1网络编程1.1简介1.2socket()1.3TCP简单实例单向交互1.3.1服务端1.3.2客户端1.4TCP双向交互1.4.1服务端1.4.2客服端1.5UDP连接1.6PythonInternet模块1网络编程1.1简介Socket又称套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求,使主机间或者......