python重拾
python重拾
为什么要学习python呢?对于我个人来说,我是一个java程序员,java在各个领域实际上都有一点的应用,但是java的语法实在不是现在的高效的编程语法.另外对于我的个人发展来说,我是以java后端为基础,走spark大数据处理的工作领域,另外可以通过python更深入学习spark,而且python是当下最火的编程语言,在人工智能领域用处很多,而且我也很作就学习过python,两次了!加上这一次就是三次学习python了,学一个东西如果真的不长期坚持,那么忘了就相当于没学,拜拜浪费很多时间.这次我给自己定的学习python的时间很长,我最好把python的基础打牢,在实际应用中也要经常使用,这样才能符合我对python重拾的期望.
这次python的学习主要是根据书籍<<python编程:从入门到实践>>
这本书也是我的老朋友了,之前就看过这一本书
基本知识
这一部分的知识基本就是任何编程语言几乎都差不多的基础部分,虽然可能在语法上不同,但是这些编程概念都是相同的,都有变量,都有类型,都有函数,都有分支结构…
重点需要了解的是其语法的不同
了解python语言的特点是学习基本只是部分的重点,了解了语言的特点那么许多奇怪的语法就都可以联系在一起并能够解释成容易理解的东西了
python环境
在我之前学习python的过程中始终没有弄明白,python版本和python解释器的问题,我写的python代码隔一时间就会无法运行,什么原因?
python环境下载地址:https://mirrors.huaweicloud.com/python/
注意这个链接不能直接打开,打开浏览器复制到地址栏才不会被拦截.
安装windows版本的python安装包
需要添加环境变量两个:
- python主目录下
- python主目录下的scripts目录,里面有一些可执行文件例如pipe
python 语法
模块和包
了解这一块,就能够知道,第三方库,或者python内置库如何使用,出现问题怎么解决
在python中,每一个py文件就是一个模块,每一个文件天然就是一个命名空间单位域
所以在python中,模块是最小的单位
目录作为包,python会检索一个目录,如果这个目录中;包含一个__init__.py的文件,那么python就认为这是一个python包,如果没有这个模块,那么这个目录就是一个普通的目录
__init__.py的文件实际上是作为包的初始化程序,当使用import等语句导入包中的模块的时候,会自动先调取这个模块运行之后再去导入模块
导入语句
import module[,module1[…]]
实际上python导入模块只会将模块导入一次,如果重复导入实际上只是引用之前导入的模块
还有一些变种
import package.module as nickname
可以为模块起一个别名,这样引用模块中的某些变量函数的时候不需要这么长的全路径名
from … import语句
更细粒度的导入某个模块中的某个函数
from module import name1[,name2[,…]]
导入的实际操作
导入模块时,python会从程序的根目录开始->环境变量设置的目录->标准库的目录->任何能找到的.pth文件的内容作为路径去找->第三方扩展的site-package目录
在导入一个包的时候,python会先导入该包的__init__文件,进行包的初始化,然后再导入包中的具体模块
如果导入的模块就是__init__模块,那么这个模块会被执行两次
如果想要添加搜索路径
- 临时添加
可以通过sys模块(python内置模块,import会使用这个模块),使用sys模块的append和remove方法可以临时添加搜索路径
- 永久添加搜索路径
可以在python安装目录下lib\site-packages目录下创建一个.pth文件,文件中写明搜索路径即可,搜索路径一定要真实存在
导入规范
应该按照从通用到特殊的导入顺序分组,再来按照英文字典顺序排序导入
内置变量
起因是python语言的特点,python是一个解释性语言,python模块的代码是从上到下依次解释执行的,所以有些代码并不想要执行,就需要定义在if语句中,使得执行流跳过这些部分
在运行的时候,python中就创建了一些内置变量
__name__变量就是表示当前模块运行时的名称
如果当前模块是程序运行的主入口,那么这个值就是’__main__‘
如果当前模块是被其他模块通过import导入的,那么当前模块的内置变量__name__就是当前的模块的文件名
这样的机制好处是:
可以在任何模块都设置一个主入口,当别的模块导入的时候,并不会自动运行本模块的主入口,这样就可以自由调试了
实际上就是import时会将传入的__name__重置为模块名再去运行导入的模块,这样的操作
if __name__==’__main__‘:的作用是将程序定义功能和执行功能分开,以避免执行功能被重复执行多次。
代码风格
python使用缩进区分每个代码块,而不是大括号,需要注意同一代码块中的所有缩进必须一致,否则出错
使用换行符区分每一条代码,但是添加分号也不会导致错误
变量 全部使用小写字母可以使用匈牙利下划线分割
常量 全部使用大写字母可使用下划线分割
模块 全部使用小写字母,使用下划线分割就像变量一样
包 全部使用小写字母,使用下划线分割就像变量一样
函数 使用小写驼峰命名,也可以使用变量命名规则(实际上就函数是第一公民)
类 使用大写驼峰,帕斯卡命名法
对象 使用小写字母
方法 就像函数一样的命名
异常类 这个必须和继承的异常类一样使用Error作为后缀
因为使用缩进来表示代码块,所以实际上python的代码块并不是那么的明显,容易区分,所以一些额外的操作用于区分代码块就显得很有必要了
提高可读性
- 导入语句的额外工作
导入语句之前就是一些编码注释,文件注释等等,为了提高导入语句的可读性,导入语句需要按照不同的分组导入,在整体导入语句之前使用空行分隔上边的注释,导入语句结束后使用两个空行表示导入语句的结束
- 定义语句
例如定义一个函数,或者一个类都需要在前后空两行
- 类中方法
这个只需要一个空行分隔即可
逻辑代码块之间(就像if else 这些实际上在java中都需要{}的,这里就需要使用空行来加强代码块之间的边界感)
需要理解的是,中间有空行并不会打断一个代码块,只有遇到不同的缩进才会认为代码块结束
使用空格提供可读性
使用断行提高可读性
一行代码最好不要超过一屏,此时可以将一行的内容分成多行,python中有续行符,但是最好不使用,更好的使用方法是使用大,中,小括号来包裹表达式,
注释形式
注释有很多种,文件注释,文档注释,代码注释,TODO注释和编码注释
最好不要对注释进行注释
通过# 注解一行
文件注释
也就是每个文件开头的注释,在python中通常用来添加:
- 版权信息
- 文件名
- 所在模块
- 作者信息
- 历史版本信息
- 文件内容和作用
文档注释
这个注释是用来帮助生成API文档的注释
可以通过python提供的pydoc工具从python源代码中提取信息,这些信息也可以生成HTML文件
对公有的模块,函数,类,方法都应该使用文档注释
推荐使用三重双引号进行注释(实际上没有保存的字符串就被python当做注释)
生成文档
进入模块所在目录
cmd打开 使用命令 pydoc 模块名即可将文档显示在控制台
代码注释
可以通过# 为代码添加注释
一般是在代码的上方或者右侧添加
TODO注释
编写程序的时候,一些功能无法实现,为了便于以后查找,添加TODO注释
# TODO 待完成功能: ..
编码注释
将文件编码注释放在文件的第一行
#coding = utf-8
这个是windows系统中的写法
在linux文件系统中,通过# - * - coding:utf-8 - * -
python中的基本数据类型
核心思想
弱类型编译器自动推断
- 整数,浮点数
整数就是没有小数点的数,整数可以有多种进制表示,python中的不同进制表示是通过前缀0x或者0o,0b来表示的
浮点数需要字面量带上小数点才认为是浮点数,浮点数的运算是不精确地,想要精确的计算,提供了Decimal类进行精确地浮点数计算
1 |
|
- 复数
python直接对复数进行支持,所以python的数学
python中将形如 z = a+bj的看做是一个复数,其中j是虚数单位
- 布尔值
首字母必须大写,而java的布尔就不需要大写true必须写成True
- 空值
表示值不存在,而不是空指针
使用None表示,注意这个首字母也需要大写,python的常量都需要大写首字母
- 字符串
通过单引号或者双引号来包裹字符序列使用的是unicode编码
python中的字符串有一些很有用的内置功能
- 忽略转义字符 通过在字符串外边加上r表示这个字符串忽略转义
例如r’ this is a test \n’ 实际上就不会将\n看做是换行而是看做两个字符
跨行字符串,可以通过三重引号的方式来设置跨行字符串
字符串的使用
python中的字符串常用的方法有
- 索引随机访问
python直接将字符串看做是数组,可以直接通过[index]来访问某个字符
python还支持负数下标,也就是从右到左的访问,例如 string[-1] 就是最后一个字符
- 分片访问
可以通过这个[:]来直接实现substring的功能
例如string[:]获取全部,string[:7] 不包括index = 7的
- 内置了iterator可以直接通过for遍历
for s in str:
- 拆包访问
可以通过固定的模式将字符串分为几个部分
也就是将字符串复制给一组变量,不是依次赋值而是一次性赋值给一组变量
例如
1 |
|