文章目录
1 基础
1.1 基础语法
1.1.1 变量的定义与使用
name = "John"
age = 25
1.1.2 数据类型操作
num1 = 10
num2 = 5
result = num1 + num2
print(result)
1.1.3 条件语句
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
else:
print("及格")
1.1.4 循环结构
for i in range(1, 6):
print(i)
1.2 函数和模块
1.2.1 函数的定义与调用
def add(a, b):
return a + b
result = add(3, 4)
print(result)
1.2.2 参数传递
def greet(name):
print("Hello, " + name)
greet("Alice")
1.2.3 创建和使用模块
# math_utils.py
def square(num):
return num ** 2
# main.py
import math_utils
result = math_utils.square(5)
print(result)
1.3 面向对象编程
1.3.1 类的定义和使用
class Person:
def __init__(self, name):
self.name = name
def greet(self):
print("Hello, my name is " + self.name)
person = Person("John")
person.greet()
1.3.2 对象的创建和操作
class Circle:
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
circle = Circle(5)
print(circle.area())
1.3.3 继承和多态
class Animal:
def sound(self):
pass
class Dog(Animal):
def sound(self):
print("Woof!")
class Cat(Animal):
def sound(self):
print("Meow!")
dog = Dog()
cat = Cat()
dog.sound()
cat.sound()
1.4 文件操作
1.4.1 读取文件
with open("data.txt", "r") as file:
data = file.read()
print(data)
1.4.2 写入文件
with open("output.txt", "w") as file:
file.write("Hello, World!")
1.5 异常处理
1.5.1 捕获和处理异常
try:
num = 10 / 0
except ZeroDivisionError:
print("Cannot divide by zero.")
1.5.2 优雅的处理错误
def divide(a, b):
try:
result = a / b
except ZeroDivisionError:
result = None
finally:
return result
print(divide(10, 2))
print(divide(10, 0))
1.6 数据结构和算法
1.6.1 列表操作
numbers = [1, 2, 3, 4, 5]
print(len(numbers))
print(numbers[2])
1.6.2 字典操作
person = {"name": "John", "age": 25}
print(person["name"])
print(person.get("age"))
1.6.3 排序算法
numbers = [5, 2, 8, 1, 9]
numbers.sort()
print(numbers)
1.7 网络编程
1.7.1 Socket编程
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("localhost", 8080))
server_socket.listen(1)
client_socket, address = server_socket.accept()
print("Connection from: " + str(address))
client_socket.close()
server_socket.close()
1.7.2 http协议应用
import requests
response = requests.get("https://www.example.com")
print(response.text)
1.8 数据库编程
1.8.1 访问splite数据库
import sqlite3
connection = sqlite3.connect("database.db")
cursor = connection.cursor()
cursor.execute("SELECT * FROM students")
data = cursor.fetchall()
for row in data:
print(row)
connection.close()
1.9 基础练习
案例1 - 用户输入半径,计算圆的周长和面积
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :01.py
@说明 :用户输入半径,计算圆的周长和面积
@时间 :2023/10/06 21:21:24
@作者 :aliha
@版本 :1.0
'''
radius = input("请输入圆的半径:")
radius = float(radius)
perimeter = 2 * radius * 3.14
area = radius * radius * 3.14
print("周长是:%f" % perimeter)
print("面积是:%f" % area)
#> python 01.py
#> 请输入圆的半径:20.1
#> 周长是:126.228000
#> 面积是:1268.591400
知识点:输入
input()
、输出print()
函数、变量赋值
分析:首先获取用户输入的圆的半径,然后使用浮点数进行计算,最后输出圆的周长和面积。
步骤如下:
- 使用
input()
函数获取用户输入的圆的半径,并将其保存为字符串。- 使用
float()
函数将输入的字符串转换为浮点数,以便进行数学计算。- 计算圆的周长和面积,并将结果分别保存在
perimeter
和area
变量中。- 使用
print()
函数将计算得到的周长和面积输出,其中使用了字符串格式化来将浮点数格式化为字符串并输出。
案例2 - 用户输入年份,判断是否是闰年,闰年输出“是闰年”,否者输出“不是闰年
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :02.py
@说明 :用户输入年份,判断是否是闰年,闰年输出“是闰年”,否者输出“不是闰年”
@时间 :2023/10/06 21:23:06
@作者 :aliha
@版本 :1.0
'''
year = int(input("请输入年份:"))
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
print("是闰年")
else:
print("不是闰年")
#> python 02.py
#> 请输入年份:2019
#> 不是闰年
知识点:
%
运算符,逻辑运算、if
分支
分析:使用逻辑运算符来检查年份是否符合闰年的条件。
原理如下:
• 首先,用户被要求输入一个年份。
• 然后,代码使用条件表达式来检查以下情况:
____• 如果年份能被4整除但不能被100整除,或者能被400整除,那么它被认为是闰年。
____• 如果不满足上述条件,那么它被认为不是闰年。
如果年份是闰年,它会打印"是闰年",否则打印"不是闰年"。
案例3 - 根据分数,判断是“优秀”、“良好”、“一般”、“及格”
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :03.py
@说明 :根据分数,判断是“优秀”、“良好”、“一般”、“及格”
@时间 :2023/10/06 21:29:58
@作者 :aliha
@版本 :1.0
'''
score = int(input("请输入分数:"))
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 70:
print("一般")
elif score >= 60:
print("及格")
#> python 03.py
#> 请输入分数:89
#> 良好
知识点:
if
多条件分支
分析:根据输入的分数打印不同等级。使用if
和elif
语句来检查不同的分数范围,并打印相应的等级。
当用户输入一个分数后,程序会按照以下规则进行评估:
• 如果分数大于等于90,它会打印"优秀"。
• 如果分数在80到89之间,它会打印"良好"。
• 如果分数在70到79之间,它会打印"一般"。
• 如果分数在60到69之间,它会打印"及格"。
案例4 - 判断一个数值是大于5,如果大于5那么是否还大于8
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :04.py
@说明 :判断一个数值是大于5,如果大于5那么是否还大于8
@时间 :2023/10/06 21:58:04
@作者 :yun
@版本 :1.0
'''
x = 10
if x > 5:
print("x 大于 5")
if x > 8:
print("x 也大于 8")
else:
print("x 不大于 8")
else:
print("x 不大于 5")
#> python 04.py
#> x 大于 5
#> x 也大于 8
知识点:
if
嵌套
分析:我们首先定义了一个变量x
,然后使用两层嵌套的if
语句来检查两个条件。首先,我们检查x
是否大于5,如果条件为真,就会执行第一个if块中的代码,并进一步检查x
是否大于8。如果x
大于8,就会执行内部的第二个if
块中的代码,否则将执行内部的else
块。如果x
不大于5,就会执行外部的else
块中的代码。
案例5 - 使用for循环实现1~100求和
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :05.py
@说明 :使用for循环实现1~100求和
@时间 :2023/10/06 21:43:05
@作者 :aliha
@版本 :1.0
'''
sum = 0
for i in range(1, 101):
sum = sum + i
print(sum)
#> python 05.py
#> 5050
知识点:
for
循环
分析:首先初始化一个变量sum
,然后使用for
循环遍历从1到100的整数。在循环内部,每个整数都会被累加到sum
变量中。最后,通过print()
函数将最终的和打印出来。
案例6 - 打印小于等于5的所有整数
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :06.py
@说明 :打印小于等于5的所有整数
@时间 :2023/10/06 21:47:21
@作者 :aliha
@版本 :1.0
'''
counter = 1
while counter <= 5:
print(counter)
counter = counter + 1
#> python 06.py
#> 1
#> 2
#> 3
#> 4
#> 5
知识点:
while
循环
分析:首先初始化一个计数器变量counter
并赋值为1,然后使用while
循环来检查计数器是否小于等于5。只要条件为真,循环将继续执行,打印当前计数器的值,并将计数器增加1,以准备下一次迭代。最终,将1到5的整数打印出来。
案例7 - 构造一个函数,计算两个数字之和,使用该函数计算3+5
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :07.py
@说明 :构造一个函数,计算两个数字之和,使用该函数计算3+5
@时间 :2023/10/06 21:53:35
@作者 :aliha
@版本 :1.0
'''
def add(a, b):
result = a + b
return result
sum_result = add(3, 5)
print("3+5结果是:",sum_result)
#> python 07.py
#> 3+5结果是: 8
知识点:函数定义、函数调用
分析:首先定义了一个函数add(a, b)
,用于计算两个参数的和。接着,调用了这个函数,将参数 3 和 5 传递给它,并将返回的结果赋给了sum_result
变量。最后,使用print()
函数将结果打印出来。
1.10 常用语法
-
- 输入输出
page_index = int(input('请输入文件序号:'));
print(page_index)
- 输入输出
-
- 延时操作
import time
time.sleep(1)
- 延时操作
-
- 常见结构
# 判断语句 True、False、None
if 1 == None:
print(1)
elif 1 == 1:
print(2)
else:
print(3)
# 循环语句
list = [1,2,3]
for l in list:
print(l)
-
- 字符串替换
context = context.replace('old', 'new')
- 字符串替换
2 文本纠错
开源地址:https://github.com/shibing624/pycorrector
推荐直接看开源地址
2.1 安装依赖
- 安装 pycorrector
pip install -U pycorrector
安装过程中可能会出现 knelm 安装错误,出错原因是未安装 Microsoft Visual C++ 14.0,下载地址:
https://download.csdn.net/download/qq_27630263/87549448
- 安装 kenlm
pip install kenlm
2.2 使用
- 文本纠错
# example: examples/base_demo.py
import pycorrector
corrected_sent, detail = pycorrector.correct('少先队员因该为老人让坐')
print(corrected_sent, detail)
# output
# 少先队员应该为老人让座 [('因该', '应该', 4, 6), ('坐', '座', 10, 11)]
规则方法默认会从路径~/.pycorrector/datasets/zh_giga.no_cna_cmn.prune01244.klm加载kenlm语言模型文件,如果检测没有该文件, 则程序会自动联网下载。当然也可以手动下载模型文件(2.8G)并放置于该位置。
- 错误检测
# example: examples/detect_demo.py
import pycorrector
idx_errors = pycorrector.detect('少先队员因该为老人让坐')
print(idx_errors)
# output:
# [['因该', 4, 6, 'word'], ['坐', 10, 11, 'char']]
# 返回类型是list, [error_word, begin_pos, end_pos, error_type],pos索引位置以0开始。
- 成语、专名纠错
# example: examples/proper_correct_demo.py
import sys
sys.path.append("..")
from pycorrector.proper_corrector import ProperCorrector
m = ProperCorrector()
x = [
'报应接中迩来',
'今天在拼哆哆上买了点苹果',
]
for i in x:
print(i, ' -> ', m.proper_correct(i))
# output:
# 报应接中迩来 -> ('报应接踵而来', [('接中迩来', '接踵而来', 2, 6)])
# 今天在拼哆哆上买了点苹果 -> ('今天在拼多多上买了点苹果', [('拼哆哆', '拼多多', 3, 6)])
3 读写Word
3.1 读docx
Word文档和纯文本(比如txt)相比, .docx文件有很多种结构,这些结构在python-docx中用3种不同的类型来表示:最高一层是Document对象表示文档,每个Document对象包含一个Paragraph 对象也就是段落组成的列表,而每个Paragraph对象则包含一个Run对象的列表,至于Run对象大家可以通过下面的段落Paragraph来了解。
多个Run对象组成的Paragraph
我们知道Word里的文本包含有很多格式,比如字体、字号、粗体/斜体、颜色等等。一个Run对象是具有相同格式的文本,当发生变化的时候就需要一个新的Run对象,这也就是上图中1个Paragraph对象有4个Run对象的原因。
- 安装模块
pip install python-docx
- 使用方法
import docx
# 读取Word文档
doc = docx.Document(r'D:\工作\信息记录\ActiveMQ.docx')
# 查看段落数
len(doc.paragraphs)
# 查看第一段内容
doc.paragraphs[0].text
# 查看第二段内容
doc.paragraphs[1].text
# 查看第二段的Run对象数
len(doc.paragraphs[1].runs)
# 查看第二段的Run对象的文本
for i in range(len(doc.paragraphs[1].runs)):
print(f'第{i}个Run对象的文本', doc.paragraphs[1].runs[i].text)
- 读取docx文件
自定义一个函数将全部的 paragraph 段落内容存起来,每个 paragraph 段落之间用换行符 \n 隔开即可
import docx
def getText(fileName):
doc = docx.Document(fileName)
TextList = []
for paragraph in doc.paragraphs:
TextList.append(paragraph.text)
return '\n'.join(TextList)
fileName = r'D:\工作\信息记录\ActiveMQ.docx'
print(getText(fileName))
3.2 写docx
import docx
doc = docx.Document()
p1 = doc.add_paragraph('这是一个段落')
p1.add_run('加粗的一句话').bold = True
doc.add_paragraph('这是第二个段落')
doc.save('多段落.docx')
4 鼠标点击、屏幕截图保存、生产ppt
import pyautogui as pag
from PIL import ImageGrab
from pptx import Presentation
from pptx.util import Inches
#返回鼠标的在屏幕上的坐标
x,y = pag.position()
# 模拟组合热键:ctrl+c、左键单击、双击、多击
pag.hotkey('ctrl', 'c')
pag.scroll(-800, x=1421, y=466) # 移动到(100, 100)位置再向上滚动10格
pag.click(x=240, y=283, clicks=1, interval=0.0, button='left', duration=0.0, tween=pag.linear)
pag.doubleClick(x=1360, y=891, interval=0.0, button='left', duration=0.0, tween=pag.linear)
pag.tripleClick(x=853, y=186, interval=0.0, button='left', duration=0.0, tween=pag.linear)
# 截取课件,并生成图片
img_path = '11.png'
#im = ImageGrab.grab(bbox = ()) 全屏
im = ImageGrab.grab(bbox = (774,244,1871,857))
im.save(img_path)
# 将图片加入PPT,创建幻灯片 ------
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[1])
pic = slide.shapes.add_picture(img_path, Inches(0.5), Inches(0.5),Inches(9),Inches(6))
prs.save(filename + '.pptx')
5 读写txt
def write(filename, msg):
#获取当前文件所在路径
filepath = os.getcwd()
print(filepath)
file_path = filepath + '\\' + filename
print(file_path)
#exit()
file = open(file_path, 'w')
file.write(msg) #msg也就是下面的Hello world!
file.close()
6 制作表情包
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
# 安装依赖
# cv2: pip install opencv-python
# matplotlib: pip install matplotlib
# 这里写一个绘图函数,方便绘图操作。
def plt_show(img):
imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(imageRGB)
plt.show()
# 导入前景照片
image = cv2.imread('333.jpg', 0) # 导入灰度图即可
# 前景照片的尺寸比背景尺寸还要大,这显然是不合适的,所以要先对其进行等比例(0.5)缩放。
image_resize = cv2.resize(image, None, fx=0.5, fy=0.5, interpolation = cv2.INTER_CUBIC)
# 对前景照片进行二值化处理,将像素值大于 110 的区域设置为 255;小于 110 的区域设置成 0。
ret, image_binary = cv2.threshold(image_resize, 110, 255, cv2.THRESH_BINARY)
# 提取出感兴趣区域
image_roi = image_binary[277: 522, 565: 850]
# 旋转图片
# 因为背景图片(熊猫头)是正的,而前景图片有些向右倾斜,所以要先对其进行旋转操作(大概逆时针旋转 15 度即可)。
rows, cols = image_roi.shape
M = cv2.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0), 15, 1) # (旋转中心,逆时针旋转角度,各个方向同等扩大比例)
image_rotate = cv2.warpAffine(image_roi, M, (272, 260)) # (272, 260) 是指旋转后的画布大小
# 将一些不需要的黑色区域删除掉
h, w = image_rotate.shape
image_rotate_copy = image_rotate.copy()
pts1 = np.array([[0, 64], [128, 0], [0, 0]], np.int32) #三点围成的区域涂成白色
pts2 = np.array([[230, 0], [w, 55], [w, 0]], np.int32)
pts3 = np.array([[0, 120], [85, h], [0, h]], np.int32)
pts4 = np.array([[98, h], [w, 210], [w, h]], np.int32)
foreground = cv2.fillPoly(image_rotate_copy, [pts1], (255, 255, 255)) # (图片,填充区域,填充颜色)
foreground = cv2.fillPoly(image_rotate_copy, [pts2], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts3], (255, 255, 255))
foreground = cv2.fillPoly(image_rotate_copy, [pts4], (255, 255, 255))
# 再次提取感兴趣区域并缩放
#foreground_roi = foreground[0: 93, 0: 125]
# 再次等比例(1.2)缩放
foreground_roi_resize = cv2.resize(foreground, None, fx=1.2, fy=1.2, interpolation = cv2.INTER_CUBIC)
# 导入背景图片
background = cv2.imread('222.jpg', 0)
# 组合两张图片成表情包
h_f, w_f = foreground_roi_resize.shape
h_b, w_b = background.shape
left = 135 # 前景图片在背景图片中的左边的横坐标
right = left + w_f # 前景图片在背景图片中的右边的横坐标
top = 86 # 前景图片在背景图片中的上边的纵坐标
bottom = top + h_f # 前景图片在背景图片中的下边的纵坐标
emoji = background
emoji[top: bottom, left: right] = foreground_roi_resize
# 添加中文文本
PilImg = Image.fromarray(emoji) # cv2 转 PIL
draw = ImageDraw.Draw(PilImg) # 创建画笔
ttfront = ImageFont.truetype('simhei.ttf', 45) # 设置字体
draw.text((200, 530),"我美不美!!",fill=0, font=ttfront) # (位置,文本,文本颜色,字体)
emoji_text = cv2.cvtColor(np.array(PilImg),cv2.COLOR_RGB2BGR) # PIL 转回 cv2
plt_show(emoji_text)
# 保存表情包
#cv2.imwrite('./emoji.png', np.array(emoji_text))