写在前面
许多人都推荐写一点博客,一来记录生活,二来检测成长,三来展示自己,我对这个观点持赞同态度,于是今天我写下了人生中的第一篇博客并,以此来记录下我这几个月的编程之旅。
菜鸡帆の编程之旅
高考后
这是我第一次有意识的学习编程(抛开高中信息课学到的非常有限的一点点不谈)我学习编程的目的,估计也就是兴趣使然吧!当然也与我对未知领域的的好奇有关,能让原本只有01010
的计算机执行像样的操作,中间的许多过程都不被普通人了解,我想要打破科技黑箱,搞清楚这些应用程序的本质。
也记不清是从哪里得知的,我了解到Python十分强大,所以我决定把Python作为我第一个接触的语言。而在这个时候,又有一个同学向我推荐了中国大学MOOC,所以我开始了我的第一次Python学习。
也许大家都有这样的经历:如果下定决心要做某一件事,在最开始的一段时间内是十分积极的。事实上,我那时正是这种状态。由于高考的结束,我开始有大把大把的时间用来干我自己想干的事情。我开始高强度地看慕课,但是这种情况并没有持续很长时间,我才看到第二章便没有继续看下去了,这并不是因为我对编程失去了兴趣,我还是非常乐意学习Python的,但是出于种种原因,我的第一次编程学习还是止步于此。
实话实话,这次的编程并没有让我对程序设计有更多更深入的了解,但是它向我展示了一个新世界的一角,而这一角的绚烂却已然超出我的想象,这一瞥也为我之后的编程之路奠定了基础
来到大学后
到大学后,我也没有刻意地去学习编程,只是时不时的挂念他,毕竟生活中还有许许多多或难或易的事情等着我去处理,还有许多或有趣或枯燥的日常等着我去经历。刚进入大学的我显然不可能适应的那么迅速,所以我把重心放在了熟悉环境、适应环境、融入环境的过程中。
转眼一个学期即将过去,在安顿好我自己后,我开始有了更多空闲的时间。
而就在前几天,我又听说下学期我们将要学习C语言,这一说便又勾起了我学习的欲望,我还想更深入的了解这个神秘世界。
于是约一个星期前,时隔半年,我又重新踏上了菜鸡帆的编程之路。
约一星期前:
元旦当天,我和我的同学来到学院路校区玩,趁此机会,我在学院路图书馆借了一本《笨方法学C》,当时我翻看了近一个小时,决定将这本书带走。
五天前:
我重温了前两章的慕课内容,又再度忆起了当初初学Python的激动之情,我还找出了当时为了练手而码出的极其简单的一段代码,是关于turtle绘图体系的
import turtle as t
t.setup(1000,700,200,100)
t.penup()
t.goto(-250,300)#电脑
t.pendown()
t.pensize(10)
t.pencolor("red")
for i in range(2):
t.fd(500)
t.right(90)
t.fd(280)
t.right(90)
t.seth(-90)
t.fd(280)
t.right(40)
t.fd(200)
t.left(130)
t.fd(500)
t.left(50)
t.fd(200)
t.pencolor("blue")
t.penup()
t.pensize(3)
t.goto(-220,250)#第一点
t.pendown()
t.seth(-40)
t.fd(30)
t.penup()
t.goto(-227,220)#第二点
t.pendown()
t.seth(-40)
t.fd(33)
t.penup()
t.goto(-222,140)#提
t.pendown()
t.seth(55)
t.fd(37)
t.penup()
t.goto(-170,245)#横
t.pendown()
t.seth(0)
t.fd(55)
t.right(140)
t.fd(70)
t.right(-140)
t.fd(55)
t.right(90)
t.fd(60)
t.seth(125)
t.fd(40)
t.penup()
t.goto(-145,200)#第一撇
t.pendown()
t.seth(-125)
t.fd(30)
t.penup()
t.goto(-118,200)#第二撇
t.pendown()
t.fd(70)
t.penup()
t.goto(-70,245)
t.pd()
t.seth(0)
for i in range(4):#全包围
t.fd(90)
t.right(90)
t.pu()
t.goto(-40,245)
t.seth(-105)
t.pd()
t.fd(70)
t.pu()
t.goto(-10,245)
t.seth(-90)
t.pd()
t.fd(45)
t.circle(20,90)
t.fd(10)
t.pu()
t.goto(50,245)#第三个字
t.pd()
t.left(90)
for ii in range(2):
t.right(90)
t.fd(25)
t.right(90)
t.fd(100)
t.bk(30)
t.seth(0)
t.fd(25)
t.seth(-90)
t.fd(30)
t.right(90)
t.fd(25)
t.pu()
t.goto(100,245)#第三个字(右半部分)
t.pd()
t.seth(0)
t.fd(30)
t.right(90)
t.fd(40)
t.right(90)
t.fd(30)
t.right(90)
t.fd(20)
t.right(90)
t.fd(30)
t.pu()
t.goto(100,245)
t.seth(-90)
t.pd()
t.fd(100)
t.left(135)
t.fd(30)
t.pu()
t.goto(100,205)
t.pd()
t.seth(-55)
t.fd(65)
t.pu()
t.goto(130,190)
t.seth(-135)
t.pd()
t.fd(17)
t.pu()
t.goto(0,0)
这段代码的作用其实只是绘制一个电脑及其屏幕上的汉字(我一位好友的外号),作用十分单一,画的结果也十分抽象,不是很理想,但是却能体现我刚学会后想要炫一手的激动心情。现在想起可能会有些尴尬,但这之中留存着我自己的回忆,我想让这段代码永远留存下去。
三&四天前:
我又学习了较长时间的慕课,并按照慕课内容编写了一些练习的代码,这里我上传一个经过我多次改进后十分精简的阿拉伯数字转中文的代码
print("转换开始:".center(30,"-")+"\n")
while True:
num=input("请输入数字:")
q,p,allstr=0,0,""
try:
numstr="零一二三四五六七八九"
for i in num:
allstr += numstr[eval(i)]
print("转换结果为:" + allstr)
except:
for i in num:
p += 1
if i not in ["0","1","2","3","4","5","6","7","8","9"]:
q +=1
print("第{}个字符格式错误".format(p))
print(">>>总计{}个错误".format(q))
print("\n"+"-"*35+"\n")
同时,我还翻看了之前借到的《笨 方 法 学 C》,在这本书中,我第一次听说了GitHub(虽然直到现在我还是搞不不太懂),它看起来像是一个可以上传代码的网站,但它又不止这么简单,有着各种各样的功能。但是很多事情好像只有一次和无数次之分,自从我第一次听说GitHub后,它又在B站教程,许多网站上被提及,这勾起了我的好奇心,我也在那一天注册了自己的专属账号。
两天前:
实际上,这一天的凌晨一点我并没有睡觉,因为我在改进我的一个代码,我也成功在网站上找到了将Python打包成exe文件的方法:Pyinstaller(这里有它的帮助文档)我要做这一切的目的是把我编好的一段代码发给我的同学让他运行一下。
这件事的起源是我在编写一个蒙特卡洛法计算圆周率的程序,我发现这个程序能占用我电脑30%的内存,我因此想到可以用这个程序测试一下我的好伙伴电脑的性能(通过比较运行时间),但是显然我不能直接把代码发过去,因为我朋友的电脑上并没有安装对应的编程环境,所以我想到了将Python打包成exe文件,最后我也成功将这个代码发了过去。但是为了包装我的代码,我还写了许多无关的东西,直到最后我也没有问我朋友它运行了多少秒。。。
#CalPi.py
from random import random
from time import perf_counter
import time
import turtle as tu
def turtlego():
tu.penup()
tu.goto(200,0)
tu.pendown()
tu.goto(-200,0)
tu.penup()
tu.goto(0,200)
tu.pendown()
tu.goto(0,-200)
tu.goto(0,-100)
tu.seth(0)
tu.circle(100,360)
tu.pencolor("red")
tu.penup()
tu.goto(0,0)
tu.pendown()
tu.goto(100,0)
tu.goto(100,100)
tu.goto(0,100)
tu.goto(0,0)
tu.penup()
tu.goto(0,0)
tu.pendown()
tu.pencolor("grey")
tu.pensize(3)
tu.fillcolor("grey")
tu.begin_fill()
tu.goto(100,0)
tu.seth(90)
tu.circle(100,90)
tu.goto(0,0)
tu.end_fill()
tu.goto(150,100)
tu.write("原理:在小正方形\n内随机撒点,\n落到四分之一圆\n内的概率为Pi/4",font=(16))
print("下面,我们要用Pyhon计算圆周率的近似值")
print("按回车键以继续……")
input()
print("蒙特卡洛法:\n在正方形内随机撒点,落在圆内的点除以落在\
正方形内的点,\n就约等于圆的\
面积除以正方形的面积 = π/4")
print("按回车键以查看图示")
input()
turtlego()
while True:
try:
DARTS = 1000*eval(input("下面,请输入撒点个数(X1000):"))
if DARTS >3001000:
print("太大了!太大了!你真的以为你自己的电脑是神威·太湖之光?")
continue
hits = 0.0
print("正在计算中…… (可按Ctrl+C强制中断计算)")
start = perf_counter()
print("已撒点数:")
for i in range(1,DARTS+1):
print("\r{}/{}".format(i,DARTS),end="")
x,y = random(),random()
dist = pow(x**2+y**2,0.5)
if dist <=1.0:
hits = hits +1
pi=4*(hits/DARTS)
print("\n圆周率值是:{}".format(pi))
print("运行时间是:{:.2f}s\n".format(perf_counter()-start))
except(SyntaxError):
print("\n----------------------------\n\
嘎成你按回车键按得这么欢喜!?\n\
你知不知道多按一下就会让程序错误然后闪退!\n\
害得我多写了这么一行代码以防万一\n----------------------------\n")
except(NameError):
print("\n不会吧不会吧,不会真的有人不输数字吧!?\n")
一天前:
有了给我朋友发程序的经验,我突然想到我可以给另一位朋友也编写一个程序,当做她的生日礼物,而这一切要在规定时间内完成,当然,这一次编写的程序绝不能像两天前一样只有一个黑不溜秋的控制台,我想要了解做出一个比较好看的界面,由此,我再次上网搜索,去图书馆查找相关书籍,经历了几个小时的搜寻,我决定仍然使用Python,而不是unity3D,Javascript之类,一来我的时间十分紧张,不足以学习一门新的语言,二来我已经对Python有所了解,最后,我决定使用Python的一个标准GUI库:tkinter。我还在当当云阅读上找的了相关的书籍。
另外,我也没有忘记观看慕课,我了解到了一种全新的函数递归方法,并编写了有关汉诺塔的程序:
#hanoi
count=0
from time import perf_counter
def hanoi(n,src,dst,mid):
global count
if n == 1:
print("{}:{}->{}".format(1,src,dst))
count +=1
else:
hanoi(n-1,src,mid,dst)
print("{}:{}->{}".format(n,src,dst))
count +=1
hanoi(n-1,mid,dst,src)
while True:
n=eval(input())
start=perf_counter()
hanoi(n,"A","B","C")
print(count)
print("用时:"+"{:.3f}".format(perf_counter()-start)+"s")
另外,这段慕课里还介绍了函数的复用,我也跟着教程编写了一个运用海龟绘图体系绘出用七段数码管表示当前日期的程序:
import turtle as tu
import time
def drawGap():
tu.penup()
tu.fd(5)
def drawLine(draw):
drawGap()
tu.pendown() if draw else tu.penup()
tu.fd(40)
drawGap()
tu.right(90)
def drawDigit(digit):
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
tu.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
tu.left(180)
tu.penup()
tu.fd(20)
def drawDate(date):
tu.pencolor("red")
for i in date:
if i =="-":
tu.write("年",font=("Arial",18,"normal"))
tu.pencolor("blue")
tu.fd(40)
elif i =="+":
tu.write("月",font=("Arial",18,"normal"))
tu.pencolor("green")
tu.fd(40)
elif i =="=":
tu.write("日",font=("Arial",18,"normal"))
else:
drawDigit(eval(i))
def main():
tu.setup(800,350,200,200)
tu.penup()
tu.fd(-300)
tu.pensize(5)
drawDate(time.strftime("%Y-%m+%d=",time.gmtime()))
tu.hideturtle()
tu.done()
main()
以上就是我的成果
今天:
今天,我开始了有关tkinter库的学习,这个库远比我想象中的复杂,但是要完成我的目标,我还是需要坚持不断的学下去。
创建一个居中的窗口:
from tkinter import *
from tkinter import ttk
win= Tk()
win.title("MyWindow")
screenWidth = win.winfo_screenwidth()
screenHeight = win.winfo_screenheight()
w = 600
h = 320
x = (screenWidth - w)/2
y = (screenHeight - h)*2/5
win.geometry("{}x{}+{:.0f}+{:.0f}".format(w,h,x,y))
win.configure(bg='white')
win.iconbitmap("xiaofan.ico")
win.mainloop()
现在我有了强大的工具,相信我也能完成我的计划
后记
至此,我已经写了近7000个字了,也为此花去了不少时间,我将我之前的编程之路记载下来,我不会忘记这些宝贵记忆,也希望我今后的道路能越走越宽广。