Python是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构,它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。
优点:易读易学、可移植性、可嵌入性、可扩展性
解释型:开发过程中没有了编译这个环节。类似于PHP和Perl语言;(解释的是Python字节码,而不是Python源代码)
交互式:可以在一个 Python 提示符 >>> 后直接执行代码;
面向对象: Python支持面向对象的风格或代码封装在对象的编程技术。
关键字:Python解释器、Python字节码、Python虚拟机
首先将Python源代码(.py文件)通过Python编译器编译生成Python字节码(.pyc文件),
然后再由Python虚拟机(PVM)来执行Python字节码,最后在终端输出运行结果。
Linux/UNIX运维:提供API,能方便进行系统维护和管理。
GUI程序开发(PyQt、Kivy等)
Web程序开发(Django、Flask等框架):支持最新的XML技术。
移动App开发(PyQt、Kivy等):Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。
网络爬虫(为搜索引擎、深度学习等领域提供数据源)
网络编程(基于Socket等协议):提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。
图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。
文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。
数据库编程:可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,Mysql、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。
数据科学:NumPy扩展提供大量与许多标准数学库的接口。机器学习(scikit-learn、TensorFlow框架)、数据统计分析和可视化(Matplotlib、seaborn框架)。
(1)官网下载地址:https://www.python.org/downloads/windows/
(2)选择程序安装: Windows installer (64-bit),我这里下载最新的3.11.2版本
(3)安装的时候记得勾选上Add python.exe to PATH,会自动配置环境变量。
(4)在cmd中输入 python --version
验证是否安装成功
(5)输入python即可进入交互模式, exit()退出
(1)官网下载地址:https://www.python.org/downloads/source/
(2)选择程序安装: Gzipped source tarball,我这里下载最新的3.11.2版本
(3)安装步骤
①解压:tar -zxvf Python-3.11.2.tgz
②进入解压后的目录后执行配置文件,这里我选择的安装目录是/usr/local/python3.11
cd Python-3.11.2
./configure --prefix=/usr/local/python3.11
如果报错:no acceptable C compiler found in $PATH
则需要安装gcc环境:yum install gcc
③编译,需要等待一定时间
make && make install
④进入/usr/local,发现python3.11已经生成则编译成功,
⑤删除python2版本,然后创建软链接
rm -f /usr/bin/python
ln -s /usr/local/python3.11/bin/python3.11 /usr/bin/python
(4)在cmd中输入 python --version
验证是否安装成功
(5)输入python即可进入交互模式, exit()退出
(1)逻辑行的“首行”需要顶格,即无缩进
(2)相同逻辑层(同一个代码块)保持相同的缩进量( Python PEP8 编码规范,指导使用4个空格作为缩进)
(3)可以使用";"号将多个逻辑行合并成一个物理行
i=1;j=2;print(i,j)
// 等效于
i = 1
j = 2
print(i, j)
(4)可以使用""对一个逻辑行进行换行,书写为多个物理行。
print("1\
2")
等同于
print("12")
(5)":"标记一个新的逻辑层
while循环、if分支、函数声明、类定义等:增加缩进表示进入下一个代码层;减少缩进表示返回上一个代码层
a = 1;b = 2
if a == 2:
print(a)
else:
print(b)
(1)自定义函数
def 函数名(参数列表):
函数体
def myFunction(name):
print(name,"better have my money")
>>> myFunction('tom')
tom better have my money
(2)常用内置函数
①map(func,sequence[, sequence, …])
此函数会将sequence中的每一位元素作为参数传递到func中,并将func的计算结果加入到新列表内,返回值是map对象,可以使用list()转换后查看。
def func(x, y, z):
return x + y + z
result = map(func, [1,2,3], [1,2,3], [1,2,3])
print(list(result))
②filter()
filter()函数用于过滤序列,过滤不符合的数据,返回有符合元素组成的序列。
def postiveNumber(s) :
return s > 0
print(list(filter(postiveNumber, [888,-23,4,-1.3])))
③all()
all()函数用于判断给定的可迭代参数中是否含有元素为0、’’、False,有则返回false,没有则返回true,常用于判断是否为空
④range()
创建一个整数列表
range(5)#等于range(0,5)
[0, 1, 2, 3, 4]
>>> range(1, 5)#不包含5
[1, 2, 3, 4]
>>> range(1,5,2)# 步长为2
[1, 3]
⑤len()
返回字符串或者序列的长度
⑥int()
int(x,y),其中x可以为数字字符串或者数字,y为数字,表示将x转换为y进制的整数
int(f),其中f为一个浮点数,默认会向下取整,即不会四舍五入,只保留整数部分
⑦ord()/chr()
ord©,其中c为字符,返回对应的ASCII码
与ord()对应,chr()参数为一个0~255的数字,返回对应的字符
⑧upper()/lower()
str.upper()/lower(),将字符串str中的字母变成大写/小写
⑨isupper()/islower()/isalpha()/isnumeric()
str.isupper()/islower(),如果str中的字母全部为大写/小写,即使包含其他字符,就返回True;否则返回false
str.isalpha(),判断此字符是否为大写或者小写字母,是字母返回True,否则返回False
str.isnumeric(),判断此字符是否为数字字符,是就返回True,否则返回False
⑩sum()
sum(iterable[,n]),其中iterable为可迭代对象,[]中的内容表示可选参数。该函数做的事情是,先计算iterable中的元素和,再讲计算的结果加n,得到最终结果。
注意:可迭代对象只能被使用一次,第二次使用会变成空的。
(3)数据类型及运算
Ⅰ.Python 六大数据类型:
数字: 包含int(整型)、long(长整型,但python3中已经没有了,python3中只有int)、complex(复数)、float(浮点型)、bool(布尔型)
字符串(String): 比如:“hello world”,“python”
列表(List): 比如:[1,2,3,4],[’a‘,‘b’,‘c’,‘d’]
字典(Dictionary):例如:{“name”:“poge”,“age”:30}
元组(Tuple): 例如:(1,‘hello’,3)
集合(Set):例如:{’a‘,’b‘,’c‘,’d‘}
其中有几种类型需要注意的:
bool:
True对应整数1,False对应整数0;
等同于True的值:非零数值、非空字符串;其他都为false
String:
单引号和双引号是等价的;
三重引号(三个单引号/双引号)用来表示块字符串;
转义字符为;
raw字符串的格式是r’…’,raw字符串中,所有的字符都是直接按照字面意思来解释,不需要转义,如r’D:’
切片(分片)使用:s = ‘abcde’ ; s[1:3] = ‘bc’
连接字符串:操作符(“+”)、操作符(%,%s表示字符串) 、join()方法
'Python is good’使用这三种方式分别为:
'Python'+' '+'is'+' '+'good'
'%s %s %s'%('Python','is','good')
' '.join(('Python','is','good'))
replace()函数:'Python is good'.replace('P','p')
Ⅱ.运算:
布尔运算(and、or、not):遵循短路法则
a and b ,如果a是False,则整个结果必定为False,因此返回a的值,如果a是True,则表达式的结果取决于b,因此返回b
a or b ,如果a是True,则整个结果必定为True,因此返回a的值,如果a是False,则表达式的结果取决于b,因此返回b
数值运算:+、-、*、/、//(整除)、%(余数)、**(幂运算)
数值计算函数库:可自行了解,涵盖了三角函数、幂函数和一些高等函数
Ⅲ.格式化
正则格式化:
%c:转成字符(ASCII)
print("%c,%c" % (65, 97))
结果如下:
A,a
%s/%r:字符串转换,前者优先使用str()函数(不带引号),后者优先使用repr()函数(带引号)
s = 'python'
print("%s"%(s))
print("%r"%(s))
结果如下:
python
'python'
%e/%f/%g:-%e是用科学记数法计数;%f是按指定精确格式化浮点数(默认保留6位);%g是根据数值的大小采用e或%f
print('%e'%10000000)
print('%f'%10000000)
print('%g'%10000000)
print('%g'%0.58991111)
print('%.3g'%0.58)#保留三位小数
print('%.3f'%0.58)
结果如下:
1.000000e+07
10000000.000000
1e+07
0.589911
0.58
0.580
函数格式化:
format()方法举例
print("a={},b={}".format(2, 4))
print("a={1},b={0}".format(2, 4))#1和0代表展示顺序
print("a={usa},b={uk}".format(uk=2, usa=4))#可以命名变量
结果如下:
a=2,b=4
a=4,b=2
a=4,b=2
字典格式化:
print("%(name)s,%(age)s" % {"name": "riri", "age": 18})
riri,18
(4)条件和循环
if/else使用:
day = 5
if day in [1,2,3,4,5]:
print("今天是工作日。")
else:
print("今天非工作日。")
三元表达式:
day = 5
print("今天是工作日。") if day in [1,2,3,4,5] else print("今天非工作日。")
for循环:
for i in [1,2,3,4,5,6,7]:
print(i)
while循环:
i=1;n = 3
while i <= n:
i = i+1
else:
print(i)
(5)类(对象)
创建方式:
class ClassName(bases):
#class是关键字,bases是要继承的父类,默认继承object类(Python3特性)。class_suite是类体,主要包含属性和方法
class_suite
python3中默认继承object常用的方法如下:
__new__(cls, *args, **kwargs):创建对象时自动调用的函数
__init__(self):初始化函数(构造函数)
__str__(self):对象描述函数,作用是返回当前对象的字符串类型的信息描述
__repr__(self):类似__str__,只是该函数是面向解释器的。
__del__(self):删除该对象时会自动调用,一般用于工具型对象的资源回收。
__call__(self):该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用。
例1:
class People: # 类名
name = "张三" # 属性名
def getName(self):# 方法名
return self.name
people1 = People()
print(people1.name)
print(people1.getName())
例2:
class Student:
def __new__(cls, *args, **kwargs):
print("测试类的__new__方法")
return super().__new__(cls)
# 调用父类的创建对象的函数,进行当前对象的创建
def __init__(self, name, age, sex):
print("测试类的初始化函数__init__")
self.name = name
self.age = age
self.sex = sex
def __del__(self):
print("测试类的__del__方法")
student1 = Student("张三","28","男")
可以看到初始化的时候会调用内置的__new__和__init__方法
(6)lambda表达式
为什么要使用lamda表达式?
可以省去定义函数的过程,让代码更加简洁;可以在用完后立即释放,提高程序执行的性能。
使用示例:
def函数写法
def add(a, b):
return a + b
print(add(10, 20))
lambda函数写法
add_lambda = lambda a, b: a + b
print(add_lambda(10, 20))
(7)异常处理
try … except(… else)( … finally ) 语句:
num1 = 20
num2 = 1
try:
num3 = num1 / num2
except ZeroDivisionError:
print("除数不可以为 0 ")
except TypeError:
print("除数类型不对")
else:
print("无异常,会被执行")
常见异常类型:
AttributeError 某个对象没有属性
Exception 通用型异常对象
FileNotFoundError 找不到文件
IOError 输入输出异常
IndexError 索引异常
KeyError 键异常
NameError 对象名称异常
SyntaxError 语法错误
TypeError 类型错误
ValueError 值错误
(8)练习
输出1000-3000中的每一位都为偶数的数字:
答案1:
lst = [
str(i) for i in range(1000, 3001)
] #创建一个1000-3001的字符串list,转成字符串是为了能根据位数来拆分数字
def check(element):
return all(
ord(i) % 2 == 0 for i in element
) # 只有每一位都是偶数才返回true
lst = filter(check, lst)
print(list(lst))
答案2:
s=[str(n) for n in range(1000,3001)]
res=filter(lambda n:all(int(i)%2==0 for i in n),s)
print(list(res))
四、常用工具库
1.参数解析管理(argparse)
argparse:模块是 Python 内置的用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。
它是汇总函数接口,方便传参。
常用于传参的集中管理:
无论有多少参数需要传,我们只要在argparse中写好需要传的参数,在传参时传入args.参数名,需要修改传参值时,统一在argparse中进行修改即可,这样就方便了参数的管理
(1)例:
导入库
import argparse
parser = argparse.ArgumentParser(description='Demo of argparse')
parser.add_argument('--epochs', type=int, default=30)
parser.add_argument('--batch', type=int, default=4)
args = parser.parse_args()
print(args)
epochs = args.epochs
batch = args.batch
print('show {} {}'.format(epochs, batch))
(2)add_argument方法API
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
各个参数解释如下:
name or flags:选项字符串的名字或者列表,例如 foo 或者 -f, --foo;
action:命令行遇到参数时的动作,默认值是 store;
store_const:表示赋值为const;
default :不指定参数时的默认值。
type:命令行参数应该被转换成的类型;
choices:参数可允许的值的一个容器;
nargs :应该读取的命令行参数个数,可以是具体的数字,或者是?号,当不指定值时对于 Positional argument 使用 default,对于 Optional argument 使用 const;或者是 * 号,表示 0 或多个参数;或者是 + 号表示 1 或多个参数。
required:可选参数是否可以省略 (仅针对可选参数)。
help:参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
metavar:在 usage 说明中的参数名称,对于必选参数默认就是参数名称,对于可选参数默认是全大写的参数名称.
dest:解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线.
const:action 和 nargs 所需要的常量值。
append:将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
append_const:将参数规范中定义的一个值保存到一个列表;
count:存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;
2.时间日期处理(datetime)
(1)datetime五大类:
datetime.date:表示日期的类,常用的属性有year, month, day
datetime.datetime:表示日期时间的类,常用的属性有hour, minute, second, microsecond
datetime.time:表示时间的类
datetime.timedelta:表示时间间隔,即两个时间点的间隔。在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算
datetime.tzinfo:时区的相关信息
(2)例:
import datetime
now = datetime.now()
yesterday = now + timedelta(days=-1) # 昨天
#输出指定格式
print(‘strftime():’, yesterday.strftime(“%Y-%m-%d %H:%M:%S”))
#获取指定日期
day1 = datetime.date(2023,4,15)
print(day1)
3.文件读写
(1)文件读写的步骤:
①从硬盘中读取一个文件路径;
②加载文件到内存中,获取文件对象(也叫文件句柄);
③通过文件对象对对接进行读写操作;
④关闭文件
(2)文件打开模式
r:打开的文件为只读模式。文件指针位于文件的开头,这是默认模式。
rb:打开仅用二进制格式读取的文件。文件指针位于文件的开头,这是默认模式。
r+:打开读写文件。文件指针放在文件的开头。
rb+:以二进制格式打开一个用于读写文件。文件指针放在文件的开头。
w:打开仅供写入的文件。 如果文件存在,则覆盖该文件。 如果文件不存在,则创建一个新文件进行写入。
wb:打开仅用二进制格式写入的文件。如果文件存在,则覆盖该文件。 如果文件不存在,则创建一个新文件进行写入。
w+:打开写入和取读的文件。如果文件存在,则覆盖现有文件。 如果文件不存在,创建一个新文件进行阅读和写入。
wb+:打开一个二进制格式的写入和读取文件。 如果文件存在,则覆盖现有文件。 如果文件不存在,创建一个新文件进行阅读和写入。
a:打开一个文件进行追加。 如果文件存在,则文件指针位于文件末尾。也就是说,文件处于追加模式。如果文件不存在,它将创建一个新文件进行写入。
ab:打开一个二进制格式的文件。如果文件存在,则文件指针位于文件末尾。 也就是说,文件处于追加模式。如果文件不存在,它将创建一个新文件进行写入。
a+:打开一个文件,用于追加和阅读。 如果文件存在,则文件指针位于文件末尾。 文件以附加模式打开。 如果文件不存在,它将创建一个新文件进行阅读和写入。
ab+:打开一个二进制格式的附加和读取文件。 如果文件存在,则文件指针位于文件末尾。文件以附加模式打开。如果文件不存在,它将创建一个新文件进行读取和写入。
(3)例:
#文件写入
file = '1.txt'
f = open(file, 'w')
f.write( "Python is a great language.\nYeah its great!!\n")
f.close()
#文件读取,中间的参数为文件打开模式
file_obj = open(file,'r',encoding='utf-8')
content = file_obj.read()
print(content)
file_obj.close()
4.连接数据库
拿mysql举例,其他数据库除了安装和连接方式不同,游标和执行sql过程基本一致
常见的有四种方式:mysqlclient、mysql-connector-python、PyMySQL、aiomysql,这里只介绍PyMySQL。
①安装pyMysql:
cmd输入: pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
②导入mysql,并建立连接,输入你本地的host及用户密码
import pymysql
con=pymysql.connect(host='xxx',password='xxx',port=3306,user='xxx',charset='utf8')
③创建游标对象,执行sql命令
cur=con.cursor()
cur.execute('show databases')
④获取执行结果
cur.fetchone()#返回前一条记录
cur.fetchmany(2)#返回前两条记录
cur.fetchall()#返回所有记录
⑤关闭游标和数据库连接
cur.close()
con.close()
5.邮件(smtplib)
(1)安装:cmd输入 pip install PyEmail
(2)示例:
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail(subject,text):
#self.my_sender='**@qq.com' # 发件人邮箱账号
#self.my_pass = '****' # 发件人邮箱密码(当时申请smtp给的口令)
my_sender='***@qq.com' # 发件人邮箱账号
my_pass = '*****' # 发件人邮箱密码(当时申请smtp给的口令)
my_user='****@qq.com' # 收件人邮箱账号
try:
msg=MIMEText(text,'HTML','utf-8')
msg['From']=formataddr([my_sender,my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr([my_user,my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']= subject # 邮件的主题,也可以说是标题
#server=smtplib.SMTP("smtp.163.com", 25) # 发件人邮箱中的SMTP服务器,端口是80
server=smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是80
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,[my_user,],msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit()# 关闭连接
print('发送成功')
except Exception:# 如果 try 中的语句没有执行
print('发送失败\t\n')
6.源码打包(pypi)
PS:这个知识点可以在学完web程序开发后再学习
将代码上传到PyPi上后,所有人可以通过pip install 方式进行下载。
(1)注册,注册完需要邮箱验证:https://test.pypi.org/account/register/
(2)用户信息验证
①windows:创建用户信息文件.pypirc(在你的用户目录下如C:\Users\12277)
[distutils]
index-servers=pypi
[pypi]
repository = https://pypi.python.org/pypi
username = 你注册的用户名
password = 你注册的密码
②linux:需要上传的时候 执行python setup.py register 然后就可以输入用户名 密码即可
五、Web程序开发
1.基础知识
(1)相关概念
WSGI: 全称是Web Server Gateway Interface,WSGI是描述web server如何与web application通信的规范。
要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Torando,Flask,Django
uwsgi: 与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,
与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
uWSGI: 是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。
(2)python常用的web框架:
Django:全能型Web框架
Flask:一个使用Python编写的轻量级Web框架
web.py:一个小巧的Web框架
Bottle:和Flask类似的Web框架
Tornado:Facebook的开源异步Web框架
(3)python常用的web服务器:
uWSGI(功能多但配置复杂)、Gunicorn(配置简单)、bjoern(快、轻量级)
2.Django
(1)介绍:Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T(模式本质上和 MVC 是一样的)。
(2)windows安装:pip install Django==4.2。官网下载地址为https://www.djangoproject.com/download/
验证: import django
django.get_version()
(3)创建项目(python:3.11.2,django:4.2)
cmd运行: django-admin startproject HelloWorld
可以看到项目结构如下
|-- HelloWorld #项目的容器
| |-- __init__.py #一个空文件,告诉 Python 该目录是一个 Python 包
| |-- asgi.py #一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目
| |-- settings.py #该 Django 项目的设置/配置
| |-- urls.py #该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"
| `-- wsgi.py #一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
`-- manage.py #一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互
(4)启动服务器
cd HelloWorld
python manage.py runserver 0.0.0.0:8000
进入localhost:8000即可看到一个django项目
(5)新建视图
①在目录下新建视图文件(我把项目导入了idea方便查看和新增文件):HelloWorld/HelloWorld/views.py
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world ! ")
②修改HelloWorld/HelloWorld/urls.py 文件代码,像下面代码直接替换原文件:
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello),
]
③访问视图:http://127.0.0.1:8000/hello/
注意:这里使用HttpResponse直接输出"Hello world !",将数据和视图混在一起不符合MVC的设计思想,下面我们将使用模板。
(6)新建模板
①在HelloWorld下新建templates目录(与manage.py同一层),在templates下新增文件index.html,内容为
>{{ hello }}
>
②修改settings.py,导包os,找到TEMPLATES的’DIRS’并修改
from pathlib import Path
import os # 修改位置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 修改位置
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
③修改views.py,替换成下面代码
from django.shortcuts import render
def hello(request):
context = {}
context['hello'] = 'Hello World 2!'
return render(request, 'index.html', context)
④访问视图:http://127.0.0.1:8000/hello/
发现输出结果Hello World 2!
django的更多使用可以参考https://m.runoob.com/django/
1.urllib
2.requests
3.正则表达式
4.Beautiful Soup
5.lxml
6.selenium
7.scrapy
8.pyspider
9.验证码
10.模拟登录
11.动态渲染页面爬取
12.autoscraper
13.selectolax
14.requests-html
1.Tkinter
2.PyQT
3.WxPython