背景

来历

Python的创始人为荷兰人吉多·范罗苏姆 (Guido van Rossum)。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC(为非程序员设计的语言,非开放)语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提·派森的飞行马戏团》(Monty Python’s Flying Circus)。

自从2004年以后,python的使用率呈线性增长。Python 2于2000年10月16日发布,稳定版本是Python 2.7。Python 3于2008年12月3日发布,不完全兼容Python 2。

2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。

语言风格

Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

Python的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。

一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。

应用

Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。

适用方面

  • 首选是网络应用,包括网站、后台服务等等;
  • 其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;
  • 另外就是把其他语言开发的程序再包装起来,方便使用。

缺点

  1. 第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。(但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,py需要0.1秒)
  2. 第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。

linux安装python

下载官网,可以看到各个版本的发布时间,最后支持时间

https://www.python.org/downloads/

image-20201215141014778

1.选择一个合适的版本下载,这里选择3.9.1。

1
wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz

image-20201215141615480

2.解压

1
tar -zxvf Python-3.9.1.tgz

image-20201215141917396

3.编译安装

创建安装目录

1
sudo mkdir -p /usr/local/python3

image-20201215143206557

源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)

Configure是一个可执行脚本,它有很多选项,使用命令./configure –help输出详细的选项列表。一般用configure –prefix= 来制定安装目录,便于后期管理。

1
./configure --prefix=/usr/local/python3

image-20201215143525653

编译

1
make

image-20201215145333244

安装

1
sudo make install

建立软链接

1
ln -s /usr/local/python3/bin/python3 /usr/bin/python3

建立pip3(python包管理工具)的软链接

1
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

image-20201215150717817

将/usr/local/python3/bin 加入环境变量

1
vim ~/.bash_profile

输入

1
export PATH=$PATH:$HOME/bin:/usr/local/python3/bin

测试是否安装成功

1
2
python3 -V
pip3 -V

image-20201215150010869

image-20201215150704069

python语法

基础语法

python是大小写敏感的语言,写错大小写会报错。

输入输出

1
2
3
print('100 + 200 =', 100 + 200)  //py把print中的逗号翻译为空格
print( x, end=" " ) //输出默认换行,不换行需要加上end=""
print( x, end="," ) //或者用end在输出的末尾添加不同的字符
1
2
name = input()  //输入变量
name = input('please enter your name: ') //带提示的输入

注释

单行注释 #

1
# 注释xxxxxx

多行注释用’’’或”””

1
2
3
4
5
6
7
'''

注释1

注释2

'''

缩进

python中不规定缩进的空格数,但是同一个代码块必须包含相同的缩进空格数。否则将会报错

多行语句

python中如果语句过长需要换行需要用反斜杠将换行符注释掉。

1
2
3
4
5
sum = num1 + \

num2 + \

num3

基本数据类型

python中变量不需要声明,每个变量使用前必须赋值。

多个变量赋值可以连等,也可以用逗号为多个对象指定不同变量,如:

a, b, c = 1, 2, “hello”

python3有如下六种标准数据类型:

  • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
  • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

查看变量类型方法:

1
2
3
type(a)

isinstance(a, int)

image-20201215161510545

image-20201215161532281

数字

有四种数字类型:int、 float、 bool、complex(复数)

数值运算

+
-
*
/ 除法,得到浮点数
// 除法,得到整数
% 取余
** 乘方

数学函数

函数 返回值 ( 描述 )
abs(x) 返回数字的绝对值,如abs(-10) 返回 10
ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5
cmp(x, y) 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x。
exp(x) 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x) 返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x) 返回数字的下舍整数,如math.floor(4.9)返回 4
log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x) 返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,…) 返回给定参数的最大值,参数可以为序列。
min(x1, x2,…) 返回给定参数的最小值,参数可以为序列。
modf(x) 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y) x**y 运算后的值。
round(x ,n]) 返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。其实准确的说是保留值将保留到离上一位更近的一端。
sqrt(x) 返回数字x的平方根。

随机数函数

函数 描述
choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange (start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random() 随机生成下一个实数,它在[0,1)范围内。
seed(x]) 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst) 将序列的所有元素随机排序
uniform(x, y) 随机生成下一个实数,它在[x,y]范围内。

字符串

字符串截取方式:

1
str[a:b]

字符串链接用+

字符串的复制用*

image-20201215162831539

image-20201215162842085

字符串索引方式:

img

python字符串不能被改变,如a[0] = ‘x’会报错。

列表

列表可以改变,也可以和字符串一样截取。

初始化定长数组:

1
b =[0 for n in range(10)] #也可以b = [0]*10 

img

+表示列表链接,*表示列表重复操作,和字符串类似。

image-20201215171211961

image-20201215171222202

删除列表元素

1
del list[1]

相关函数和方法

