Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 14

哈 尔 滨 工 程 大 学

本科生实习笔记

实习名称: 毕业实习

课程编号: 01411242

学 院: 物理与光电工程学院

专 业: 陈赓班

班 级: 20170001

学生姓名: 陈博文

学 号: 2017112101

指导教师: 孟召民,褚祥华

第1天
第一天上午孟老师和花姐先都做了自我介绍,对这次实习的内容和目标
做了一些概述性的讲解。然后孟老师开始教我们安装 Python、Pycharm 以及
一些简单的 Python 命令包括如何从清华镜像站安装 Python 包以及运行项目等
等。在这个过程中我领悟到干任何一件事情都需要细心、注意细节,因为有
同学在安装的过程中进行改写操作时有的不小心使用了中文标点符号或者是
选择错了文件,而这些只要足够细心是能够避免或者快速成功地检查出来并
加以改正的。
下午也花了少许的时间讲解剩下的安装过程,孟老师很认真负责同时也
很循循善诱。当同学遇到无法解决的问题时,他会同意远程登录同学的电脑
进行问题排查,但是当他发现问题时,他并不会立即帮助他改正过来或是直
接告诉它问题所在,而是提醒同学他之前讲的要点,要同学自己先检查检查
哪里没有做好。大部分同学最后都能发现自己的问题并自行改正,但若实在
找不出问题所在,孟老师也会细心告诉同学并协助改正。
终于将 Python 和 Pycharm 安装的问题解决好之后,孟老师就开始教我们
一些 Python 的基本命令和代码格式:在 cmd 窗口输入 Python 可以进入 Python
命令行,就可以直接执行一系列 Python 指令了;Python 变量不需要声明,第
一次使用时就会自动创建,这一点和 matlab 和 mathematica 是一样的;Python
中有 6 大种数据类型依次是数字、字符串、列表、元组、字典、集合;数字
直接使用,使用“=”进行赋值,有整型、布尔型、双精度浮点型、十进制浮
点型、复数;字符串是由独立的字符组成的,并且这些字符可以通过切片操
作顺序地访问,Python 里面通过在引号间包含字符的方式创建字符串,单引
号和双引号的作用是相同的;列表像字符串类型一样,列表类型也是序列式
的数据类型,字符串只能由字符组成,而且是不可变的,而列表则是能保留
任意数目的 Python 对象的灵活的容器。
第2天
第二天孟老师接着讲 Python 的 6 种数据类型,并教授了我们一些技巧性
的代码写法来简洁化程序。首先是序列解包,使用逗号来分隔不同的变量和
不同变量所赋的值如:name,age=’somebody’,20。或者使用链式命名法来
给多给变量赋相同的值如:name=user=’somebody’。然后是数字的一些特
殊操作如取整:num1//nm2,取模:num1%num2,幂运算:num4**num5 等等。
然后开始将字符串的操作。首先讲了打印字符串的函数“print()”接受
一个字符串变量在命令行输出字符串。如果字符串要带入一些变量的值,和
c 语 言 类 似 的 使 用 “ %” 来 表 示 , 并 在 其 后 提 供 字 符 串 中 的 值 , 如 若
name=’somebody’,age=20,则代码:
str=’My name is %s and I am %d years old.’ % (name, age)
print(str)
将会在命令行输出文字:My name is somebody and I am 20 years old.
列表的切片使用中括号,列表的索引从 0 开始,’:’代表“从…到
…”,但是是一个前闭后开的区间。如 str=’abcdefg’,则 str[1:4]的值
为‘bcd’。中括号内如果出现两个“:”,则第二个冒号后面的数值表示步
长,例如 str[0::1]输出‘aceg’。’len()’函数返回输入参数中的列表的
长度,如 len(str)输出 7。‘count’函数是字符串类的非静态方法,用来返
回 指 定 的 字 符 出 现 的 次 数 。 如 str2=‘asdfgasdfgzxcvb’ 则
str2.count(‘s’)的值为 2。‘find()’函数返回第一次出现指定字符的索
引,如果没有出现过则返回-1。’split()’函数非静态方法,将字符串按照
指定的字符为分隔标记分割字符串并返回切割过的字符串列
表 。 ’ replace()’ 也 是 一 个 非 静 态 方 法 , 第 一 个 参 数 是 要 识 别 的 字 符
( 串 ) , 第 二 个 参 数 是 要 被 替 换 成 的 字 符 ( 串 ) 。 如
str2.replace(‘h’,’j’)把 str2 中的所有’h’换成’j’。’strip()’
方法把字符串首尾的所有空额去掉,而使用方法 replace(‘ ’,‘’)可以
去除掉字符串内的所有空格。
第3天
孟老师今天还讲了一些列表的知识。方法 list()可以返回一个空的列表,
一般用于初始化一个列表。append()用于向一个列表末尾追加内容,insert()用
于向指定的指标位置添加一个元素。对于一个列表,使用非静态方法 join()可
以 使 用 指 定 的 字 符 将 列 表 元 素 连 接 成 字 符 串 。 如
str=[‘a’,’s’,’d’,’f’,’g’,’h’,’j’,’k’,’l’] , 则 ’ #’.join(str) 得 到 结 果
‘a#s#d#f#g#h#j#k#l’。方法 sort()是列表类的非静态方法,不接受参数,可以
把列表内的元素按照字典顺序进行排列并覆盖原来的列表。如 str.sort()后 str
就变成了一个遵循字典顺序的列表。
今天还讲了元组这种数据结构。元组和列表的区别不大,元组类型在很
多操作上都跟列表一样,许多用在列表上的例子在元组上照样能行得通。它
们的主要不同在于元组是不可变的,或者说是只读的,所以那些用于更新列
表的操作,比如用切片操作来更新一部分元素的操作,就不能用于元组类
型。使用方法 list()可以把一个元组变成一个列表。元组的元素用逗号隔开并
用小括号包围起来;元组的元素也可以是一个子元组,且每一个作为另一个
元 组 的 父 元 组 的 元 素 之 前 的 维 度 可 以 有 区 别 , 比 如 tuple=((1,2),(1,2,3),
(1,2,3,4),(1,2,3,4,5))是可以作为一个元组的。访问元组或对元组切片同样使用
中括号,对于访问元组内的元组的元素,使用两个中括号各自包含各层的索
引即可。如 tuple[2][3]的值为 4。
今天花姐讲了一些和求职、个人简历有关的内容。花姐讲了一些她个人
的经历,希望对于我们的职业生涯起到一定的指导作用。对于面试,花姐讲
了面试要干什么:自我介绍,要打文字稿(大约三分钟)守时很重要。个人
简历里要包括名字学校专业 研究的最深最擅长的东西,和工作相关的东西;
组织的活动、社团、志愿者;性格;实事求是、诚实、带着面试官的节奏;
获奖一定要说,挑最闪亮的说,不能过于冗长,应届毕业生这个信息一定要
说;个性中最积极的部分;兴趣爱好;研究的最深的领域;最擅长什么;未
来两年的规划。
第4天
孟老师首先讲了字典这种数据结构。字典包含一些键值对,一个键值对
包含键和值,他们用冒号隔开。键相当于列表的索引,只不过列表是有顺序
的,使用数字来索引元素,元素自动按照赋值时的顺序或使用 append 方法得
到的顺序进行索引,而字典可以按照键的名字进行索引和筛选操作。字典的
数据存储方式和数据库类似,每一条数据都是键值对。字典的值的类型没有
限制。如:dict={‘name’: ‘somebody’, ‘age’: 25}。访问字典元素时使用键进行
索引,并且和列表和元组一样使用中括号来 访问,如 dict[‘name’]的值为
‘somebody’。list()函数同样可以用来对字典进行操作,但只能单独挑出键进
行 操 作 或 单 独 挑 出 值 进 行 操 作 。 如 list(dict.keys()) 得 到 的 结 果 为 [‘name’,
‘age’],list(dict.values())得到的结果为[‘somebody’, 21]。
老师还讲了讲遍历列表/元组/字典的方式。以列表举例来说,使用“for…
in…”来遍历列表的所有元素。如 list 是一个列表,则:
for i in list:
print(i,end='')
打印出的时 list 所有元素的值并且相互之间没有任何字符隔开。
print([2*i for i in range(51)])
打印出 100 以内的所有偶数值。这里值得注意的是 range()方法。Range()返回
一个列表。range(a,b)返回左闭右开区间[a,b)内的所有整数值组成的列表,而
range(c)返回所有[0,c)内的所有整数值组成的列表。enumerate(list)返回一个字
典,键值对包含列表索引和对应索引的元素值。对于字典,同样可以使用这
种方法来遍历。如按照上文对 dict 的赋值,
for i,j in dict:
print(i, end=’:’)
print(j, end=’\n’)
将会输出如下内容:
name:somebody
age:25
第5天
孟老师讲完了 Python 的数据类型,今天给我们讲方法。首先包是用来存
放类的,类里有变量和方法。静态方法不需要实例只需要通过类名进行调用
就可以,而非静态方法需要用到类里的变量信息,需要自己先通过类创建一
个对应类的实例,再通过实例访问类里定义的方法,在此之前可能需要定义
类里的一些数据和配置来指导方法的行为(大部分方法为静态方法,通过方
法输入参数来指导方法的行为)。然后讲了怎样自己写一个方法,方法是为
了简洁化主程序而存在的,当一个模块的代码再主程序里需要反复出现时,
使用方法来封装一段代码是合适的。方法,以及其他各种模块如分支判断、
循环、异常等的开始和结束在 Python 中都是以缩进来和其他模块或主程序区
分开来的,在一个模块中的每行代码顶头不能超过模块第一行的缩进距离,
否则 Python 认为模块结束而退出到外面一层中。方法的定义格式为“def [方
法名] (attr1,attr2,…):”,如下面的方法答应传入参数中的字符串:
def print_string(str):
print(str)
print_string(‘I am 30 years old’)
通过缩进看出,第三行已经不属于方法模块,所以是主程序的运行指令。这
个例子会在命令行打印‘I am 30 years old’这句话。
当然方法也可以具有返回值,而这是不需要在声明方法名时加以说明
的,而是直接在方法模块内使用 return 返回数据。在使用方法的时候也需要
注意方法是否有返回值以及返回数据的类型。如下面的方法返回列表内所有
数字的和与积:
def sum_and_product(list):
sum=0
product=1
for x in list:
sum=sum+x
product=product*x
return {'sum': sum, 'product': product}
print(sum_and_product([1,2,3,4,5,6,7,8,9,10]))
第6天
今天孟老师先讲了讲方法传递参数的一些特殊形式。首先是传入元组的
方法,方法声明时使用‘*’来表明一个不定长度的元组如 def func(*arg)。在
调用方法时输入参数使用逗号隔开如 func(1,2,3,4,5),在方法内部,arg 是一个
元组,通过获取 arg 的长度或使用‘for…in…’循环可以实现方法不定个数参
数的输入和处理。方法还可以输入字典,用格式 def func(**arg)来表示。调用
方法时格式为 func(arg1=…,arg2=…,…),在方法内部获取需要的属性时可以
按照字典的访问来获取需要的信息。这种方法很适用于含有默认属性并允许
缺省调用的方法,如一个方法对数据点进行插值,默认使用三次样条插值,
输入参数没有说明插值方法时使用三次样条,而如果传入字典中的‘ method’
键的值不为空,而是比如‘Lagrange’,则方法内部进行识别后改用拉格朗日
插值法而不使用默认的三次样条。
随后老师还讲了一些 Python 的文件操作。文件操作的流程一般为打开文
件,得到文件句柄并赋值给一个变量;通过句柄对文件进行操作,一般是读
写文件数据;关闭文件。‘open()’函数打开一个文件,调用方法为:文件句
柄 = open('文件路径', '模式',编码方式),编码方式可以是缺省的,文件路径
若没有全路径则指程序文件所在的目录,当然也可以使用全路径,模式有
r、w、a、r+、w+和 a+六种,以此代表只读、覆盖并只写、只写、读写、读
写、读写。读文件可以使用‘read()’、‘readline()’、‘readlines()’等方法,依
此代表读取整个文件、读取一行和读取整个文件并按照行分隔开;写入文件
有 ‘ write()’ 、 ‘ writelines()’ 函 数 , write 只 能 一 次 性 写 入 一 个 字 符 而
writelines 可以写入一个字符也可以写入字符串;关闭文件是必要的,以避免
占用系统资源或将重要数据暴露在不稳定因素中,关闭文件使用 close()函
数 , 当 然 为 了 避 免 文 件 由 于 疏 忽 未 关 闭 , 可 以 使 用 ‘ with open(…) as
file_handle’语句打开文件,一旦代码离开这个代码模块文件会自动释放。
第7天
从今天开始老师开始教我们使用 django 进行网页设计,这包括前台、后
台的设计。Django 作为 Python 的包很大程度上允许用户使用一些 Python 代码
来处理后台应用,而不用学习很多种不同的后台处理语言,非常方便。首先
老师讲了怎么在 Pycharm 里面创建一个使用 Python3.7 作为解释器的 django 项
目。创建好项目后通过运行指令‘Python manage.py runserver’来运行项目。
运行项目后访问得到的地址访问根目录以及管理员目录,一个 django 项目就
算是创建好了。
之后老师给我们讲了项目中一些重要的文件的内容和意义是什
么 。 __init__.py 是 变 成 包 用 的 , settings.py 是 配 置 文 件 , urls.py 是 路
由,wsgi.py 是启动程序,templates 是网页模板,manage.py 是管理器,里面
包含了运行项目的入口和创建网站应用的方法。老师重点讲了 settings.py 中
的一些代码的意思以及我们可以如何进行改变,其中 INSTALLED_APPS 包
含了为这个项目安装的应用,创建项目时默认的一些是为了支持 django 项目
的运行而包含的,也可以包含使用 manage.py 中的方法 startapp 传入 app 名创
建 的 自 己 的 app , 只 需 要 在 模 块 的 末 尾 加 上 自 己 的 app 的 名 字 就 可 以
了。urls.py 最主要的作用就是为网站路径注册对应的接口,格式固定,这个
方法必须接受一个 request 变量并返回由 JsonResponse 返回的 Python 字典类型
的数据或者由 render 返回的渲染后的网页数据。一般来说实现一个网站的一
项功能使用一个应用来承接,不同功能放在不同的应用内,以实现条理清晰
的目的。一般这个方法放在应用的 views.py 文件中。
除此之外,还讲了 settings 中其他设置的含义。‘ALLOWED_HOSTS’表
示允许访问后台的用户,‘*’表示所有用户都不受限制。‘SECRET_KEY’是
网站安全里一个加密密匙,‘DEBUG’表示是否开启调试模式,布尔类型。
‘MIDDLEWARE’表示项目运行所需要的中间件。‘DATABASES’表示项目
中使用的数据库,有一些类型:sqlite3 本地的文件数据库、mysql 开源数据库
先 属 于 甲 骨 文 、 sqlserver 微 软 数 据 库 、 oracle 企 业 级 数 据 库 。
‘LANGUAGE_CODE’用来表示是使用那个的语言以及对应的语言编码。
‘TIME_ZONE’是使用的时区时间。‘USE_I18N’表示国际化。
第8天
今天老师开始教我们设计网页前端,也就是网页的设计和美化。设计网
站和用户的交互界面使用 html 语言。html 是标签语言,是一种用于创建网页
的标准标记语言。我们可以使用 HTML 来建立自己的 WEB 站点,HTML 运行
在浏览器上,由浏览器来解析,因此,在设计前台的过程中除了 Pycharm 是
我们的强有力的编辑工具,浏览器也是我们不可或缺的测试和调整工具。老
师要我们使用 chrome 浏览器并下载了 JSON Viewer 插件,用来有条理、美观
地展示得到的 Json 数据。
老师首先告诉我们了一些常用的 html 标签,比如表格<table></table>、
表行<td></td>、表元素<tr></tr>、空格&nbsp;、表单<form></form>(在
input 标签里也可以实现表单)、输入<input></input>(有很多种‘type’
如 button、text 等)、文本区域<textarea></textarea>、图片<img>、网页
本体<body></body>、网页地标题<title></title>、超链接<a href=””>、
网页头部,包含一些配置信息<head></head>、换行<br>、段落<p></p>、无
序 列 表
<ul></ul>、<h1></h1><h2></h2><h3></h3><h4></h4><h5></h5><h6></h6>分
别是一级标题、二级标题、三级标题、四级标题、五级标题、六级标题,级
数越大字号越小。老师还教我们了如何简单的控制标签的属性,如改变颜色
是 background 属性,改变尺寸寸分别用 width 和 height 来控制组建的宽和
高 , font-size 控 制 字 号 大 小 , font-weight 控 制 加 粗 程 度 如 bold 是 加
粗,font-style 控制字体样式如 italic 是斜体,font-family 控制字体型号
如 Aria、Book Antiqua 等等。这些属性直接添加在标签开头标签名后面,不
同属性之间用空格隔开,当然这只是简单的属性控制,有很多元素很多属性
是没有的。
然后老师给我们讲了一个很重要的模型即盒子模型<div></div>。盒子模
型让网页的布局变得井井有条,对于各个组件相对于屏幕左端、上端、右端
和下端地绝对位置和组件与组件间、盒子与盒子间以及盒子与组件间地相对
位置,使用盒子模型也使得这一切变得精确美观,最重要的是对组件地分组
使得在窗口大小可变的情况下各个功能组的组织仍然能保持紧密联系和完
整。
第9天
老师先讲了盒子模型,然后给我们讲了 css 的作用和用法。首先盒模型主
要定义四个区域:内容(content)、内边距(padding)、边框(border)和外边
距(margin)。一些基本元素如 p、h1~h6、br、div、li、ul、img 可以被细分
为 顶 级 (top-level) 元 素 、 块 级 (block-level) 元 素 和 内 联 (inline) 元
素 。 margin 包 括 margin-top 、 margin-right 、 margin-bottom 、 margin-
left,控制块级元素之间的距离,它们是透明不可见的,根据上、 右、下、
左 的 顺 时 针 规 则 。 Padding 包 括 padding-top 、 padding-right 、 padding-
bottom、padding-left,控制块级元素内部 ,content 与 border 之间的距
离。不同的盒子之间的排列默认是垂直向下排列的,除非将盒子的 float 属
性改为 left 或 right 以横向排列,同时盒子的宽度不能过大。盒子的使用是
一个从摸索到熟练的过程,大部分时候并不知道 margin、padding 到底有什
么区别,只有不断地尝试,在失败中找到经验得到体会才能将盒模型用好,
这在上课的百度网页仿照制作的过程中深有体会,同时也体会到浏览器是一
个很好的实验工具,特别是对于网页的外观设计来说尤其是如此。同时在浏
览器的检查功能中也有一些小技巧可以帮助我们设计平衡美观的网页布局。
后 来 讲 了 CSS 的 使 用 , CSS 说 到 底 是 所 有 标 签 的 一 个 属 性 , 名 为
‘style’,通过 style 可以在标签内部进行样式设计,style 后面用等号连
接其 CSS 代码,用双引号包含 CSS 代码,CSS 代码中每一条属性都遵循“属性
名:属性值”的格式,不同的属性之间使用分号隔开,这一点和直接在组件
标签内直接控制属性是不一样的(直接用标签属性时使用等号连接属性和属
性值,空格隔开不同的属性,且文字类型的属性值需要使用双引号包含起
来)。除了在标签内使用 CSS 控制属性,也可以使用 id 或 class 来控制。若
一个标签有一个属性叫 id=”name”,则想要控制它的属性,可以在<head>
标签内部增加一个<style></style>标签,标签内部使用 id 检索标签添加 CSS
代码改变标签属性,如:
#name{
width:300px;
height:200px;}
可以将这个组件的宽和高分别设定为 300 像素和 200 像素。同样的,组件还
可以通过 class 分类进行样式设计。如有两个图片标签在一个盒子内:
<div>
<img src="1.png" alt="" class="pic">
<img src="2.png" alt="" class="pic">
</div>
它们的 class 属性都叫“pic”,如果在<head>中添加如下:
<style>
.pic{
width: 30%;
height: auto;
float: left;
}
</style>
则这两张图片的宽度都会被设置成网页显示的窗口的宽度的 30%,高度以图
片的长宽比固定的原则进行自动设置并且他们会横向排列起来。需要注意的
是如果宽度设置成 60%那么他们是不会横向排列的,因为窗口并不能容下两
张宽度都大于窗口宽度一半的组件并排排列,所以会自动换行排列。

