目录
(4)__setitem__(self, key, value):
一、os
模块:
os
模块是 Python 的标准库之一,它提供了丰富的方法来处理文件和目录,以及执行与操作系统相关的操作。
常用方法:
-
os.access(path, mode)
:检查指定路径的文件权限。 -
os.chdir(path)
:改变当前工作目录到指定路径。 -
os.chflags(path, flags)
:更改文件的标记(仅限于Unix)。 -
os.chmod(path, mode)
:更改文件的权限。 -
os.chown(path, uid, gid)
:更改文件的所有者和组。 -
os.chroot(path)
:更改当前进程的根目录(仅限于Unix)。 -
os.close(fd)
:关闭文件描述符。 -
os.closerange(fd_low, fd_high)
:关闭指定范围内的所有文件描述符。 -
os.dup(fd)
:复制文件描述符。 -
os.dup2(fd, fd2)
:将文件描述符复制到另一个。 -
os.fchdir(fd)
:通过文件描述符改变当前工作目录(仅限于Unix)。 -
os.fchmod(fd, mode)
:更改文件描述符指定的文件权限。 -
os.fchown(fd, uid, gid)
:更改文件描述符指定的文件的所有者。 -
os.fdatasync(fd)
:将文件描述符指定的文件数据同步写入磁盘。 -
os.fdopen(fd[, mode[, bufsize]])
:通过文件描述符创建文件对象。 -
os.fpathconf(fd, name)
:返回打开文件的系统配置信息。 -
os.fstat(fd)
:返回文件描述符的状态。 -
os.fstatvfs(fd)
:返回文件描述符的文件系统信息。 -
os.fsync(fd)
:将文件描述符指定的文件同步写入硬盘。 -
os.ftruncate(fd, length)
:裁剪文件描述符指定的文件。 -
os.getcwd()
:返回当前工作目录。 -
os.getcwdb()
:返回当前工作目录的字节字符串形式。 -
os.isatty(fd)
:检查文件描述符是否与tty设备相连。 -
os.lchflags(path, flags)
:类似于chflags
,但不追踪软链接。 -
os.lchmod(path, mode)
:修改链接文件的权限。 -
os.lchown(path, uid, gid)
:类似于chown
,但不追踪软链接。 -
os.link(src, dst)
:创建硬链接。 -
os.listdir(path)
:列出指定路径下的文件和目录。 -
os.lseek(fd, pos, how)
:设置文件描述符的当前位置。 -
os.lstat(path)
:类似于stat
,但解析软链接。 -
os.major(device)
:从设备号中提取主设备号。 -
os.makedev(major, minor)
:创建设备号。 -
os.makedirs(path[, mode])
:递归创建目录。 -
os.minor(device)
:从设备号中提取次设备号。 -
os.mkdir(path[, mode])
:创建目录。 -
os.mkfifo(path[, mode])
:创建命名管道。 -
os.mknod(filename[, mode=0600, device])
:创建文件系统节点。 -
os.open(file, flags[, mode])
:打开文件。 -
os.openpty()
:打开伪终端。 -
os.pathconf(path, name)
:返回文件的系统配置信息。 -
os.pipe()
:创建管道。 -
os.popen(command[, mode[, bufsize]])
:执行命令并打开管道。 -
os.read(fd, n)
:从文件描述符读取数据。 -
os.readlink(path)
:读取软链接的路径。 -
os.remove(path)
:删除文件。 -
os.removedirs(path)
:递归删除目录。 -
os.rename(src, dst)
:重命名文件或目录。 -
os.renames(old, new)
:递归重命名目录。 -
os.rmdir(path)
:删除空目录。 -
os.stat(path)
:获取文件状态。 -
os.stat_float_times([newvalue])
:控制stat_result
是否以浮点数显示时间戳。 -
os.statvfs(path)
:获取文件系统的统计信息。 -
os.symlink(src, dst)
:创建软链接。 -
os.tcgetpgrp(fd)
:获取与终端关联的进程组。 -
os.tcsetpgrp(fd, pg)
:设置与终端关联的进程组。 -
os.tempnam([dir[, prefix]])
:已在Python 3中删除,用于创建临时文件。 -
os.tmpfile()
:已在Python 3中删除,用于创建临时文件。 -
os.tmpnam()
:已在Python 3中删除,用于获取临时文件名。 -
os.ttyname(fd)
:获取与文件描述符关联的终端名。 -
os.unlink(path)
:删除文件。 -
os.utime(path, times)
:设置文件的访问和修改时间。 -
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
:遍历目录树。 -
os.write(fd, str)
:写入数据到文件描述符。 -
os.path
模块:用于处理文件路径。 -
os.pardir
:表示父目录。 -
os.replace()
:重命名文件或目录。 -
os.startfile()
:在Windows上打开文件或文件夹。
二、错误和异常:
在Python中,错误和异常是程序运行时可能出现的问题。理解它们的区别和如何处理它们是编写健壮Python程序的关键。
(1)语法错误:
语法错误(SyntaxError)是在代码编写时犯的错误,通常是由于不符合Python的语法规则造成的。例如,缺少括号、冒号、逗号或其他语法元素。
# 错误的代码示例
while True print('Hello world') # 缺少冒号
(2)异常:
异常(Exception)是程序运行时发生的错误,它们通常是由不正确的操作或外部因素引起的。Python中的异常是Exception
类或其子类的实例。
# 异常示例
try:
# 这将触发除以零的异常
result = 10 / 0
except ZeroDivisionError:
print("不能除以零")
(3)异常处理:
Python使用try
和except
关键字来处理异常。try
块中的代码是潜在会抛出异常的代码,而except
块则是用来捕获并处理特定类型的异常。
# 异常处理示例
try:
# 尝试将用户输入转换为整数
x = int(input("请输入一个数字: "))
except ValueError:
print("输入错误,请确保你输入的是一个整数!")
(4)抛出异常:
在Python中,可以使用raise
关键字主动抛出一个异常。
# 抛出异常的示例
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
(5)用户自定义异常:
用户可以创建自己的异常类型,通常是通过继承内置的Exception
类来实现。
# 用户自定义异常示例
class MyError(Exception):
def __init__(self, value):
self.value = value
try:
raise MyError(2 * 2)
except MyError as e:
print('我的异常发生了,值:', e.value)
(6)清理行为:
finally
子句是try
语句的一部分,无论是否发生异常,都会执行finally
块中的代码。这常用于执行清理操作,如关闭文件。
# 清理行为示例
try:
f = open('myfile.txt', 'r')
data = f.read()
except IOError:
print("文件读取错误")
finally:
print("执行清理操作")
f.close()
(7)with语句:
with
语句是Python中的上下文管理器,它确保代码块执行完毕后,会自动调用资源的清理代码(如文件的关闭)。
# with语句示例
with open('myfile.txt', 'r') as f:
for line in f:
print(line, end="")
# 文件会在with语句块结束时自动关闭
三、面向对象编程:
面向对象编程(OOP)是一种编程范式,它使用类和对象来设计应用程序和操作系统。在Python中,OOP的核心概念包括类、对象、继承、封装和多态。
(1)类和对象:
类是创建对象的蓝图,它定义了一组属性(变量)和方法(函数)。对象是类的实例,每个对象都可以拥有不同的属性值。
# 定义一个类
class Dog:
def __init__(self, name, age): # 构造函数
self.name = name # 实例变量
self.age = age
def bark(self): # 方法
print("Woof!")
# 创建对象
my_dog = Dog("Buddy", 3)
my_dog.bark() # 调用方法
print(f"My dog's name is {my_dog.name} and he is {my_dog.age} years old.")
(2)继承:
继承允许创建基于现有类的新的类。新的类(子类)可以继承现有类(基类)的属性和方法。
# 定义基类
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass # 基类中的占位方法
# 定义子类,继承自Animal
class Dog(Animal):
def speak(self): # 重写方法
print(f"{self.name} says Woof!")
# 创建子类的对象
my_dog = Dog("Buddy")
my_dog.speak() # 调用重写的方法
(3)封装:
封装是将数据(属性)和行为(方法)捆绑在一起,并隐藏内部实现的细节。在Python中,通过在属性名前加双下划线来实现私有属性。
class BankAccount:
def __init__(self, owner, balance=0):
self.__owner = owner # 私有属性
self.__balance = balance # 私有属性
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
return amount
else:
print("Insufficient funds")
def get_balance(self):
return self.__balance
# 创建对象
account = BankAccount("John", 1000)
account.deposit(500)
print(account.get_balance()) # 正确的方式访问私有属性
# print(account.__balance) # 错误的方式,会引发属性错误
(4)多态:
多态是指对象可以采用多种形态的能力。在Python中,多态是通过方法重写实现的。
# 定义基类
class Animal:
def speak(self):
pass
# 定义子类
class Dog(Animal):
def speak(self):
print("Woof!")
class Cat(Animal):
def speak(self):
print("Meow!")
# 创建对象
animals = [Dog(), Cat()]
# 多态的体现
for animal in animals:
animal.speak()
(5)运算符重载:
Python允许重载特殊的方法名来实现运算符的自定义行为。
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __str__(self):
return f"({self.x}, {self.y})"
v1 = Vector(2, 3)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3) # 输出: (5, 7)
四、类的专有方法:
在Python中,类的专有方法(也称为魔术方法或双下方法)是一些有特殊意义的内置方法,它们在特定的操作或内置函数被调用时自动执行。
(1)__init__(self, ...)
:
构造函数,当一个实例被创建时调用,用于初始化对象。
class MyClass:
def __init__(self, value):
self.value = value
(2)__del__(self)
:
析构函数,当一个实例被销毁时调用。
class MyClass:
def __del__(self):
print("对象已被销毁")
(3)__repr__(self)
:
返回对象的官方字符串表示,通常用于调试。
class MyClass:
def __repr__(self):
return "MyClass({})".format(self.value)
(4)__setitem__(self, key, value)
:
定义当对象使用下标赋值时的行为。
class MyClass:
def __init__(self):
self.data = {}
def __setitem__(self, key, value):
self.data[key] = value
(5)__getitem__(self, key)
:
定义当对象使用下标访问时的行为。
class MyClass:
def __init__(self):
self.data = {1: 'one', 2: 'two'}
def __getitem__(self, key):
return self.data[key]
(6)__len__(self)
:
定义当使用len()
函数时的行为。
class MyClass:
def __init__(self, contents):
self.contents = contents
def __len__(self):
return len(self.contents)
(7)__cmp__(self, other)
:
在Python 2中用于比较操作。在Python 3中已被移除,应使用__lt__
, __le__
, __eq__
, __ne__
, __gt__
, __ge__
等方法。
(8)__call__(self, ...)
:
定义当对象被调用时的行为,允许实例像函数那样被调用。
class MyClass:
def __call__(self, arg):
return "Called with: " + str(arg)
(9)__add__(self, other)
:
定义加法操作的行为。
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
(10)补充:
__sub__(self, other)
: 定义减法操作的行为。__mul__(self, other)
: 定义乘法操作的行为。__truediv__(self, other)
: 定义真除法(除以非零数)操作的行为。__mod__(self, other)
: 定义求余操作的行为。__pow__(self, other[, modulo])
: 定义幂运算的行为。
五、 命名空间和作用域:
在Python中,命名空间和作用域是两个核心概念,它们决定了如何查找和访问变量。
(1)命名空间:
命名空间是存储变量的区域,Python中的每个作用域都有自己的命名空间。命名空间可以避免命名冲突,因为不同命名空间中的同名变量不会相互影响。
(2)作用域:
作用域是指变量可见的区域。Python中有几种作用域:
- 局部作用域(Local):在函数内部定义的变量,只能在该函数内部访问。
- 嵌套作用域(Enclosing):在嵌套函数中访问外层函数的变量。
- 全局作用域(Global):在模块级别定义的变量,在整个模块中都可以访问。
- 内置作用域(Built-in):包含Python内建的变量和函数。
(3)命名空间查找顺序:
当访问一个变量时,Python会按照以下顺序查找命名空间:
- 局部命名空间
- 嵌套命名空间
- 全局命名空间
- 内置命名空间
如果变量在这些命名空间中都未找到,Python会抛出NameError
。
(4)作用域的生命周期:
作用域的生命周期通常与定义它的代码块的执行有关。例如,函数内的局部变量在函数执行完毕后就不再存在。
(5)示例代码:
命名空间和作用域的示例代码:
# 全局变量
global_var = "I am global"
def function():
# 局部变量
local_var = "I am local"
def inner_function():
# 嵌套局部变量
nested_local_var = "I am nested local"
print(nested_local_var)
print(local_var)
# print(global_var) # 这会引发错误,因为 global_var 在这个作用域不可见
inner_function()
print(local_var)
# print(nested_local_var) # 这会引发错误,因为 nested_local_var 在这个作用域不可见
function()
print(global_var)
# print(local_var) # 这会引发错误,因为 local_var 在这个作用域不可见
(6)global和nonlocal关键字:
当需要在函数内部修改全局变量或嵌套作用域中的变量时,可以使用global
和nonlocal
关键字。
# 修改全局变量
global_var = "I am global"
def function():
global global_var
global_var = "I am now global and modified"
function()
print(global_var)
# 修改嵌套作用域中的变量
def outer():
var = "I am outer"
def inner():
nonlocal var
var = "I am inner and modified"
inner()
print(var)
outer()
(7)作用域和命名空间的规则:
- 变量查找始终从最内层的作用域开始,向外层作用域进行。
global
关键字用于在函数内部声明全局变量。nonlocal
关键字用于在嵌套函数中声明非局部变量。- 在函数内部赋值给一个变量,默认情况下会创建一个局部变量,除非使用了
global
或nonlocal
关键字。 - Python中的
if
、for
、while
等语句块不会创建新的作用域。
六、Python 3的标准库:
Python 3的标准库非常庞大,提供了广泛的功能,从基本的文件操作到复杂的网络编程,几乎涵盖了所有常见的编程任务。
-
os模块:
提供了与操作系统交互的功能,如文件和目录操作、环境变量访问等。
import os
print(os.getcwd()) # 获取当前工作目录
-
sys模块:
提供了与Python解释器和系统相关的功能,如命令行参数访问、标准输入输出错误等。
import sys
print(sys.argv) # 打印命令行参数列表
-
time模块:
提供了时间相关的函数,如获取当前时间、睡眠等。
import time
print(time.time()) # 获取当前时间戳
-
datetime模块:
提供了日期和时间的类,支持时区处理、日期时间计算等。
from datetime import datetime
print(datetime.now()) # 获取当前日期和时间
-
random模块:
提供了生成随机数的功能,包括随机整数、浮点数、随机选择等。
import random
print(random.randint(1, 10)) # 生成1到10之间的随机整数
-
math模块:
提供了数学相关的函数,如三角函数、对数、指数等。
import math
print(math.sqrt(16)) # 计算16的平方根
-
re模块:
提供了正则表达式的支持,用于字符串搜索、替换等。
import re
print(re.findall(r'\d+', 'foo 123 bar 456')) # 查找所有数字
-
json模块:
提供了JSON数据的编码和解码功能。
import json
data = '{"name": "John", "age": 30}'
print(json.loads(data)) # 将JSON字符串解码为Python字典
-
urllib模块:
提供了URL处理和网页访问的功能。
from urllib.request import urlopen
response = urlopen('http://example.com')
print(response.read()) # 读取网页内容
-
shutil模块:
提供了高级文件操作,如文件复制、移动等。
import shutil
shutil.copyfile('source.txt', 'destination.txt') # 复制文件
-
glob模块:
提供了文件通配符搜索的功能。
import glob
print(glob.glob('*.py')) # 获取所有Python文件列表
-
gzip模块:
- 提供了gzip文件压缩和解压缩的功能。
import gzip
with gzip.open('file.gz', 'wb') as f:
f.write(b'Some data') # 写入压缩数据
-
collections模块:
提供了许多有用的容器类型,如deque
、Counter
、OrderedDict
、defaultdict
和namedtuple
等。
from collections import defaultdict, namedtuple
my_data = defaultdict(int)
my_tuple = namedtuple('Point', 'x y')(1, 2)
-
itertools模块:
提供了用于迭代器的函数式编程工具,如map
、filter
、reduce
、takewhile
、dropwhile
等。
from itertools import count, islice
for num in islice(count(1), 10): # 生成从1开始的10个数字
print(num)
-
heapq模块:
提供了一个基于列表的最小堆实现,允许进行堆队列操作,如heappush
、heappop
等。
import heapq
my_list = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
heapq.heapify(my_list) # 将列表转换为堆
print(heapq.heappop(my_list)) # 弹出最小元素
-
logging模块:
提供了灵活的方式来记录错误、调试信息、警告等。
import logging
logging.basicConfig(level=logging.INFO)
logging.info('This is an info message')
-
multiprocessing模块:
允许并行地执行多个操作,提供了创建进程、管理进程间通信的工具。
from multiprocessing import Process, Queue
def worker(name, queue):
print(f'Launch process with ID: {name}')
queue.put(name)
queue = Queue()
p = Process(target=worker, args=('123', queue))
p.start()
p.join()
print(queue.get())
-
threading模块:
提供了线程相关的操作,允许程序中执行多线程操作。
from threading import Thread
def print_numbers():
for i in range(5):
print(i)
thread = Thread(target=print_numbers)
thread.start()
thread.join()
-
socket模块:
提供了访问网络接口的功能,可以进行基本的网络通信。
import socket
s = socket.socket()
host = socket.gethostname()
print(f'The hostname is {host}')
-
sqlite3模块:
提供了轻量级的磁盘基数据库,使用SQLite数据库。
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT)')
-
csv模块:
提供了读写CSV文件的功能。
import csv
with open('example.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Name', 'Age'])
writer.writerow(['Alice', 24])
-
xml.etree.ElementTree模块:
提供了解析和创建XML数据的工具。
import xml.etree.ElementTree as ET
tree = ET.parse('example.xml')
root = tree.getroot()
print(root.find('tag').text)