# 概述
诞生与 1989 年圣诞节期间,吉多・范罗苏姆为了打发时间,而决心开发一款作为 ABC(专门为非专业程序员设计的一种教学语言)的一个继承,与 1991 年发行第一个版本。
python 的运用场景:
- 人工智能
- 机器学习,神经网络,深度学习
- 云计算
- 开源云计算解决方案
- 大数据
- 数据分析,数据可视化,数据挖掘
- 网络爬虫
- 主流爬虫设计语言,Scrapy 框架
- 自动化维护
- selenium
- web 开发
- web2py 框架
- 科学计算
- NumPy,SciPy
- 常规软件开发
- 软件开发,脚本编写,网络编程
# 第一个 python 程序
相比各位学 c 的第一个程序,应该都是打印一个”Hello World“了吧,那 python 的入门我们也从打印 “Hello World” 开始
可以从我们的 dos 窗口来执行 python 代码
当然也可以使用一些编译器如 PyCharm 或者 vscode 编写程序
# python 的输入输出
# 输入
上面的第一个程序使用的就是一个输出语句
printf () 是函数,参数就是要输出的内容,这些内容可以是字符串,数值,列表或者字典等数据类型,输出多个参数使用 "," 隔开或者使用加号链接
注:
上面两种链接方式,隔开的会有空格,而+链接的没有
双引号或者是单引号之间包裹的是字符串常量会按照原样输出,为用引号包裹的是变量,会输出其代表的含义
print函数执行后默认换行,如果不需要换行这在其后加上end = ''
上面提到换行这里简单说明一下 \n 和 \r 的区别
- '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
- '\n' 换行,换到当前位置的下一行,而不会回到行首;
# 输出
input () 函数是 Python 语言的一个基本输入函数,默认的输入类型为字符串型
这个函数的参数会被打印出来
这里默认的数据类型是 string,可以使用类型转换改变数据类型
# python 的注释
这里主要分为多行注释和单行注释
单行注释:# 右边的代码不会被执行
多行注释:两组三个连续的单引号或者双引号
# python 序列 & 控制结构
# 列表
在 Python 中,序列是最基本的数据结构,相当于 c 中的数组结构。Python 中序列包括列表、元组、字典等。
在列表中所有的元素都放在一对 "[]" 中,相邻元素之间使用逗号隔开,例如:['demo1','demo2']
列表的创建
直接写成列表的形式写出
通过 list () 函数将其他类型转化为列表
列表的删除
删除单个元素使用 del,指定列表名和元素名
删除整个列表,使用 del,指定列表名
列表末尾添加元素
使用 append 函数添加单个元素
使用 extend 添加一个列表
指定位置添加元素
使用 insert 函数
这里第一个差数是插入位置,第二个元素是插入元素
删除第一次出现的元素,使用 remove 函数
删除并返回指定下标的元素,使用 pop 函数
pop 函数如果没有设置参数则默认删除最后一个元素
返回指定元素在列表中出现的次数,使用 count 函数
对列表逆序
对列表进行一个排序,使用 sort 函数,key 参数指定排序依据,reverse 决定升序(False)还是降序(True)
# 元组
与列表不同的是,元组使用 () 包裹,且属于不可变序列,也就是说,一旦创建后无法进行增删改查的操纵,但是访问速度比列表快,也更加安全
# 字典
Python 中的字典不同于在渗透测试中使用的字典,其是包含若干 “键:值” 元素的可变序列,字典中的每一个元素都包含用冒号分开的 “键 " 和 “值”,不同元素之间用逗号隔开,所有元素放在 - 对大括号 “{” 和 “)” 中,另外,需要注意的是字典中的 “键” 不能重复,而 “值” 可以重复
前面说到元组不能进行增删改查,但是字典是可以的,而且我个人感觉这个我用的还比较多
修改字典中的元素,类似数组的赋值方法去修改,不过这里不使用下标,而是键值,例如:
为字典添加新元素,像上面一样就可以
删除字典中的一个元素,还是使用 del 函数
删除整个也是同列表一样使用
# 选择结构
说白了也就是 if 语句,比如说判断成绩小于 60 为不及格,高于 90 为优秀可以使用下面的代码实现
这里记得要注意,input 默认是 str 类型
# 循环结构
在 python 中有两种循环结构,分别为 for 循环和 while 循环,for 循环主要使用在有明显边界范围的情况,而 while 主要使用在范围不能确定的情况
# for 循环
上面提到,边界明确和固定,比如,计算 1 加到 100
# while 循环
当无边界时,常使用的循环结构,比如 1 加到 x
# 文件 & 异常处理
# 文件处理
文件是以硬盘为载体存储在计算机上的信息集合,有数据库文件,图像文件,音频,视频,文本文件等等
这里的文件操纵主要是对文本文件进行一个操作,对于文本文件来说,文件操作的基本流程分为三个:
- 打开文件并创建对象
- 对文件内容进行增删改查
- 关闭文件
# 创建文件对象
在 python 中内置了文件对象,通过 open 函数可以制定模式打开指定文件并创建文件对象
open(name[, mode[, buffering[,encoding=[]]]]) |
- name : 一个包含了你要访问的文件名称的字符串值。
- mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读 (r)。
- buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
- encoding: 指定文本的编码模式
下表是 mode 的参数和对应的模式
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新 (可读可写)。 |
U | 通用换行模式(不推荐)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
# 文件的读取
通常对文件的操作包括文件的读取,写入,追加,二进制模式,文本模式,读写模式
读取文件的内容
r
:读模式(默认可以省略),如果文件不存在会抛出异常+
:读、写模式(可以同其他模式组合使用)readable()
: 测试文本文件是否可读(能写则返回 Ture)read(size)
:读取文件中的 size 字符,如省略则读取全部字符如果有
readline()
: 读取文件的第一行作为结果返回readlines()
:会将文件的每一行作为一个字符串,存入列表返回也可以使用 for 循环读取文件
文件的写入
w
:写入模式,会清空文件原有内容,如果文件不存在会创建文件x
:写入模式,如果文件已经存在则抛出异常a
:追加模式,不覆盖原有内容writable()
:测试文件是否可写write(str)
:将 str 写入文件
# 文件关闭
使用 close () 函数关闭文件,文件对象会被删除,使得所作的修改保存到文件中,在文件操作中出现了异常很难保证文件正常关闭,这里可以使用 with 关键字
# 异常处理结构
对于一种高级语言来说,异常处理可以提高文件的健壮性和容错性,使得代码不会因为使用者的错误使用导致系统崩溃,同时可以为使用者提供一些错误提示,异常处理的思路是先进行再处理可能出现的错误
# try...except... 结构
在 python 的异常处理结构中,这是使用最为频繁的一种结构,当 try 子句代码块执行异常,并且被 except 子句捕获,则执行 except 子句代码块
例:学校在录入成绩要求成绩为 0-150 的整数,而不接受其他数据类型
# try...except..else.. 结构
还是上面的例子,这里的 else 是 except 的否定执行体
# try...except...finally
与上面的区别就是,无论 try 子代码块能否正常执行,finally 中的代码都会正常执行
例:输入两个数进行除法运算,输出最后结构
# 命令行参数
常见的服务器都是 Linux 系统,并且多数都是无图形化界面的,进行任何的操作都是通过命令行的方式进行,这一块主要是借助 python 提供的几种主流的参数解析工具来实现简单的功能
Python 中的三个内建模块用于处理命令行参数
- sys
- getopt
- optparse
- argparse
# sys 命令行参数
sys 模块主要用于获取和 Python 解释器相关的信息,可以在 python 交互式解释器中导入 sys 模块,通过内置函数 dir 查询到模块内定义的所有名称,并以一个字符串列表的形式返回
# sys.argv
以列表的方式获取 python 程序运行的命令行参数
# getopt
getopt 是对 sys.argv 获取的命令行参数进行二次处理,在运行程序时可能需要根据不通的条件,输入不通的命令行选项来实现不通的功能,例如 - u 后面是用户,-p 后面是密码
使用 getopt.getopt () 会返回两个列表,一个赋值给 opts 一个赋值给 args
- opts:是(选项,选项值)的元组为一个元素列表,如果没有选项值为空字符串
- args:存放没用选项单参数的列表,不属于格式信息的剩余的命令行参数
- 使用 sys.argv [1:] 是为了过滤第一个参数
- “u:p” 为定义短格式选项(-),这里的 h 和 u 为两个选项,“h” 后面没有 “:” 表示 h 这个选项没有选项值,而 u 必须有选项值
- ["help","file="] 为定义长格式选项(--),这里 “=” 和上面的短格式选项中的 “:” 一样
# optparse
主要用于为脚本传递命令参数,采用预先定义好的选项来解析命令行参数,与 getopt 函数不通的是 optparse 可以自动生成帮助信息
import optparse | |
usage="python" | |
parser=optparse.OptionParser(usage) | |
parser.add_option('-u','--user',dest='User',type='string',help='target user',default='root') | |
parser.add_option('-p','--password',dest='Pwd',type='string',help='target password') | |
options,args=parser.parse_args() | |
print("option为:",options) | |
print("用户名为:",options.User) | |
print("密码为:",options.Pwd) | |
print("args为:",args) |
- 可以设置多个选项字符串,比如上面的 “-u’,--user’这两个,用的时候任选其一;
- dest - 用于定义选项值存放的位置,作为后面的第一个字典 (options) 的键,值为命令输入的参数:
- type 用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float 等类型:
- help 用于定义帮助信息:
- default 设置默认值;
# argparse
相当于 optparse 的一个完善的版本
import argparse | |
argparse=argparse.ArgumentParser() | |
argparse.add_argument('-u','--user',dest='User',type=str,default='root',help='target User') | |
argparse.add_argument('-s','--sex',dest='Sex',type=str,choices=['男','女'],default='男',help='target Sex') | |
argparse.add_argument('-n','--nuaber',dest='Nua',nargs=2,required=True,type=int,help='target Two Numbers') | |
print(argparse.parse_args()) |
- 可以设置多个选项字符中,比如上面的 “-u’,-user’这两个,用的时候任选其一;
- type 用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float 等类型;
- dest - 用于定义选项值存放的位置,作为后面的第一个字典 (options) 的键,值为命令输入的参数
- help 用于定义帮助信息;
- default 设贸默认值:
# 模块化编程
# Python 的程序结构
Python 的程序又包,模块和函数组成
三者的关系如下图所示
包是一个完成特定任务的工具箱
可以提高程序的开发效率,减少编程的复杂度,达到代码重用的效果
模块是处理某一类问题的集合
模块由函数和类构成,没有 main 函数
函数是一段可以重用的又名称的代码
# 函数定义 & 调用
格式:
def 函数名(形参表): | |
函数体与序列 | |
[retern 表达式] #可选项 |
函数调用:
函数名(形参表) |
注:
函数必须先定义再使用
函数名与变量名的命名规则相同
# 局部变量 & 全局变量
# 局部变量
- 局部变量是只能在函数或代码块内使用的变量
- 函数或代码段一旦结束,局部变量的生命周期也就结束
- 局部变量的作用范围只在其被创建的函数内有效
# 全局变量
- 全局变量是能够被不同的函数、类或文件共享的变量
- 在函数之外定义的变量都可以称为全局变量
- 全局变量可以被文件内部的任何函数和外部文件访问
- 全局变量通常在文件的开始处定义
# 模块导入方式
- import 语句,导入整个模块
- from...import... 语句,导入模块的部分属性
# 自定义包和模块
Python 程序除了可以直接运行,还可以作为模块导入并使用其中的对象,通过__name__属性可以识别程序的使用方式:
- 每个 Python 脚本在运行时都有一个__name__属性,如果脚本作为模板被导入,则其__name__属性的值被自动设置为模块名
- 如果脚本独立运行,则其__name__属性被制动设置为字符串__main__
对于大型软件开发,不可能把所有的代码都放到一个文件中,这样会使得代码难以维护和管理,通常使用包来管理。包是 Python 用来组织命名空间和类的重要方法。在包的每个目录中都要包含一个__init__.py 文件,这个文件是一个空文件,用于表示当前文件夹是一个包,设置__all__变量以及执行初始化包所需要的代码