# 概述

诞生与 1989 年圣诞节期间,吉多・范罗苏姆为了打发时间,而决心开发一款作为 ABC(专门为非专业程序员设计的一种教学语言)的一个继承,与 1991 年发行第一个版本。

python 的运用场景:

  1. 人工智能
    • 机器学习,神经网络,深度学习
  2. 云计算
    • 开源云计算解决方案
  3. 大数据
    • 数据分析,数据可视化,数据挖掘
  4. 网络爬虫
    • 主流爬虫设计语言,Scrapy 框架
  5. 自动化维护
    • selenium
  6. web 开发
    • web2py 框架
  7. 科学计算
    • NumPy,SciPy
  8. 常规软件开发
    • 软件开发,脚本编写,网络编程

# 第一个 python 程序

相比各位学 c 的第一个程序,应该都是打印一个”Hello World“了吧,那 python 的入门我们也从打印 “Hello World” 开始

可以从我们的 dos 窗口来执行 python 代码

image-20230126222928427

当然也可以使用一些编译器如 PyCharm 或者 vscode 编写程序

image-20230126223140132

# python 的输入输出

# 输入

上面的第一个程序使用的就是一个输出语句

printf () 是函数,参数就是要输出的内容,这些内容可以是字符串,数值,列表或者字典等数据类型,输出多个参数使用 "," 隔开或者使用加号链接

注:

  1. 上面两种链接方式,隔开的会有空格,而+链接的没有
  2. 双引号或者是单引号之间包裹的是字符串常量会按照原样输出,为用引号包裹的是变量,会输出其代表的含义
  3. print函数执行后默认换行,如果不需要换行这在其后加上end = ''

image-20230126224138887

上面提到换行这里简单说明一下 \n 和 \r 的区别

  1. '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
  2. '\n' 换行,换到当前位置的下一行,而不会回到行首;

# 输出

input () 函数是 Python 语言的一个基本输入函数,默认的输入类型为字符串型

这个函数的参数会被打印出来

image-20230126225834731

这里默认的数据类型是 string,可以使用类型转换改变数据类型

image-20230126225950928

# python 的注释

这里主要分为多行注释和单行注释

单行注释:# 右边的代码不会被执行

image-20230127190533214

多行注释:两组三个连续的单引号或者双引号

image-20230127190559328

# python 序列 & 控制结构

# 列表

在 Python 中,序列是最基本的数据结构,相当于 c 中的数组结构。Python 中序列包括列表、元组、字典等。

在列表中所有的元素都放在一对 "[]" 中,相邻元素之间使用逗号隔开,例如:['demo1','demo2']

  • 列表的创建

    • 直接写成列表的形式写出image-20230128185445030

    • 通过 list () 函数将其他类型转化为列表

      image-20230128185745219

  • 列表的删除

    1. 删除单个元素使用 del,指定列表名和元素名

      image-20230128185929574

    2. 删除整个列表,使用 del,指定列表名

      image-20230128190015177

  • 列表末尾添加元素

    • 使用 append 函数添加单个元素image-20230128190202762

    • 使用 extend 添加一个列表

      image-20230128190627401

  • 指定位置添加元素

    使用 insert 函数

    image-20230128190333193

    这里第一个差数是插入位置,第二个元素是插入元素

  • 删除第一次出现的元素,使用 remove 函数

    image-20230129205433785

  • 删除并返回指定下标的元素,使用 pop 函数

    image-20230129205831666

    pop 函数如果没有设置参数则默认删除最后一个元素

    image-20230129205914061

  • 返回指定元素在列表中出现的次数,使用 count 函数

    image-20230129210057758

  • 对列表逆序

    image-20230129210519854

  • 对列表进行一个排序,使用 sort 函数,key 参数指定排序依据,reverse 决定升序(False)还是降序(True)image-20230129211950790

    image-20230129212137421

# 元组

与列表不同的是,元组使用 () 包裹,且属于不可变序列,也就是说,一旦创建后无法进行增删改查的操纵,但是访问速度比列表快,也更加安全

image-20230129213203088

# 字典

