python记录

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()函数、变量赋值
分析:首先获取用户输入的圆的半径,然后使用浮点数进行计算,最后输出圆的周长和面积。
步骤如下

  1. 使用input()函数获取用户输入的圆的半径,并将其保存为字符串。
  2. 使用float()函数将输入的字符串转换为浮点数,以便进行数学计算。
  3. 计算圆的周长和面积,并将结果分别保存在perimeterarea变量中。
  4. 使用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多条件分支
分析:根据输入的分数打印不同等级。使用ifelif语句来检查不同的分数范围,并打印相应的等级。
当用户输入一个分数后,程序会按照以下规则进行评估:
• 如果分数大于等于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 常用语法

    1. 输入输出
      page_index = int(input('请输入文件序号:'));
      print(page_index)
    1. 延时操作
      import time
      time.sleep(1)
    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)
    1. 字符串替换
      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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值