函数 作用
len(list) 列表元素个数
max(list) 返回列表元素最大值
min(list) 返回列表元素最小值
list(seq) 将元组转换为列表
方法 作用
list.append(obj) 在列表末尾添加新的对象
list.count(obj) 统计某个元素在列表中出现的次数
list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
list.insert(index,obj) 将对象插入列表
list.pop([index = -1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove(obj) 移除列表中某个值的第一个匹配项
list.reverse() 反向列表中元素
list.sort(key = None, reverse = False) 对原列表进行排序
list.clear() 清空列表
list.copy() 复制列表

元组

元组与列表类似,但是元组元素不能修改。元组用()声明。

集合

集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。

集合声明

image-20201215175508478

image-20201215175532649

可以看到,集合会自动将重复元素删除,只留下互补相同的元素,和中学数学中学到的集合概念一样。

集合的差、交、并运算。

image-20201216092226486

image-20201216092247025

字典

字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。

在同一个字典中,键(key)必须是唯一的。

元素是通过键来存取的,而不是通过偏移存取。

字典赋值时,也必须先声明,否则会报错。

image-20201216093121003

image-20201216093132877

(未声明dict)

定义dict后,程序正确执行。

image-20201216093209927

image-20201216093221614

其他操作

image-20201216093538056

image-20201216093648125

用dict构造函数定义字典。

image-20201216094212726

image-20201216094225663

条件控制语句

1、每个条件后面要使用冒号 **:**,表示接下来是满足条件后要执行的语句块;

2、Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else;

3、可以if语句嵌套。

python模块

日期和时间

Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。

1
import time

随机数

1
import random

1. 从一个list中随机选取一个元素

1
2
3
import random
data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
random.choice(data) # 随机选取一个元素

2. 从一个list中随机选取多个元素

1
2
3
4
import random
data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
sample_num = 5
random.sample(data, sample_num) # 结果['a', 'd', 'b', 'f', 'c'],每次运行结果不同。

3. 从data和label中随机选取多个元素

在制作数据集时,可能会有只用50%的数据的要求,所以,我们从原数据集中随机抽取30%的数据,这还要求了,datalabel是对应的。接下来,讲讲我的做法。创建一个索引list,在索引list中选取N个索引,根据这些索引将data和label的数据提取出来。

1
2
3
4
5
6
7
8
9
10
11
12
import random
data = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
label = [0, 1, 2, 3, 4, 5, 6, 7]
sample_num = int(0.5 * len(data)) # 假设取50%的数据

sample_list = [i for i in range(len(data))] # [0, 1, 2, 3, 4, 5, 6, 7]

sample_list = random.sample(sample_list, sample_num) #随机选取出了 [3, 4, 2, 0]

sample_data = [data[i] for i in sample_list] # ['d', 'e', 'c', 'a']

sample_label = [label[i] for i in label] # [3, 4, 2, 0]

linux脚本式编程

方法一:

1
python3 test.py

image-20201216094953594

方法二:

先用

1
which python3

查看python3路径

image-20201216100316992

然后在脚本顶部(第一行)添加以下命令让Python脚本可以像SHELL脚本一样可直接执行:

1
#! /usr/bin/python3

image-20201216100450600

然后修改脚本权限,使其有执行权限,命令如下:

1
$ chmod +x test.py

image-20201216095227092

执行

image-20201216100518745

遇到的问题

1.输出中文报错。

image-20201215170810402

原因:python默认使用ascii编码,使用中文要在文件顶部写上# coding=UTF-8

image-20201215170929958

2.vscode中英文混合输出时中文显示为ascii码。

image-20201216091806856

image-20201216091716442

原因:python2编译运行代码会出现问题,由于系统中自带了python2,然后vscode又没有使用我安装的python3编译代码,所以需要更改一下vscode的配置。

image-20201216092015590

image-20201216092047062

更改后编译显示正常。

image-20201216092126921

3.for循环直接更改list内容不成功

以下方法不能成功更改列表内容

image-20201217102735505

需要用这种写法

image-20201217102924217

4.在同一行逐字打印

python默认打印换行,但是如果用

1
print(i, end=' ')

的话在终端会过一会一起输出,这是因为终端执行默认是把一行的内容缓存到一起,然后才打印。

我们在运行代码时,加上-u参数,即立即打印不缓存,即可正常。

1
python3 -u tinyGame.py

5.vscode一直提示pylint安装不成功

image-20201217150308466

需要换源,换成淘宝源

1.在/etc/目录下边创建pip.conf文件

image-20201217151439419

2.在打开的pip.conf文件内写入以下内容:

1
2
3
4
5
6
7
[global] 

index-url=http://mirrors.aliyun.com/pypi/simple/

[install]

trusted-host=mirrors.aliyun.com

保存退出,可以看到下载速度显著提升。

image-20201217153017125

6.python判断用户键盘输入的是回车后执行逻辑

不能使用

1
2
if(input() == '\n'):
print('hello')

需要使用

1
2
if(input() == ''):
print('hello')

原因:input()函数中,默认是把回车键删除,所以最后输入的内容只剩下空的字符串。