Python 中的字典不同于在渗透测试中使用的字典,其是包含若干 “键:值” 元素的可变序列,字典中的每一个元素都包含用冒号分开的 “键 " 和 “值”,不同元素之间用逗号隔开,所有元素放在 - 对大括号 “{” 和 “)” 中,另外,需要注意的是字典中的 “键” 不能重复,而 “值” 可以重复

image-20230129213256872

前面说到元组不能进行增删改查,但是字典是可以的,而且我个人感觉这个我用的还比较多

  • 修改字典中的元素,类似数组的赋值方法去修改,不过这里不使用下标,而是键值,例如:

    image-20230129213818546

  • 为字典添加新元素,像上面一样就可以

    image-20230129214743341

  • 删除字典中的一个元素,还是使用 del 函数

    image-20230129215030874

    删除整个也是同列表一样使用

    image-20230129215126535

# 选择结构

说白了也就是 if 语句,比如说判断成绩小于 60 为不及格,高于 90 为优秀可以使用下面的代码实现

image-20230129215827705

这里记得要注意,input 默认是 str 类型

# 循环结构

在 python 中有两种循环结构,分别为 for 循环和 while 循环,for 循环主要使用在有明显边界范围的情况,而 while 主要使用在范围不能确定的情况

# for 循环

上面提到,边界明确和固定,比如,计算 1 加到 100

image-20230129221950576

# while 循环

当无边界时,常使用的循环结构,比如 1 加到 x

image-20230129222336287

# 文件 & 异常处理

# 文件处理

文件是以硬盘为载体存储在计算机上的信息集合,有数据库文件,图像文件,音频,视频,文本文件等等

这里的文件操纵主要是对文本文件进行一个操作,对于文本文件来说,文件操作的基本流程分为三个:

  1. 打开文件并创建对象
  2. 对文件内容进行增删改查
  3. 关闭文件

# 创建文件对象

在 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+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

# 文件的读取

通常对文件的操作包括文件的读取,写入,追加,二进制模式,文本模式,读写模式

  1. 读取文件的内容

    r :读模式(默认可以省略),如果文件不存在会抛出异常

    + :读、写模式(可以同其他模式组合使用)

    readable() : 测试文本文件是否可读(能写则返回 Ture)

    image-20230131091321388

    read(size) :读取文件中的 size 字符,如省略则读取全部字符

    image-20230131091750676

    如果有

    image-20230131091925769

    readline() : 读取文件的第一行作为结果返回

    image-20230131092244773

    readlines() :会将文件的每一行作为一个字符串,存入列表返回

    image-20230131092419709

    也可以使用 for 循环读取文件

    image-20230131092552484

  2. 文件的写入

    w :写入模式,会清空文件原有内容,如果文件不存在会创建文件

    x :写入模式,如果文件已经存在则抛出异常

    a :追加模式,不覆盖原有内容

    writable() :测试文件是否可写

    image-20230131093011707

    write(str) :将 str 写入文件

    image-20230131093615623

# 文件关闭

使用 close () 函数关闭文件,文件对象会被删除,使得所作的修改保存到文件中,在文件操作中出现了异常很难保证文件正常关闭,这里可以使用 with 关键字

# 异常处理结构

对于一种高级语言来说,异常处理可以提高文件的健壮性和容错性,使得代码不会因为使用者的错误使用导致系统崩溃,同时可以为使用者提供一些错误提示,异常处理的思路是先进行再处理可能出现的错误

# try...except... 结构

在 python 的异常处理结构中,这是使用最为频繁的一种结构,当 try 子句代码块执行异常,并且被 except 子句捕获,则执行 except 子句代码块

例:学校在录入成绩要求成绩为 0-150 的整数,而不接受其他数据类型

image-20230131101411225

# try...except..else.. 结构

还是上面的例子,这里的 else 是 except 的否定执行体

image-20230131102111632

# try...except...finally

与上面的区别就是,无论 try 子代码块能否正常执行,finally 中的代码都会正常执行

例:输入两个数进行除法运算,输出最后结构

image-20230131103141816

# 命令行参数

常见的服务器都是 Linux 系统,并且多数都是无图形化界面的,进行任何的操作都是通过命令行的方式进行,这一块主要是借助 python 提供的几种主流的参数解析工具来实现简单的功能

