在还没正式培训前的第一次作业是常试用numpy和matplotlib来画一个分段函数和一个3d旋转体。经过一番学习和各种百度,我画出了分段函数。代码如下:
import matplotlib.pyplot as plt
import numpy as np
import math
x1=np.arange(0.5,1,0.001)
a=pow(2,x1)
y1=np.log10(a)
plt.plot(x1,y1)
x2=np.arange(0,0.5,0.001)
b=-abs(x2)
y2=-np.power(math.e,b)+1
plt.plot(x2,y2)
x3=np.arange(-1,0,0.01)
y3=-2*x3
plt.plot(x3,y3)
然后通过学习后来发的答案发现自己的代码可以简化,而且明白了三维旋转体的实现。关键的是,其实这次作业是为了培养我们的百度能力!?2333
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# -1~1 200个
x=np.linspace(-1,1,200)
# 构造 y
def up(x):
return np.log10(np.exp2(np.abs(x)))
def down(x):
return -np.exp(-(np.abs(x)))+1
def transfer(x):
if x>=0.5:
x=up(x)
elif x>=0:
x=down(x)
else:
x=-2.0*x
return x
# 转换
y=[transfer(i) for i in x.tolist()]
# 二维状态打印
plt.plot(x,y)
# 开始三维构造
figure = plt.figure()
ax = Axes3D(figure)
# 构造X,Y轴的网格数据
X=np.linspace(-1,1,200)
Y=np.linspace(-1,1,200)
# 转化成为网格数据
X, Y=np.meshgrid(X, Y)
# 旋转构造
R = np.sqrt(X**2 + Y**2)
# 对array里面每一个数据进行转换
Z = np.array([[transfer(R[i][j]) for j in range(200)] for i in range(200)])
# 打印
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
# 输出展示
plt.show()
正式的第一次讲课是讲C语言的指针到链表,当时大概就是简单的说了下。当时学链表确实很难受,搜出来代码都看不懂,总之经过一番努力。自己做了一个链表的建立,现在来看,幸亏当时学了,后来在计算机课上学的时候就比较轻松。当时的代码找不到了。所以就不放代码了。
接着讲了数据处理,学习panda库和numpy库对文件的操作,作业是打开一个excel表格并执行一系列操作和统计。通过在网上找库的使用方法,结合培训时的内容,我打了以下代码:
import numpy as np
import pandas as pd
f=open(r'C:\Users\24218\python的编程夹\train.csv')
ff= pd.read_csv(f)
lf = pd.DataFrame(ff)
df=lf.fillna(0)
sex=df.pop('Sex')
fff=sex.value_counts()
b=fff['male']/fff['female']
print(b)
live=df['Survived'].sum()
die=891-live
p=live/die
print(p)
max1=df['Age'].max()
min1=lf['Age'].min()
print(max1,min1)
df['Survived'].hist(bins=50)
np.list1=[b,p,max1,min1]
save = pd.DataFrame(np.list1, index = ['man/woman', 'live/died', 'max','min'])
open(r'C:\Users\24218\Desktop\zuoye\zuoye.csv')
save.to_csv(r'C:\Users\24218\Desktop\zuoye\zuoye.csv')
然后是学习pycharm的功能,用pycharm做一个计算器,使用pyqt5库来完成,这是我觉得最难的一次,代码很长,而且用到的库也是第一次接触,理解起来确实不容易,我找到一个代码,然后逐条去百度并理解,最后我也仅仅是能明白了那一串代码然后进行自己打出来。代码如下:
import sys
import re
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QGridLayout, QGroupBox, QLineEdit
from PyQt5.QtCore import Qt
class Calculater(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):#画计算器形状
self.setWindowTitle('计算器')
self.setGeometry(700, 400, 300, 500)
# 这里是显示区
self.resultflag = 0
self.errflag = 0
self.display = QLineEdit('0')
self.display.setReadOnly(True)
self.display.setAlignment(Qt.AlignRight)
self.display.setMaxLength(30)
# 这里是操作区
self.createGridLayout()
windowLayout = QVBoxLayout()
windowLayout.addWidget(self.display)
windowLayout.addWidget(self.horizontalGroupBox)
self.setLayout(windowLayout)
self.show()
def createGridLayout(self):
self.horizontalGroupBox = QGroupBox('')
layout = QGridLayout()
button02 = QPushButton('归零')
button02.clicked.connect(self.on_click)
layout.addWidget(button02, 0, 0, 1, 2)#从1行1列开始,占1行,2列
button00 = QPushButton('删除')
button00.clicked.connect(self.on_click)
layout.addWidget(button00, 0, 2)
button03 = QPushButton('/')
button03.clicked.connect(self.on_click)
layout.addWidget(button03, 0, 3)
button10 = QPushButton('7')
button10.clicked.connect(self.on_click)# 第2行操作区
layout.addWidget(button10, 1, 0)
button11 = QPushButton('8')
button11.clicked.connect(self.on_click)
layout.addWidget(button11, 1, 1)
button12 = QPushButton('9')
button12.clicked.connect(self.on_click)
layout.addWidget(button12, 1, 2)
button13 = QPushButton('*')
button13.clicked.connect(self.on_click)
layout.addWidget(button13, 1, 3)
button20 = QPushButton('4')
button20.clicked.connect(self.on_click)# 第3行操作区
layout.addWidget(button20, 2, 0)
button21 = QPushButton('5')
button21.clicked.connect(self.on_click)
layout.addWidget(button21, 2, 1)
button22 = QPushButton('6')
button22.clicked.connect(self.on_click)
layout.addWidget(button22, 2, 2)
button23 = QPushButton('-')
button23.clicked.connect(self.on_click)
layout.addWidget(button23, 2, 3)
button30 = QPushButton('1') # 第4行操作区
button30.clicked.connect(self.on_click)
layout.addWidget(button30, 3, 0)
button31 = QPushButton('2')
button31.clicked.connect(self.on_click)
layout.addWidget(button31, 3, 1)
button32 = QPushButton('3')
button32.clicked.connect(self.on_click)
layout.addWidget(button32, 3, 2)
button33 = QPushButton('+')
button33.clicked.connect(self.on_click)
layout.addWidget(button33, 3, 3)
# 操作区第5行,其中'0'独占1行2列
button40 = QPushButton('0')
button40.clicked.connect(self.on_click)
layout.addWidget(button40, 4, 0, 1, 2) # 从4行0列开始占1行2列
button42 = QPushButton('.')
button42.clicked.connect(self.on_click)
layout.addWidget(button42, 4, 2, 1, 1) # 从4行2列开始占1行1列
button43 = QPushButton('=')
button43.clicked.connect(self.on_click)
layout.addWidget(button43, 4, 3, 1, 1) # 从4行3列开始占1行1列
self.horizontalGroupBox.setLayout(layout)
def on_click(self):
source = self.sender()
# 全部输入清零
if source.text() == '归零':
self.display.setText('0')
# 退格键功能
elif source.text() == '删除':
if self.resultflag != 1:
if len(self.display.text()) <= 1:
newtext = '0'
else:
newtext = self.display.text()[0: (len(self.display.text()) - 1)]
self.display.setText(newtext)
# 计算输入的算术表达式并将结果显示
elif source.text() == '=':
if self.resultflag != 1:
try:
disstr = self.display.text()[:]
# 考虑表达式不完整的情况处理:尾部为运算符*/则补1
if disstr[len(disstr) - 1:] in '*/':
calstr = disstr + '1'
# 尾部为运算符+-或小数点则补0
elif disstr[len(disstr) - 1:] in '+-.':
calstr = disstr + '0'
else:
calstr = disstr[:]
result = str(eval(calstr))
# 考虑除0异常处理
except (ZeroDivisionError, Exception) as errinfo:
result = 'Error: ' + str(errinfo)
self.errflag = 1
self.display.setText(result)
self.resultflag = 1
# 输入数字或小数点:将算术表达式输入同步显示出来
else:
self.numhandle()
def numhandle(self):
rawstr = self.display.text()[:]
strlen = len(rawstr)
lastchar = rawstr[strlen - 1:]#规定运算顺序
inchar = self.sender().text()[:]#输入的字符
newstr = ''
if self.resultflag != 1:
# 当前最后一个字符为运算符(+-*/)
if lastchar in '+-*/':
# 输入为0-9 -> 直接追加
if inchar in '0123456789':
newstr = rawstr + inchar
# 输入为运算符 -> 忽略输入
elif inchar in '+-*/':
newstr = rawstr[:]
# 输入为小数点 -> 小数点前补0再追加
else:
newstr = rawstr + '0' + inchar
# 当前最后一个字符为小数点
elif lastchar == '.':
# 输入为0-9 -> 直接追加
if inchar in '0123456789':
newstr = rawstr + inchar
# 输入为小数点 -> 忽略输入
elif inchar == '.':
newstr = rawstr[:]
# 输入为运算符 -> 运算符前补0再追加
else:
newstr = rawstr + '0' + inchar
# 当前最后一个字符为0-9
else:
numreg1 = re.compile(r'[+\-*/]{0,1}[0-9]+\.[0-9]*[0-9]$')
srchrslt1 = numreg1.search(rawstr)
# 当前最后一个数字前面已经有小数点
if srchrslt1 != None:
# 输入为小数点 -> 忽略输入
if inchar == '.':
newstr = rawstr[:]
# 输入为0-9或运算符 -> 直接追加
else:
newstr = rawstr + inchar
# 当前最后一个数字前面没有小数点
else:
numreg2 = re.compile(r'[+\-*/]0$')
srchrslt2 = numreg2.search(rawstr)
# 当前最后一个字符为0且作为最近运算符后的第一个数字
if srchrslt2 != None:
# 输入为小数点或运算符 -> 直接追加
if inchar == '.' or inchar in '+-*/':
newstr = rawstr + inchar
# 输入为0-9 -> 忽略输入
else:
newstr = rawstr[:]
# 当前字符串即是'0'
elif rawstr == '0':
# 输入为0-9 -> 用输入取代原字符'0'
if inchar in '0123456789':
newstr = inchar[:]
# 输入为小数点或运算符 -> 直接追加
else:
newstr = rawstr + inchar
# 其他情况均可直接追加
else:
newstr = rawstr + inchar
# 前面输入已经计算出结果
else:
# 考虑计算有无异常
if self.errflag == 0:
# 输入为运算符 -> 直接追加
if inchar in '+-*/':
newstr = rawstr + inchar
# 输入小数点 -> 以小数点前补0刷新显示
elif inchar == '.':
newstr = '0' + inchar
# 输入0-9 -> 以输入刷新显示
else:
newstr = inchar[:]
else:
# 输入为运算符 -> 忽略输入并擦除err信息
if inchar in '+-*/':
newstr = '0'
# 输入小数点 -> 以小数点前补0刷新显示
elif inchar == '.':
newstr = '0' + inchar
# 输入0-9 -> 以输入刷新显示
else:
newstr = inchar[:]
self.errflag = 0
self.resultflag = 0
self.display.setText(newstr)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Calculater()
sys.exit(app.exec_())
然后学习了turtle库来画图,我觉得这个库是很有趣,可以把画图的过程展现出来,通过各种百度,我打了如下代码:
import turtle
def drawGap(): #绘制数码管间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw): #绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(60)
drawGap()
turtle.right(90)
def drawDigit(x): #根据数字绘制七段数码管
drawLine(True) if x in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if x in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if x in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if x in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if x in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if x in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if x in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(30)
#运行主程序
turtle.setup(900, 500)#展开画板
turtle.penup()
turtle.fd(-350)
turtle.pensize(5)
a=open(r"C:\Users\24218\python的编程夹\520.txt")#引用文件
b=a.readlines()
b=b[0].split()
for i in range(0,len(b)):
b[i]=int(b[i])
a.close()
for x in b : #画出5201314
drawDigit(x)
turtle.hideturtle()
turtle.done()
其实本来是想写文字的,但是搞了很久画不出来2333,只能弄了这个。
之后一节课,学习了如何当一个爬虫233,学习使用BeautifulSoup对页面抓取,然后是使用正则表达式的精确匹配,但是这次作业感觉确实是没有掌握好,总是找不到怎么去提取网页的内容,(而且不知道怎么百度hhh)后来大佬发了代码之后,我还是能看懂然后理解了。(代码太长就不放了)
其实学习了这么久,让我感受最深的是,知道了怎么去学习一个知识,同时打代码时不能心急,好几次都是因为一点小问题,但是后来慢慢去学,搞懂每一个小细节之后,其实就能解决了。
另外,也是感觉这些东西确实是很有趣,从画图到自己做计算器再到做一个小爬虫,而且学会也是很开心。