在学校的这几年,一直断断续续地在接触python,从一开始的分词作业到后来的话题发现,主要集中用python处理自然语言处理方面的问题。但是,后来又有一段时间集中精力专攻前端开发方面的程序问题。所以现在感觉自己整个编程体系都很混乱,每个部分都略懂一点,深感基础知识薄弱,故重新通过mooc网的视频教程温习了一遍python 基础入门知识,查漏补缺。本篇为学习Python基础入门知识课程的知识梳理和感受。
目前为止,主要划分为四个阶段。
(1)1946年-1981年, 计算机系统结构时代,这一阶段主要是解决计算能力问题
(2)1981年-2008年,网络和视窗时代,这一阶段主要是解决交互问题
(3)2008年-2016年,复杂信息系统时代,这一阶段主要是解决数据问题
(4)2016年-现在, 人工智能时代,这一阶段主要是解决人类的问题
第一次听到这个,就怀疑自己是否研究得走火入魔了,对于每个阶段解决的问题,会不自觉地跟学者的研究和互联网就业扯上关系。如交互问题联想到学者们研究用户行为,数据问题想到大数据处理的技术兴起和学者们提出对现有的非结构化数据高效处理的算法,人类的问题想到自然语言处理的应用如个性化推荐,决策,人机对话等等以及软件产品设计、设计心理学等等。最后,深深感慨,导师的眼界很宽广和深厚,一开始就定位在人的情感的最高点来指引我们。
其次是对于目前具有代表性的编程语言进行梳理。从学习内容,语言本质和解决问题三方面进行比较。
C 语言 | C++语言 | Java 语言 | Python 语言 | |
学习内容 | 指针,内存,数据类型 | 对象,多态,继承 | 对象,跨平台,运行时 | 编程逻辑,第三方库 |
语言本质 | 理解计算机系统结构 | 理解主客体关系 | 理解主客体关系 | 理解问题求解 |
解决问题 | 性能 | 大规模程序 |
跨平台 | 各类问题 |
此外,编程语言的发展主要经历了从机器语言(与CPU型号有关)→汇编语言(与CPU型号有关)→高级语言(与CPU型号无关)的过程。
若要立志作为一个程序员,不仅仅掌握一门语言即可,应该根据实际问题和需求,掌握多种语言。我认为编程语言仅仅是工具,最重要的是选择一种最快捷和有效的方法解决当前所面对的问题,达到最终的目的。
人类的思维主要分为三种:
(1)逻辑思维:推理和演绎,以数学为代表
(2)实证思维:实验与验证,以物理为代表,
(3)计算思维:设计和构造,以计算机为代表,表现在抽象和自动化,主要通过编程的方式实现。
我认为,这三种思维并不是相互独立的,而是相辅相成的。从问题研究的角度,我们需要逻辑推理和实证思维,同时在实证过程中也需要计算思维来帮助我们快速的解决实际的现实问题。
(1)IPO程序设计模式
IPO = Input , Process ,Output
(2)模块化设计模式
紧耦合、松耦合
(3)配置化设计模式
引擎+配置,关键在于接口设计
(1)定义和特征:
以开源项目为组织形式,主要特征为①竞争发展 ②相互依存 ③快速更迭
(2)典型的开源运动:
① 1983年 Richard ,GNU项目,GNU通用许可协议
② 1991年Linus Torvalds 发布Linux 内核
③ 1998年 网景浏览器开源,Mozailia
(3)计算生态的价值——创新
跟随创新,集成创新,原始创新
站在巨人的肩膀上,编程的起点是系统
我学习完了这一章节,终于得到了刚上研究生时一脸懵逼的问同学开源软件是什么东西的问题的答案,自我感动ing。
Python基础知识入门(语言特点,数据类型,基本语句,函数定义,文件操作)→ Python 函数式编程 → Python进阶语法 → Python 高级语法
所以学完基础知识入门加上基础的python 代码小demo 练习后,下一阶段就是学习Python 面向对象的编程,理解class 定义类,还有程序设计时各个模块之间的关系以及一些代码小细节之间的差异。
(1)整数
整数表示方式 | 示例 |
十进制 | |
二进制 | 0b |
八进制 | 0o |
十六进制 | 0x |
(2)浮点数
浮点数间运算存在不确定尾数的现象,不是bug。这是因为在计算机中的二进制与十进制并不是一一对应,53位二进制表示小数部分。
浮点数间运算及比较用round()函数辅助。
(3)字符串
①字符串处理方法
序号 | 名称 | 用法 |
1 | lower() | str.lower() 将字符串转换为小写 |
2 | upper() | str.upper() 将字符串转换为大写 |
3 | split() | str.split("b") 根据b分割字符串str,返回列表格式的数据。 |
4 | count() | str.count(sub) 统计str字符串中,子字符串sub出现的次数 |
5 | replace() | str.replace(old,new) 把str 字符串中的old 字符串替换为new字符串 |
6 | center() | str.center(width) 把str 原字符串居中显示 |
7 | strip() | str.strip() 默认删除字符串两端的空格字符 |
8 | join() | str.join(sequence) 将字符串sequence以指定的字符str连接成新的字符串 |
② 字符串处理函数
序号 | 名称 | 用法 |
1 | ord() | ord(str) 。unicode 编码,将一个字符转换Unicode编码 |
2 | chr() | chr(i) 。unicode 编码,将一个整数转换为一个字符 |
3 | format() | "{:}".format() 字符串格式化 |
(1)集合类型
① 集合定义:set()
② 集合操作符:S|T , S-T, S&T,S^T
③ 集合处理方法:
序号 | 名称 | 用法 |
1 | S.discard(x) | 移除集合S中的指定元素x,若x 不存在集合S中,不会发生错误 |
2 | S.remove(x) | 移除集合S中的指定元素x,若x 不存在于集合S中,会发生错误 |
④ 集合中的元素是不可改变的,且每个元素都是基本元素,集合类型数据的应用场景在于:
数据去重 AND 包含比较
(2)序列类型
①序列类型数据的具体形式:
字符串:定义string
元组:定义 turple() 或逗号分隔的多种元素,其中的元素值不发生改变
列表:定义[] 或 list(), 列表类型的数据在Python 中应用较为广泛,需重点掌握其相关方法
② 序列类型数据的应用场景:
数据表示 AND 数据保护
(3)字典类型
① 字典定义:字典类型的数据是一种映射,键(索引)和值(数据)的对应,dic() 或 {} 创建,键值对间无序
② 字典操作方法:
序号 | 名称 | 用法 |
1 | d.get(k, |
若键k存在,返回相应值;不存在则返回default值 |
2 | d.pop(k, |
删除字典d中,键值为k的数据,并返回删除的数据;若不存在k 则返回default 值 |
具体应用:词频统计
#元素遍历,统计每个词和词的出现次数时,使用count={}的字典存储计数,words为待统计的字符串列表
count = {}
for word in words:
count[word] = count.get(word,0) + 1
③ 字典类型数据的应用场景:
映射的表达 AND 元素遍历
(1)循环语句:
break 只能跳出一层循环
循环语句+else ,若是循环语句中没有break 语句,循环结束后使用else
(2)条件语句
(1)函数的参数
① 可选参数传递
def <函数名> (<非可选参数>,<可选参数>):
<函数体>
return <返回值>
#例如:def fact(n,m=1)
②可变参数传递(不确定参数总数量)
def <函数名> (<参数>,*b):
<函数体>
return <返回值>
(2)参数传递的方式
① 按位置传递 ②按名称传递
(3)函数的返回值
a,b,c = fact(10,1) 可以一次性返回多个值
(4)函数中的变量
①局部变量与全局变量不同,即使名称相同,其变量也不同
②局部变量为组合数据类型且未创建,等同于全局变量
(5)返回函数的匿名函数
lambda 函数:
<函数名> = lambda<参数>:<表达式> 其具有固定使用方式
(6)函数的思维
① 模块化思维
② 规则化思维
③ 化繁为简
(1)代码复用的方式
代码复用的方式主要是通过函数和对象即:① 代码资源化 ②代码抽象化 ③代码模块化
其中模块化设计:①紧耦合 ②松耦合
(2)函数递归
能够递归的函数主要包括两个特征:
①链条
②基例:存在一个或多个不需要再次递归的基例
函数递归通常表示为函数+分支语句的形式
(1)文件类型:文本文件,二进制文件
(2)文件处理的步骤:
打开 → 操作 → 关闭
文件在“存储状态” 和 “占有状态” 两者之间进行切换。
#文件打开
#文件名:文件路径+名称
<变量名> = open(<文件名>,<打开模式>)
#文件关闭
<变量名>.close()
序号 | 打开模式名称 | 含义 |
1 | “r” | 只读模式打开 |
2 | “w” | 覆盖写的模式打开 |
3 | “a” | 追加写的模式打开 |
4 | “x” | 创建写的模式打开 |
5 | “b” | 二进制文件打开 |
6 | “t” | 文本模式文件打开 |
7 | “+” | 原功能基础上增加功能 |
(3)文件操作函数
序号 | 函数 | 含义 |
文件读取 | 读取全部文本 | |
每次读取一行文件 | ||
一次读取整个文件,将文件分成一个行的列表 | ||
文件写入 | s为字符串或者字节流 | |
lines的类型为列表 | ||
f辅助写入文件,改变当前文件操作指针的位置,其中offset 取值 0 为文件开头,1为当前位置,3为文件结尾 |
# 该示例为.seek(offset)的用法
fo = open("output.txt","w+")
ls = ["中国","法国","美国"]
fo.wirtelines(ls)
fo.seek(0) # 若是无这行代码,print 无输出
for line in fo :
print(line)
fo.close
(1)数据组织的形式:
“维度”。一维,二维
高维数据仅利用最基本的二元关系展示数据间的复杂结构,如“键值对”
(2)数据的操作周期
存储 → 表示 → 操作
其中存储的方式有① 空格分割存储 ② 逗号分割存储 ③ 其他方式如采用特殊符号存储
二维数据采用列表类型。
(1)Python社区,第三方库检索
Python社区提供了大量的第三方库,其网址:https://pypi.org/
(2)安装第三方库的方法
① pip 方法
在系统的cmd命令行输入“pip install “第三方库名” ” 即可,此方法需要联网安装,故
② 集成方法
安装Anaconda 软件,一键安装,基本的数据处理需要的第三方库都具备完整,不需要自己再逐个安装
③文件安装方法
UCI ,直接在Python社区里下载第三方库的文件,点击安装。
(1)time 库
time库常用来计时,比较不同算法时间,统计部分程序运行时间。也可应用于进度条展示。
序号 | 函数 | 含义 |
1 |
time() | 1970年1月1日-现在 以秒为单位的数值 |
2 | ctime() | 易读的方式返回字符串 |
3 | gmtime() | 计算机可读 |
4 | strftime() | time.strftime("%Y-%M-%D",t) 时间格式化 |
5 | strptime() | time.strptime("t","%Y-%M-%D") 把一个字符串解析为时间元组 |
6 | pef_counter() | 减法操作,程序计时 |
7 | sleep() | time.sleep(t) 推迟调用线程的运行 |
(2)random库
产生随机数的标准库,伪随机序列
序号 | 函数 | 含义 |
1 | seed() | 随机数种子,默认是当前系统时间。random.seed(10) |
2 | random() | 随机数,每次产生的序列都不一样。random.random() |
3 | choice(s) | 从序列中随机选取一个元素 |
4 | shuffle(s) | 将序列s中的元素随机排列,返回打乱后的序列 |
(3)pyInstaller库
将py源代码转换为可执行文件。
cmd 命令行: pyinstaller -F (文件名,py)
(4)os 库
python标准库,通用的、基本的操作系统交互功能
os.path 路径管理
os.system 进程管理 和 环境参数
(1)Web解析到网络空间
① Web 爬虫:Requests,Scrapy, pyspider
② Web 信息提取:Beatiful Soup,Re,Python-Goose
③ Web 网站开发:Django ,Pyramid ,Flask
④ 网络应用开发: WeRoBot ,aip(百度AI开放平台接口),MyQR 生成二维码
(2)数据分析和挖掘
数据表示→数据清洗→数据统计→数据可视化→数据挖掘→人工智能
① 数据分析:Numpy ,Pandas,Scipy
② 数据可视化:Matplotlib ,Seaborn ,Mayavi
③ 文本处理:PyPDF2,NLTK,Python-docx
④ 机器学习:Scikit-learn,Tensorflow ,MxNet
(3)从人机交互到艺术设计
① 图形用户界面:PyQt5,wxPython,PyGobject
② 游戏开发:PyGame,Panda3D,cocos2d
③ 图形艺术:Quads,ascii_art ,turtle