第 10 天
今天讲了 jquery 的简单使用和使用 echarts 进行数据可视化的基本操作。
首先 jquery 的内核并不像 javascript 那样被集成到了 Python 中,所以要使用
jquery 需 要 从 网 络 上 包 含 它 的 包 , 方 法 是 在 <head></head> 内 包 含 <script
src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 。 包 含
后要写入 jquery 代码时必须要在<body></body>之外加入标签<script></script>
其内可以包含 jquery 代码。要使用 echarts 网站上的数据可视化模型,必须使
用 ajax 进行参数设置和传递,并将本地的图表用传回的数据进行更新。
关于 echarts,首先一个 echarts 对象必须用一个盒子承接,任何形式的图
表 都 必 须 放 在 一 个 <div> 内 , 在 jquery 中 使 用 var
myChart=echarts.init(document.getElementById('name'))来初始化一个 echarts 图
表并制定它的容器为一个 id 为 name 的 div 中,其中这个 div 必须在前面
<body></body>中已经出现并拥有 id 为 name。接下来的操作应该使用 ajax 完
成。在 jquery 中$.ajax 标志着代码的开始,里面的代码块以花括号包含,其中
有几个属性:url 表示图表接收数据的来源,这个路径应该是在 urls.py 中注册
过的网页路径而不是文件路径或包中方法的路径,当然这个路由应该指向一
个 使 用 JsonResponse 返 回 Python 对 象 的 方 法 , 如 惯 例 , 仍 然 默 认 写 在
views.py 里。对于实现 echarts 的 ajax 代码,最终需要的数据类型一般为列
表,但结构由具体的 echarts 类型决定,如在折线图、柱状图等图形里,需要
的数据类型是单独的 x 轴数据的一维列表和 y 轴的一维列表,折线图和柱状
图的类型分别为“line”和“bar”,这些出现在 option 的 series 里的每一个 y 轴
数据的模块中,模块中包含图形的名字、数据来源、类型等。option 是最后
更新 echarts 的关键,相当于一个缺省的配置包。y 轴数据类型在有些图表类
型中并不是简单的列表,比如在饼状图(类型为“pie”)中数据类型为以字典
为元素的列表,每个字典代表饼状图的一块,这个字典包含两个字段分别是
块的名字“name”和块的数值“value”(饼状图的 echarts 会自动计算所有块的
数量占总量的百分比并在最终图形中以百分比显示)。当所有数据和选项都
配置好以后,就可以使用 echarts 的方法 setOption 传入写好的 option 为参数来
绘 制 或 更 新 放 在 某 个 div 里 的 echarts 对 象 了 。 需 要 注 意 的 是 放 在
<script></script>里的代码若无特殊情况只会执行一次,因此即便设置 div 的尺
寸可以随网页窗口的大小动态变化,div 里的 echarts 而不会随窗口大小的变
化而动态重新绘制,造成图表在窗口变化后可能显示不全或者相互重叠。
今天课程就结束了,带着对老师、对这门课本身的恋恋不舍的心情,我
们和老师说了再见。十天过得真快啊,虽然每天都要早起上课,有时候晚上
还要写写日报,但总的来说这十天过得非常充实,学到了很多计算机方面的
和工作、社会方面的很多知识,课上也欢声笑语,是一次很不错的实习经
历,必定终生难忘。

You might also like