Python进阶

张开发
2026/5/6 8:08:04 15 分钟阅读

分享文章

Python进阶
一、进阶语法1.1 导入模块 / 包# 方式1导入整个模块 import math # 数学模块 print(math.sqrt(16)) # 计算平方根输出4.0 # 方式2导入模块中的指定函数/变量 from math import pi, pow print(pi) # 输出3.141592653589793 print(pow(2, 3)) # 2的3次方输出8.0 # 方式3导入并起别名 import numpy as np # 第三方数据分析库常用别名1.2 常用内置模块1.2.1 math常用函数math.sqrt(x)平方根math.pow(x,y)x 的 y 次方math.ceil(x)向上取整math.floor(x)向下取整1.2.2 datetimedatetime.datetime.now()当前时间datetime.date.today()当前日期datetime.timedelta()时间间隔加减datetime.strptime()字符串转日期datetime.strftime()日期转字符串1.2.3 random常用函数:random.random()0-1 随机浮点数random.randint(a,b)a-b 随机整数random.choice(iter)随机选一个元素random.shuffle(iter)打乱序列1.2.4 os常用函数os.path.exists(path)判断路径是否存在os.mkdir(path)创建文件夹os.listdir(path)列出目录文件os.remove(path)删除文件os.path.join(a, b)拼接路径跨平台os.path.abspath(path)绝对路径os.path.basename(path)获取文件名os.path.splitext(path)分割文件名和后缀1.2.5 re常用函数re.search(pattern, s)查找第一个匹配re.findall(pattern, s)查找所有匹配re.match(pattern, s)从开头匹配re.sub(pattern, repl, s)替换匹配内容1.3 异常处理# 示例处理用户输入非数字的情况 try: num int(input(请输入一个数字)) print(f你输入的数字是{num}) except ValueError: # 捕获“类型转换失败”的异常 print(错误你输入的不是数字) except Exception as e: # 捕获所有其他异常兜底 print(f发生未知错误{e}) else: # 无异常时执行 print(输入成功) finally: # 无论是否有异常都会执行比如关闭文件/连接 print(程序执行完毕)1.4 列表推导式python特有的快速创建 / 过滤列表代码更简洁效率略高于普通 for 循环底层优化# 普通循环创建列表求1-10的平方 nums1 [] for i in range(1, 11): nums1.append(i*i) # 列表推导式创建一行搞定 nums2 [i*i for i in range(1, 11)] print(nums2) # 输出[1,4,9,...,100] # 带条件的列表推导式只保留偶数的平方 nums3 [i*i for i in range(1, 11) if i % 2 0] print(nums3) # 输出[4, 16, 36, 64, 100]1.5 类和对象Python 是面向对象语言类用于定义 “事物的模板”对象是模板的实例# 定义类 class Student: # 初始化方法创建对象时自动执行 def __init__(self, name, age): self.name name # 实例属性 self.age age # 实例方法 def introduce(self): print(f我叫{self.name}今年{self.age}岁) # 创建对象实例化 stu1 Student(小明, 18) stu1.introduce() # 调用方法输出我叫小明今年18岁 # 访问/修改属性 stu1.age 19 print(stu1.age) # 输出191.6 常用内置函数1.6.1 部分常见函数# 1. len()获取长度列表、字典、字符串等 print(len([1,2,3])) # 输出3 print(len({name:小明, age:18})) # 输出2 # 2. range()生成整数序列常用在循环 for i in range(3): # 0,1,2 print(i) # 3. sorted()排序返回新列表 nums [3,1,2] print(sorted(nums)) # 输出[1,2,3] # 4. enumerate()遍历同时获取索引和值 fruits [苹果, 香蕉] for idx, fruit in enumerate(fruits): print(f索引{idx}{fruit}) # 输出索引0苹果索引1香蕉1.6.2 zip打包对应位置的元素配对打包成一个个元组# 5. zip()打包多个序列打包成元组 names [小明, 小红] ages [18, 17] for name, age in zip(names, ages): print(f{name}{age}岁) # 如果多个可迭代对象长度不一致zip() 会以最短的那个为准超出部分会被忽略 names [小明, 小红, 小刚] # 长度3 ages [18, 17] # 长度2 zipped list(zip(names, ages)) print(zipped) # 输出[(小明, 18), (小红, 17)]小刚被忽略 # zip 对象是一次性的zip 对象只能遍历一次遍历后就 “空了”如果需要多次使用要先转成列表 zipped zip(names, ages) # 第一次遍历 for item in zipped: print(item) # 输出(小明,18)、(小红,17) # 第二次遍历无输出因为zip对象已耗尽 for item in zipped: print(item) # 无输出 # 解决方法转成列表后再用 zipped_list list(zip(names, ages)) for item in zipped_list: print(item) # 正常输出 for item in zipped_list: print(item) # 再次正常输出1.6.3 类型转换# 转成字符串 str(123) → 123 # 转成整数需可转换 int(123) → 123 int(3.9) → 3 # 转成浮点数 float(3.14) → 3.14 # 转成布尔值0 / 空对象为 False其余为 True bool(0) → False bool([1]) → True # 转成列表 list((1,2)) → [1,2] list({1,2}) → [1,2] # 转成字典需是键值对格式 dict([(a,1), (b,2)]) # 输出{a:1,b:2} # 转成集合去重 set([1,1,2]) → {1,2}二、文件操作相关2.1 普通文件操作.txt、.md、.csv方式一处理文本文件、CSV 文件等是 Python 的常见场景核心用open()函数。# 1. 写入文件 with open(test.txt, w, encodingutf-8) as f: # w写入模式覆盖原有内容 f.write(Hello Python!\n) f.write(这是第二行内容) # 2. 读取文件 with open(test.txt, r, encodingutf-8) as f: # r读取模式 content f.read() # 读取全部内容 print(content) # 3. 追加内容 with open(test.txt, a, encodingutf-8) as f: # a追加模式 f.write(\n这是追加的内容)核心参数moder读、w写覆盖、a追加、r读写encodingutf-8避免中文乱码必须指定方式二用内置模块封装比如处理 CSV 文件用csv模块import csv # 读取CSV文件不用手动写open()但csv模块内部会调用 with open(data.csv, r, encodingutf-8) as f: reader csv.reader(f) for row in reader: print(row) # 更简化的第三方库如pandas完全不用写open() import pandas as pd df pd.read_csv(data.csv) # 一行读取CSV底层封装了open()2.2 二进制文件.jpg、.png、.zip、.exe 等方式一使用open要指定moderb读二进制/wb写二进制# 复制一张图片二进制读写 with open(source.jpg, rb) as f1: img_data f1.read() # 读取二进制数据 with open(copy.jpg, wb) as f2: f2.write(img_data) # 写入二进制数据方式二使用三方库from PIL import Image img Image.open(test.jpg) # PIL封装了open()不用自己写 img.save(new.jpg)2.3 特殊格式.json、.xlsx 等json:import json # 方式1手动open() json.load() with open(data.json, r, encodingutf-8) as f: data json.load(f) # 读取JSON文件 # 方式2读取字符串用json.loads()不用open() json_str {name:小明,age:18} data json.loads(json_str)# 写入 import json # 准备Python数据字典 data {name: 小明, age: 18, hobby: [打球, 看书]} # 方式1写入文件用dump with open(data.json, w, encodingutf-8) as f: # ensure_asciiFalse避免中文被转成\uXXXX编码核心 # indent4格式化输出缩进 4 个空格可读性高 json.dump(data, f, ensure_asciiFalse, indent4) # 方式2转成JSON字符串用dumps json_str json.dumps(data, ensure_asciiFalse, indent4) print(json_str) # 输出带格式的JSON字符串中文正常显示excel:import pandas as pd # 读取Excel一行搞定底层封装了open()和二进制处理 df pd.read_excel(data.xlsx) df.to_excel(new_data.xlsx, indexFalse)2.4 大文件用open分块读取# 读取大文件每次读1024字节 with open(big_file.log, r, encodingutf-8) as f: while True: chunk f.read(1024) # 分块读取 if not chunk: break print(chunk) # 处理每一块内容三、日期相关格式符含义示例%Y4 位年份2026%m2 位月份033 月%d2 位日期12%H24 小时制小时14下午 2 点%M分钟30%S秒00%y2 位年份2620263.1 字符串转日期from datetime import datetime # 示例1仅日期字符串转日期对象 date_str 2026-03-12 # 格式符要和字符串格式完全匹配%Y-%m-%d 对应 2026-03-12 date_obj datetime.strptime(date_str, %Y-%m-%d) print(date_obj) # 输出2026-03-12 00:00:00默认补0时0分0秒 # 示例2日期时间字符串转日期对象 datetime_str 2026/03/12 14:30:59 datetime_obj datetime.strptime(datetime_str, %Y/%m/%d %H:%M:%S) print(datetime_obj) # 输出2026-03-12 14:30:59 # 示例3处理中文格式比如 2026年03月12日 cn_date_str 2026年03月12日 cn_date_obj datetime.strptime(cn_date_str, %Y年%m月%d日) print(cn_date_obj) # 输出2026-03-12 00:00:003.2 日期对象转字符串from datetime import datetime # 先获取当前时间的日期对象常用 now datetime.now() # 输出2026-03-12 10:00:00当前系统时间 # 示例1转成 年-月-日 格式 date_str now.strftime(%Y-%m-%d) print(date_str) # 输出2026-03-12 # 示例2转成 年/月/日 时:分:秒 格式 datetime_str now.strftime(%Y/%m/%d %H:%M:%S) print(datetime_str) # 输出2026/03/12 10:00:00 # 示例3转成中文格式带星期 cn_datetime_str now.strftime(%Y年%m月%d日 %H时%M分%S秒 星期%w) # %w星期0周日1周一...6周六 print(cn_datetime_str) # 输出2026年03月12日 10时00分00秒 星期3只涉及日期from datetime import date, timedelta # 基础日期 today date.today() # 计算明天 tomorrow today timedelta(days1) print(明天, tomorrow) # 输出2026-03-13 # 转成 年-月-日 格式 str1 today.strftime(%Y-%m-%d) print(str1) # 输出2026-03-12 # 转成中文格式 xxxx年xx月xx日 str2 today.strftime(%Y年%m月%d日) print(str2) # 输出2026年03月12日3.3 时间戳与日期的转换3.3.1 日期对象转时间戳from datetime import datetime now datetime.now() timestamp now.timestamp() # 转成时间戳浮点数带毫秒 print(timestamp) # 输出1770789600.1234563.3.2 时间戳转日期对象from datetime import datetime timestamp 1770789600.123456 # 方式1转成本地时间 datetime_obj datetime.fromtimestamp(timestamp) print(datetime_obj) # 输出2026-03-12 10:00:00.123456本地时区3.4 日期加减满足 “操作的是 datetime.datetime 或 datetime.date 对象”不管这个对象是怎么创建的都能和 timedelta 做加减from datetime import datetime, timedelta now datetime.now() # 示例1计算1天后的日期 next_day now timedelta(days1) print(1天后, next_day.strftime(%Y-%m-%d)) # 输出2026-03-13 # 示例2计算3天前的日期 last_3_day now - timedelta(days3) print(3天前, last_3_day.strftime(%Y-%m-%d)) # 输出2026-03-09 # 示例3计算2小时30分钟后的时间 later now timedelta(hours2, minutes30) print(2小时30分后, later.strftime(%Y-%m-%d %H:%M:%S)) # 示例4计算两个日期的差值 date1 datetime(2026, 3, 12) date2 datetime(2026, 3, 15) delta date2 - date1 print(日期差, delta.days, 天) # 输出3 天 print(总秒数, delta.total_seconds()) # 输出259200.0 秒 # 示例5转换后在计算 date_str 2026-03-12 # 转成datetime对象 date_obj datetime.strptime(date_str, %Y-%m-%d) # 计算3天后 after_3d date_obj timedelta(days3) print(3天后, after_3d.strftime(%Y-%m-%d)) # 输出2026-03-153.5 日期比较from datetime import date, datetime # date对象比较仅日期 d1 date(2026, 3, 12) d2 date(2026, 3, 15) print(d1 d2) # True12日早于15日 print(d1 d2) # False # datetime对象比较日期时间 dt1 datetime(2026, 3, 12, 10, 0) dt2 datetime(2026, 3, 12, 14, 0) print(dt1 dt2) # True10点早于14点

更多文章