本笔记是依据周浦城等教授编著的《深度卷积神经网络原理与实践》的个人笔记(Version:1.0.0)
整理作者:sq_csl
第四章 Python编程基础
1.1 Python 语言简介(略)
1.2 Python 3环境搭建
1.2.1 Windows下的安装
1.Python官方网站下载IDLE(https://www.python.org/downloads/)
2.下载并安装Anaconda(https://www.anaconda.com/download/)
调用IPython、Jupyter Notebook
1.2.2 Linux 下的安装
此处介绍的是Ubuntu的下载。
虽然Ubuntu有预装的Python,但安装的是Python 2.x版本,不过建议安装Python 3.x的同时仍然保留Python 2.x版本。
①打开终端,用wget命令到Python官网下载安装包:
wget http://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
②使用tar命令对压缩包解压:
tar -xzvf Python-3.7.5.tgz
③解压完成后,会在当前目录下产生目录Python-3.8.1,使用cd命令切换到该目录下编译安装,依次输入以下命令:
cd Python-3.7.5
./configure -with-ssl
make
sudo make install
④接下来需要安装Python编译外部模块文件使用的Python-dev,输入以下命令:
sudo apt-get install python-dev
⑤最后,安装pip
sudo apt-get install python-pip
sudo pip3 install -upgrade pip
也可以直接安装Anaconda来更新Python,以2020.02版本为例:
sh Anaconda3-2020.02-Linux-x86_64.sh
1.3 Python程序设计
1.3.1 编程规范
标识符
通常遵循以下习惯:
1.变量、函数名中的英文字母一般小写,以增加程序可读性。
2.应该较好表达变量值的含义,一般选用相应的英文单词、拼音缩写的形式,尽量不用简单符号来命名。
3.尽量不用易混淆的单个字符,例如:0和o;1和l。
4.避免开头和结尾都用下划线的情况(由Python特性决定)
缩进
一般为4个空格,或者制表符(Tab)为基本缩进单位。
注意:上面这两个不能混用。
注释
printf('Hello World!') #输出“Hello,World”。这个是单行注释
''
多行注释
''
'''
多行注释也可以这样
提示:注释和语句之间至少要用两个空格分开
'''
1.3.2 变量、数据类型
数字
类型:int、float、complex(复数类型,虚部以i或j结尾)、bool(只有True和False两种)
字符串
用引号表示。
举例:
a='安徽省';
b='合肥市';
c='紫云路292号';
print(a+b+c)
安徽省合肥市紫云路292号
Tip:在Python中,input( )函数输入的内容都当成字符串,如果要当成数值类型处理都需要先进行数据类型的转换。转换成字符串:str( );转换成整数int()。
列表
方法1:列表名=[值1,值2,…,值n]
方法2:list( )
举例1:
>>>list1=['r','g','b']; #定义了3个字符串的列表
>>>list2=list((1,2,3,4));
>>>list2
[1,2,3,4]
>>>list1[0]
'r'
与列表相关的函数:
①del或remove( ):删除
②pop( ):删除指定位置的元素
③append( ):列表末尾添加元素
④insert( ):插入指定位置
举例2:
>>>list1=['安徽','合肥',1958,2021];
>>>list1.append(2022);
>>>print(list1)
['安徽','合肥',1958,2021,2022]
>>>list1.insert(2,'蜀山');
>>>print(list1)
['安徽','合肥','蜀山',1958,2021,2022]
>>>list1.remove(1);
>>>print(list1)
['安徽','蜀山',1958,2021,2022]
>>>year=list1.pop(2);
>>>year
1958
>>>print(list1)
['安徽','蜀山',2021,2022]
元组
方式1:元组名=(值1,值2,…,值n)
方式2:tuple( )函数创建元组
注意:元组中元素不允许被删除!可用del来删除整个元组。
举例1:
>>>tup1=(11,45,14);
>>>tup[2]
14
>>>tup2=(114,514);
>>>tup3=tup1+tup2;
>>>print(tup3)
(11,45,14,114,514)
对元组切片,可得一个新元组。
举例2:
>>>nums=[11,45,14,191,981,0];
>>>tup4=tuple(nums);
>>>print(tup4)
(11,45,14,191,981,0)
>>>tup5=tup4[1:5];
>>>print(tup5)
(45,14,191,981)
>>>del tup5
>>>print(tup5)
NameError:name 'tup5' is not defined
字典
又称为关联数组或哈希表。
字典名={键1:值1 , 键2:值2 , … , 键n:值n}
语法格式:字典名[键]
举例:
>>>dict={'Name':'小明','Age':19,'Class':'ACM班'};
>>>print("dict['Name']:",dict['Name'])
dict['Name']: 小明
>>>dict['Age']=20;
>>>dict
{'Name':'小明','Age':20,'Class':'ACM班'}
>>>dict['Gender']='Male';
>>>dict
{'Name':'小明','Age':20,'Class':'ACM班','Gender':'Male'}
集合
无序且元素不重复的序列。
方法一:集合名={元素1, 元素2, … ,元素n}
方法二:集合名=set(列表或元组)
可使用“-” “|” “&”运算符进行差集、并集、交集运算
举例:
>>>set1={1,2,3,4,5};
>>>print(set1)
{1,2,3,4,5}
>>>num={1,2,3,2,1};
>>>print(num)
{1,2,3}
>>>a=set('abcd');
>>>b=set('cdef');
>>>print("a和b交集:",a&b)
a和b交集:{'d','c'}
>>>print(a-b)
{'a','b'}
1.3.3 运算符与表达式
算术运算符
‘+’(加)’-’(减)’*’(乘) ‘/’(除)’//’(整除)’%’(求余数)
‘**’ (幂运算)
举例:
>>>2**10
1024
赋值运算符
变量名=表达式
12种复合赋值运算符:+=、-=、*=、/=、//=、**=、|=、&=、^=、<<=、>>=。
关系运算符
用于两个值进行比较,运算结果为True(真)或False(假)。
常用关系运算符:==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
举例:
>>>a=5;
>>>b=10;
>>>a==b
False
逻辑运算符
and(逻辑与) or(逻辑或) not(逻辑非)
位运算符
按照二进制形式逐位进行运算。
&(按位与)、|(按位或)、^(按位异或)、~(按位求反)、<<(左移)、>>(右移)
>>>a=0b00111100;
>>>b=0b00001101;
>>>a&b
12
>>>bin(a|b)
'0b111101'
成员运算符
成员操作符判断序列中是否有某个成员,包括in、not in两种,返回值位True或False
举例:
>>>3 in [1,2,3]
True
>>>3 not in [1,2,3,4]
False
1.3.4 结构化程序设计
顺序结构
按照语句出现的先后顺序运行。
选择结构
if、if-else、if-elif-else语句
提醒:请严格按照缩进规则!
if语句
if 表达式:
语句块
if-else语句
if 表达式:
语句块1
else:
语句块2
if-elif-else
if 表达式1:
语句块1
elif 表达式2:
语句块2
...
elif 表达式n:
语句块n
else:
语句块n+1
循环结构
for、while语句
for循环语句
for 循环变量 in 遍历结构:
语句块
whlie循环语句
while 表达式:
语句块
建议:为了保证可读性以及复杂度,建议循环嵌套层数不超过三层。
1.3.5 函数与模块
函数的定义与调用
用关键字def,此时函数名后面的括号中的变量称为形式参数(简称形参)
函数只有被调用才会被执行,调用方式:函数名(形参表)。
def 函数名(形参表):
函数体
return 返回值
函数的嵌套和递归
举例:(求阶乘)
def fac(n):
if (n==0 or n==1):
facc=1
else:
facc=n*fac(n-1)
return facc
n=int(input("Please input number n="))
print("n! =",facc(n))
Please input number n=10
n! =3628800
内置函数
>>>dir(__builtins__) #查看所有的内置函数名
input( )
从键盘键入数据赋给变量(输入类型:字符串),括号内内容显示
使用方法:
变量=input("提示信息")
print( )
基本输出函数
使用方法:
print(表达式1,表达式2,表达式3,...,表达式n)
打开(建立)文件函数
调用open( )函数打开文件
使用方法:
fileobj=open(filename[,mode[,buffering]])
说明:通过字符串filename来指定希望打开哪个路径下的文件名,并返回一个文件对象。
mode参数常用:‘r’(读模式),‘w’(写模式),‘a’(追加模式),‘b’(二进制模式)
读文本文件函数
方法1:采用不设置参数的read( )方法
方法2:采用readlines( )从文件中获取一个字符串,每个字符串就是文件中的每一行。
写文本文件函数
函数:write( )、writelines( )
注:为了确保数据一致性,写文件时不允许读取数据
举例:
>>>filename="c:/test.txt";
>>>file1=open(filename,"w",encoding='utf-8');
>>>file1.write("你好,世界!");
>>>contents=file1.readlines();
>>>print(contents)
['你好,世界!']
>>>file1.close(); #文件关闭
模块
采用关键字import来导入某个模块,具体方式如下:
import 模块名
有时候只需要用到某个模块中某个函数或者某几个函数:
from 模块名 import 函数名1.函数名2...
使用*运算符可以导入所有函数
from 模块名 import *
可以采用关键字as来指定简短而独一无二的别名,类似于外号,如:
import numpy as np
变量的作用域
全局变量与局部变量(略)
1.3.6 面向对象的程序设计
面向对象程序设计是上世纪80年代针对大型软件的设计而提出的一种计算机编程架构。
Python语言采用了面向对象程序设计的思想,遵循“万物皆为对象”的原则,完全支持面向对象的基本功能,如封装、继承、多态以及对基类方法的覆盖或重写,并且Python中的字符串、列表、字典、元组等内置数据类型都具有和类完全相似的语法和用法。
类和对象
定义:
class 类名:
定义数据成员
定义成员函数
类名一般约定用大写字母开头,函数用小写字母开头。
定义类之后,就可以用来实例化一个对象。语法形式: 对象名=类名(实参表)
若要访问对象中的某个数据成员或成员函数,语法形式为:对象名.成员名。
构造函数与析构函数
构造函数的作用:为对象的数据成员赋初值,函数名固定为__init__。其中第1个参数固定为self,代表当前参与操作的对象本身。其他参数对应于类的数据成员,其数量与需要在构造函数中赋初值的数据成员的数量相同。
析构函数的作用:用于对象被撤销时释放其所占用的内存资源。
注:①定义类时一般要定义构造函数,以便为数据成员赋初值。
②构造函数在定义对象时会自动执行,但不能显式调用。
③可以不定义析构函数,不过此时将采用默认的析构函数。
class Circle:
def __init__(self,r=10):
self.__radius=r;
def disp(self):
print("半径={}".format(self.__radius));
def area(self):
return 3.1416*self.__radius*self.__radius;
def peri(self):
return 2*3.1416*self.__radius;
cir1=Circle(6);
cir2=Circle();
cir1.disp();
print("面积={}".format(cir1.area()))
print("周长={}".format(cir1.peri()))
cir2.disp()
print("面积={}".format(cir2.area()))
print("周长={}".format(cir2.peri()))
半径=6
面积=113.0976
周长=37.6992
半径=10
面积=314.16
周长=62.832
私有成员和公有成员
private 和 public
注:①以一个_开头的是基类或派生类内受保护的成员。
②以≥2个_开头且不以2个或多个结束的是私有成员。
③其他的符合命名规则的标识符称为公有成员。
数据成员
可区分为属于类的成员和属于对象的成员。
类成员既可以通过对象名访问,也可以通过类名访问。
对象成员只可以通过对象名访问。
举例:
class Circle:
__total=666; #类成员
def __init__(self,r=10):
self.__radius=r; #对象成员
def disp(self):
print("半径={}".format(self.__radius));
def area(self):
return 3.1416*self.__radius*self.__radius;
def peri(self):
return 2*3.1416*self.__radius;
cir1=Circle(6);
cir2=Circle();
print(Circle._Circle__total); #通过类名访问类成员
print(cir1._Circle__total); #通过对象名访问类成员
print(cir2._Circle__total); #同上
print(cir1._Circle__radius); #通过对象名访问对象成员
print(cir2._Circle__radius); #通过对象名访问对象成员
666
666
666
6
10
成员函数
对象函数(对象方法)、类函数(类方法)、静态函数(静态方法)
继承与多态
继承与派生
多态
1.4 Python基础工具库
1.4.1 Numpy
Numpy是Python进行科学计算的基础软件包,主要提供了高性能的N维数组实现以及计算能力,还提供了和C、C++、Fortran等编程语言集成的能力,另外还实现了包括线性代数、傅里叶变换以及随机数生成等一些基础的算法。
NumPy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以0下标为开始进行集合中元素的索引。ndarray对象是用于存放同类型元素的多维数组,其中的每个元素在内存中都有相同存储大小的区域。
可从网站:https://www.scipy.org 下载
使用Numpy数组的创建
内置功能函数
arange( ) 创建一位数组
创建高维数组可对arange( )函数输出的一维数组调用reshape( )函数进行变形。
zeros( ) 创建一个填充0的数组
ones( ) 创建一个填充1的数组
empty( ) 创建一个随机数数组
full( ) 创建一个填充定值的n×n数组
eyes( ) 创建一个n×n的单位阵
linspace( ) 在指定的间隔内返回均匀间隔的数字
举例:
Python的列表转换
使用特殊的库函数
数组的索引与访问
方法1:基于0~n的下标直接进行索引
方法2:采用切片的方式,通过内置的slice( )函数,设置start、stop和step参数,对Numpy数组进行切片
Numpy中的数学运算
1.4.2 Pandas
Series(一维同构数组)
DataFrame(二维异构表格)