作业部分
作业1 Python 基础
输入输出学习
输入两个整数,并计算二者的加减乘除的结果
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
# 分别把 a、b 转换成整数
a=int(a)
b=int(b)
# 计算 a、b 的和、差、积、商,赋值给变量c,并打印
c=a+b
print("和:c = %d"%c)
c=a-b
print("差:c = %d"%c)
c=a*b
print("积:c = %d"%c)
c=a/b
print("商:c = %d"%c)
条件判断
输入两个整数,如果两个整数之和小于100,则输出 '小于100',否则输出 '不小于100'
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
# 分别把 a、b 转换成整数
a=int(a)
b=int(b)
# 计算 a、b 的和,赋值给变量c
c=a+b
# 判断c是否小于100,按要求输出
if c < 100:
print("小于100")
else:
print("不小于100")
3.列表学习(数组)
1.创建一个含有元素1,2,4,8,16,32的列表
尽可能的写多种的方法实现(两种以上该问满分)
2.分别完成以下操作(在原列表基础上)
· 输出第2个元素 · 删除第2个元素 · 更改第2个元素为0
# 列表统一命名为L
# 方法一:
L = [1,2,4,8,16,32]
print(L)
# 方法二:
L =[]
for i in range(6):
a=pow(2,i)
L.append(a)
print(L)
#输出第2个元素
print(L[1])
#删除第2个元素
print('未删除前')
print(L)
print('删除后')
L.pop(1)
print(L)
#更改第2个元素为0
print('更改第2个元素为0')
L[1]=0
print(L)
斐波那契数列
资源限制
时间限制:1.0s 内存限制:256.0MB
想要拿满分的话,资源限制一定要特别注意!
问题描述
Fibonacci数列的递推公式为:FnF_nF**n = F(n−1)F(n−1)F(n−1) + F(n−2)F(n−2)F(n−2) 其中F1F_1F1=F2F_{2}F2 = 1
当n比较大时,FnF_nF**n也非常大,现在我们想知道,FnF_nF**n除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
解题思路
先找出对10007取余的循环节,通过暴力跑斐波那契数列,我们可以知道每20016个数结果循环一次,所以我们可以先对n进行取余 然后再看看对应的Fn是多少。
n = int(input())
#寻找循环节
L=[0,1,1]
for i in range(3,20019):
a=(L[i-1]%10007)+(L[i-2]%10007)
a%=10007
L.append(a)
#每20016个数循环一次,可以先用代码暴力跑出来这个数字
n%=20016
result=L[n]
print(result)
作业2 Python数据排序
对随机生成并且打乱的arr从小到大依次进行冒泡排序,快速排序,插入排序和希尔排序算法
1.冒泡排序算法
冒泡排序算法就是每次遍历比较相邻两个数,遍历n-1次后就排序完成了。
# 随机生成
import numpy as np
#请把冒泡排序算法补充完整
#每次比较相邻两个数
def bubble_sort(nums):
n=len(nums)
for i in range(n):
for j in range(n-i-1):
if nums[j] > nums[j+1]:
temp=nums[j]
nums[j]=nums[j+1]
nums[j+1]=temp
return nums
if __name__ == '__main__':
# 打乱顺序并随机生成
nums=np.random.permutation(20)
print('没排序前')
print(nums)
print('排序后')
print(bubble_sort(nums))
2.快速排序算法
每次循环先根据最后一个数把数组分成两部分:小于这个数的A数组和大于这个数的B数组。当我们找到最后一个数应该所在的位置后,这个数就固定位置了。
这之后,我们对两部分数组重复这个操作。
# 随机生成
import numpy as np
#请把快速排序算法补充完整
#把比数组每部分最后一位小的往前移,大的往后放
def partition(arr, l,r):
i=l-1
p=arr[r]
for j in range(l,r):
if arr[j] < p:
i+=1
arr[i],arr[j]=arr[j],arr[i]
arr[i+1],arr[r]=arr[r],arr[i+1]
return (i+1)
def quickSort(arr,l,r):
if(l
3.希尔排序
希尔排序是指先设定一个距离值,初始为n/2。每次遍历把距离相同距离的几个数排好序,然后把距离值/2。然后重复这个操作。
中间移动过程是用插入排序思路。
# 随机生成
import numpy as np
#请把希尔排序算法补充完整
def shellSort(arr):
n=len(arr)
gap=int(n/2)
while gap >0:
for i in range(gap,n):
temp=arr[i]
j=i
while j>=gap and arr[j-gap]>temp:
arr[j]=arr[j-gap]
j-=gap
arr[j]=temp
gap=int(gap/2)
return arr
if __name__ == '__main__':
nums=np.random.permutation(20)
print('没排序前')
print(nums)
print('排序后')
print(shellSort(nums))
4.插入排序
插入排序就是把当前的数插入到前面已经排好序的数组里。我们可以假设第一个数就是已经排好序的。然后把比当前数大的往后移,直到找到当前数应该在的位置,每次保持序列有序。
# 随机生成
import numpy as np
#请把插入排序算法补充完整
#每次先把比当前大的值往后移,直到第一个比自己小的。
def insertionSort(arr):
n=len(arr)
for i in range(1,n):
if arr[i]>arr[i-1]:
continue
else:
temp=arr[i]
k=i-1
while arr[k]>temp and k>=0:
arr[k+1]=arr[k]
k-=1
arr[k]=temp
return arr
if __name__ == '__main__':
nums=np.random.permutation(20)
print('没排序前')
print(nums)
print('排序后')
print(bubble_sort(nums))
作业3:大作业
1.第1题
数据如下:
stu1.txt 孙同学,2020-5-21,20,'男',77,56,77,76,92,58,-91,84,69,-91
stu2.txt 赵同学,2020-11-3,24,'女',65,68,72,95,-81,71,86,91,57,91
stu3.txt 王同学,2021-8-7,25,'男',87,78,90,-76,88,47,100,65,69,100
stu4.txt 李同学,2021-8-10,29,'男',92,54,85,71,-91,68,77,68,95,95
以上四个txt文档在work路径下可以找到。
定义Student类,包括name、dob、age、gender和score属性,包括top3方法用来返回学生的最大的3个成绩(可重复)、sanitize方法用来将负的分数变为正的分数,负的分数可能是输入错误。声明stu_list对象组数用于存储所有的学生对象。最后输出所有的学生信息包括姓名、生日、年龄、性别、最高的3个分数。
第一题的输出结果如下,供参考:
解题思路
先创建一个学生类
class 学生:
初始化:对每个学生对象初始化赋值name、dob、age、gender和score值。
top3函数:返回学生的最大的3个成绩(可重复)
sanitize函数:sanitize方法用来将负的分数变为正的分数
我们观察文件,可以发现除了中间数不一样以外,其他文件名格式都是一样的。所以我们可以用循环来读取这4个文件。
打开txt文件和每行读取方法在朱子英老师讲解的项目中有,可以参考一下。
读取完后,我的思路是把score值提前先转化为整数类型的值。
可以试试对字符类型的值把前面的负号去掉。
之后再存到stu_list对象数组里。
class Student:
def __init__(self,a_name,a_birth,a_age,a_sex,a_scores=[]):
self.name=a_name
self.birth=a_birth
self.age=a_age
self.sex=a_sex
self.scores=a_scores
def top3(self):
return sorted([self.sanitize(t) for t in self.scores])[-4:-1]
def sanitize(self,num):
if num < 0 :
num=-1*num
return num
#使用一个数组来进行存储对象
stu_list=[]
# 将文件打开,按每行读入,分别使用,隔开
def get_coach_data(filename):
with open (filename) as f:
line = f.readline()
return line.strip().split(',')
# 提前把字符类型的数字转化为整数型的数字,方便后面处理
def trans(times=[]):
num=[]
l=len(times)
for i in range(l):
num.append(int(times[i]))
return num
#利用循环来创建对象
for i in range(1,5):
filename='work/stu'+str(i)+'.txt'
time=get_coach_data(filename)
stu_name=time.pop(0)
stu_birth=time.pop(0)
stu_age=time.pop(0)
stu_sex=time.pop(0)
stu_scores=trans(time)
stude=Student(stu_name,stu_birth,stu_age,stu_sex,stu_scores)
stu_list.append(stude)
for i in range(0,4):
print(f"姓名:{stu_list[i].name} 生日:{stu_list[i].birth} 年龄:{stu_list[i].age} 性别:{stu_list[i].sex} 分数:{stu_list[i].top3()} ")
2.第2题
数据格式如下:
stu5.txt 特长同学,2020-10-5,20,'男',180,87,98,77,76,92,58,-76,84,69,-47
stu6.txt 特长同学,2020-10-6,20,'女',230,76,48,82,88,92,58,-91,84,69,-68
以上两个txt文档在work路径下可以找到。
定义Spostudent、Artstudent为Student的子类,在子类的属性里面新增了spe为特长分数。Spostudent包括的top3方法返回的是最低的3个得分(可重复),Artstudent包括top3方法返回的是最高的3个得分(可重复),最后使用多态的方式输出2个特长同学的姓名、生日、年龄、性别、分数、特长分。
第二题的输出结果如下,供参考:
解题思路
先把Spostudent、Artstudent定义好,然后用循环分别创建两个对象,还是存在对象数组里。然后一起输出。
有一个点需要注意的是:
当我们定义Spostudent类的时候,特长分要放在分数值前面。因为分数值是一个缺失值,所以在初始化的时候,我们要把特长分放在分数值前面。并且在继承初始化的时候,我们不能写a_scores=[],这样的话相当于每次创建对象,都是把空数组赋值给对象的分数值。
#spe要放在scores前面
#定义Spostudent类
class Spostudent(Student):
def __init__(self,a_name,a_birth,a_age,a_sex,a_spe,a_scores=[]):
#继承的时候不能写等于=[] 因为这样的话就不能把输入的数值给读入。只能赋予一个空的数组。
super().__init__(a_name,a_birth,a_age,a_sex,a_scores)
self.spe=a_spe
def top3(self):
return sorted([self.sanitize(t) for t in self.scores])[0:3]
#定义Artstudent类
class Artstudent(Student):
def __init__(self,a_name,a_birth,a_age,a_sex,a_spe,a_scores=[]):
super().__init__(a_name,a_birth,a_age,a_sex,a_scores)
self.spe=a_spe
#使用一个数组来进行存储对象
stu_list=[]
# 将文件打开,按每行读入,分别使用,隔开
def get_coach_data(filename):
with open (filename) as f:
line = f.readline()
return line.strip().split(',')
# 提前把字符类型的数字转化为整数型的数字,方便后面处理
def trans(times=[]):
num=[]
l=len(times)
for i in range(l):
num.append(int(times[i]))
return num
#数据文件为stu5.txt 和 stu6.txt
for i in range(5,7):
filename='work/stu'+str(i)+'.txt'
time=get_coach_data(filename)
stu_name=time.pop(0)
stu_birth=time.pop(0)
stu_age=time.pop(0)
stu_sex=time.pop(0)
stu_spe=time.pop(0)
stu_scores=trans(time)
#不同类使用不同定义方式
if i == 5:
stude=Spostudent(stu_name,stu_birth,stu_age,stu_sex,stu_spe,stu_scores)
else:
stude=Artstudent(stu_name,stu_birth,stu_age,stu_sex,stu_spe,stu_scores)
stu_list.append(stude)
for i in range(0,2):
print(f"姓名:{stu_list[i].name} 生日:{stu_list[i].birth} 年龄:{stu_list[i].age} 性别:{stu_list[i].sex} 分数:{stu_list[i].top3()} 特长分:{stu_list[i].spe}")
作业3:图像处理
1、图像翻转 按照以下条件翻转图像
水平翻转
竖直翻转 保存的文件名为1-1.png和1-2.png(也可以输出图片)
使用cv2.flip函数来实现。第二个参数,
如果是等于0就是垂直翻转,
大于0就是水平翻转,
小于0就是水平垂直翻转。
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
path = "baidu_bear.png" # 图片路径
image = Image.open(path)
image = np.array(image)
#在下面补充相关代码
#转换为RGB通道存储
def cv2_cvtColor(dst):
return cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
# 水平翻转
dst = cv2.flip(image,1)
# 垂直翻转
dst1 = cv2.flip(image, 0)
dst = cv2_cvtColor(dst)
dst1 = cv2_cvtColor(dst1)
#存储
cv2.imwrite('1-1.png',dst)
cv2.imwrite('1-2.png',dst1)
2、图像裁剪 按照以下条件裁剪图像
长度方向
宽度方向
俩个方向同时裁剪
随机裁剪的图片(大小设定随意) 保存的文件名为2-1.png、2-2.png、2-3.png、2-4.png(也可以输出图片)
使用image.crop这个函数实现,四个参数分别对应左、上、右、下。对应的是左上角的坐标系。
随机裁剪这块,生成两个数,然后在这两个数的基础上,分别都加100,生成剩下两个数。同时保证这四个数都是在图片大小范围内。不满足就重新生成。
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
path = "baidu_bear.png" # 图片路径
image = Image.open(path) #读取图片
print(image.size)
#wide high 580,435
#长度方向裁剪
k1 = image.crop((0,0, 580, 200))
k1.save("2-1.png")
#宽度方向裁剪
k2 = image.crop((0,0,200, 435 ))
k2.save("2-2.png")
#俩个方向同时裁剪
k3 = image.crop((0,0,200, 200 ))
k3.save("2-3.png")
# 随机裁剪的图片(大小设定随意)
#随机生成2个数,保持图片大小为100*100
import random
def num_round():
left1=random.randint(0,580)
right1=left1+100
up1=random.randint(0,435)
lower1=up1+100
return left1, up1, right1, lower1
left1=right1=589
up1=lower1=540
#如果随机生成的数超出图片边界的话,就重新生成
while (left1<0 or left1 >580 or right1<0 or right1>580 or up1<0 or up1>435 or lower1<0 or lower1>435):
left1,up1,right1,lower1=num_round()
# print(left1,up1,right1,lower1)
k4 = image.crop((left1,up1,right1,lower1 ))
k4.save("2-4.png")
# 看看图片大小
# image = Image.open("2-4.png")
# print(image.size)
3、图像亮度变换
按照以下要求调整图像亮度
一半亮度
两倍亮度 保存的文件名为3-1.png、3-2.png(也可以输出图片)
PIL模块中的ImageEnhance进行图片数据增强,只能用于 1.Brightness 亮度 2.Color 色度 3.Contrast 对比度 4.Sharpness 锐度
使用方法:
enh_sha = ImageEnhance.XX(image)
sharpness = 0.8
image_changed= enh_sha.enhance(sharpness)
cv2.imwrite('1-1.png',image_changed)
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
#能调整图像的亮度、对比度、色度、锐度
from PIL import ImageEnhance
path = "baidu_bear.png" # 图片路径
image = Image.open(path) #读取图片
#亮度增强
def changeimage(x):
enh_bri = ImageEnhance.Brightness(image)
brightness = x
image_brightened = enh_bri.enhance(brightness)
return image_brightened
k1=changeimage(0.5) #调暗
k2=changeimage(2) #调亮
k1.save("3-1.png")
k2.save("3-2.png")
4、图像色调变换
按照以下要求调整图像色调
色调取反
转成灰度图
对灰度图色调取反
增强饱和度
保存的文件名为4-1.png、4-2.png、4-3.png、4-4.png(也可以输出图片)
色调取反,就是对每个通道,拿最大值(这里是2^8-1=256-1)减去每个通道的值。
灰度图可以使用cv2.cvtColor这个函数进行转换,灰度图只有一个通道,所以可以直接拿255-灰度图实现对灰度图的色调取反。
一.对比度和饱和度的区别
对比度指的是最高亮度和最低亮度的比值。当图像对比度越高时,说明图像明暗差异越明显; 饱和度指的是色彩的纯正程度,越纯正饱和度越高。如纯蓝、纯红、纯绿属于高饱和度,而灰蓝、玫红、草绿属于低饱和度,因此图像的饱和度越高说明图像色彩越鲜艳。 先从RGB转化为HSV HSV分别为色调,饱和度,亮度。 然后单独对S层进行调整。
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
path = "baidu_bear.png" # 图片路径
image = Image.open(path) #读取图片
image = np.array(image)
#色调取反
sha=image.shape
height,width,deep=sha
#(435, 580, 3)
# print(sha)
dst=np.zeros((height,width,3),np.uint8)
for i in range(height):
for j in range(width):
b,g,r=image[i][j]
dst[i][j]=(255-b,255-g,255-r)
cv2.imwrite('4-1.png',dst)
#转成灰度图
gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite('4-2.png',gray)
#对灰度图色调取反
k2=255-gray
cv2.imwrite('4-3.png',k2)
#增强饱和度
#先从RGB转化为HSV HSV分别为色调,饱和度,亮度
hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
#分离三个矩阵
h,s,v=cv2.split(hsv)
#饱和度调节参数
k=1
s=s*k
#合并
hsv=cv2.merge([h,s,v])
#重新转化为RGB
image=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
cv2.imwrite('4-4.png',image)
还有另一种实现调整图像饱和度的做法---PS 图像调整中的饱和度调整算法
但是网上找的资料还是有些错误。我也没弄明白原理,所以暂时不贴出来。