Python 中的三个内建模块用于处理命令行参数

  • sys
  • getopt
  • optparse
  • argparse

# sys 命令行参数

sys 模块主要用于获取和 Python 解释器相关的信息,可以在 python 交互式解释器中导入 sys 模块,通过内置函数 dir 查询到模块内定义的所有名称,并以一个字符串列表的形式返回

image-20230131110838698

# sys.argv

以列表的方式获取 python 程序运行的命令行参数

image-20230131113706097

# getopt

getopt 是对 sys.argv 获取的命令行参数进行二次处理,在运行程序时可能需要根据不通的条件,输入不通的命令行选项来实现不通的功能,例如 - u 后面是用户,-p 后面是密码

使用 getopt.getopt () 会返回两个列表,一个赋值给 opts 一个赋值给 args

  • opts:是(选项,选项值)的元组为一个元素列表,如果没有选项值为空字符串
  • args:存放没用选项单参数的列表,不属于格式信息的剩余的命令行参数

image-20230131120822875

  1. 使用 sys.argv [1:] 是为了过滤第一个参数
  2. “u:p” 为定义短格式选项(-),这里的 h 和 u 为两个选项,“h” 后面没有 “:” 表示 h 这个选项没有选项值,而 u 必须有选项值
  3. ["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)

image-20230131152430672

  1. 可以设置多个选项字符串,比如上面的 “-u’,--user’这两个,用的时候任选其一;
  2. dest - 用于定义选项值存放的位置,作为后面的第一个字典 (options) 的键,值为命令输入的参数:
  3. type 用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float 等类型:
  4. help 用于定义帮助信息:
  5. 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())

image-20230131154514101

  1. 可以设置多个选项字符中,比如上面的 “-u’,-user’这两个,用的时候任选其一;
  2. type 用于检测命令行输入参数的数据类型是否符合要求,有 string、int、float 等类型;
  3. dest - 用于定义选项值存放的位置,作为后面的第一个字典 (options) 的键,值为命令输入的参数
  4. help 用于定义帮助信息;
  5. default 设贸默认值:

# 模块化编程

# Python 的程序结构

Python 的程序又包,模块和函数组成

三者的关系如下图所示

image-20230131160222870

  1. 包是一个完成特定任务的工具箱

    可以提高程序的开发效率,减少编程的复杂度,达到代码重用的效果

  2. 模块是处理某一类问题的集合

    模块由函数和类构成,没有 main 函数

  3. 函数是一段可以重用的又名称的代码

# 函数定义 & 调用

格式:

def 函数名(形参表):
    函数体与序列
    [retern 表达式] #可选项

函数调用:

函数名(形参表)

注:

  1. 函数必须先定义再使用
  2. 函数名与变量名的命名规则相同

image-20230131161725327

# 局部变量 & 全局变量

# 局部变量

  • 局部变量是只能在函数或代码块内使用的变量
  • 函数或代码段一旦结束,局部变量的生命周期也就结束
  • 局部变量的作用范围只在其被创建的函数内有效

# 全局变量

  • 全局变量是能够被不同的函数、类或文件共享的变量
  • 在函数之外定义的变量都可以称为全局变量
  • 全局变量可以被文件内部的任何函数和外部文件访问
  • 全局变量通常在文件的开始处定义

# 模块导入方式

  1. import 语句,导入整个模块
  2. from...import... 语句,导入模块的部分属性

# 自定义包和模块

Python 程序除了可以直接运行,还可以作为模块导入并使用其中的对象,通过__name__属性可以识别程序的使用方式:

  • 每个 Python 脚本在运行时都有一个__name__属性,如果脚本作为模板被导入,则其__name__属性的值被自动设置为模块名
  • 如果脚本独立运行,则其__name__属性被制动设置为字符串__main__

对于大型软件开发,不可能把所有的代码都放到一个文件中,这样会使得代码难以维护和管理,通常使用包来管理。包是 Python 用来组织命名空间和类的重要方法。在包的每个目录中都要包含一个__init__.py 文件,这个文件是一个空文件,用于表示当前文件夹是一个包,设置__all__变量以及执行初始化包所需要的代码