python简介
- python有两个版本python2(最新的为python2.7)和python3,两个大版本同时在维护
- python3-cookbook中文文档
- Python3菜鸟教程
Python安装
- Python下载镜像地址
- Linux
- 默认有python2环境,python3安装参考《CentOS服务器使用说明#python3安装》
- Windows
- 直接下载安装包
- 环境变量设置(可选): 设置
PYTHON_HOME=D:/software/python3
,并设置Path=.;%PYTHON_HOME%;%PYTHON_HOME%\Scripts
- python多环境: 安装pyenv-win
- Mac(M1很多包都不支持,可切换x86环境)
- python多环境(python多版本): 安装pyenv
- M1安装的pyenv,此时安装python v3.6会有问题。可先安装x86的brew然后安装pyenv,参考brew。安装参考: https://notemi.cn/installing-python-on-mac-m1-pyenv.html
- 安装python3.6和python3.7仍然失败
1 | ## 安装pyenv |
- pip安装: 一般服务会自带pip,没有可进行安装
1 | sudo yum -y install epel-release |
pyenv用于多python版本环境
- 参考上文
pipenv和virtualenv虚拟环境工具
1 | # xzsh # 命令别名,基于Mac模拟x86环境 |
pip镜像及模块安装
- pip镜像
1 | # 镜像地址 |
- pip 可用于安装管理python其他模块
- 安装(windows默认已经安装)
- 将
https://bootstrap.pypa.io/get-pip.py
中的内容保存到本地get-pip.py
文件中 - 上传
get-pip.py
至服务器,并设置为可执行 python get-pip.py
安装- 检查是否安装成功:
pip list
可查看已经被管理的模块
- 将
- 更新:
pip3 install --user --upgrade pip
如果idea+virtualenv更新失败,可进入虚拟环境目录通过管理员更新 - 常见问题
- 安装成功后,使用
pip list
仍然报错。windows执行where pip
查看那些目录有pip程序,如strawberry(perl语言相关)目录也存在pip.exe,一种方法是将strawberry卸载
- 安装成功后,使用
- 安装(windows默认已经安装)
- 模块安装
1 | pip install xxx |
python2和python3的语法区别
1 | ## print打印 |
python基础(易混淆/常用)
基本语法
符号/关键字
# xxx
、"""xxx"""
、'''xxx'''
均可进行注释- 使用缩进进行语句层级控制,不像java等语言的
{}
- 每一行代表一个语句,语句结尾以分号
;
结束,也可省略此分号 - 单引号(‘’)/双引号(“”)效果一样,都可表示字符串;三个单引号(‘’’’’’)/双引号(“”””””)可表示多行
name = 'smalle'; age = 18; print 'name: %s, age: %s' % (name, age);
引号中的变量替换(如果只有一个变量可以省略括号,如果是数值也可以换成%d
,%.2f
表示浮点型保存两位小数)
,
或+
为字符串连接符
变量
- 命名同java(区分大小写)
- 变量无需声明类型:如
name='smalle',name=123
print(name)
打印变量(python2语法为print name
)print(name, password)
打印多个变量,中间默认用空格分割
del name
变量销毁id(a), id(b), id(c)
查看a、b、c三个变量的内存地址(0-255的数字python会做优化:a=1、b=a、c=1
此时内存地址一致)
运算
- 不支持
++
运算符 - 不支持三元运算符,代替方式:
max = a if a>b else b
1 | # 幂:为2的32次方 |
数据类型
- 数据类型
- 整型(布尔bool、长整型L、标准整型int)
- 浮点型(floot)
- 序列(字符串str、元组tuple、列表list)
- 映像类型(字典dict)
- 集合(可变set、不可变集合frozenset)
- 举例
1 | ## 赋值 |
None/False
- None 和 False ^4
None
:是python中的一个特殊的常量,表示一个空的对象(NoneType),空值是python中的一个特殊值。数据为空并不代表是空对象,例如[]
、''
等都不是None。None和任何对象比较返回值都是False,除了自己False
:在python中None
,False
,空字符串""
,0
,空列表[]
,空字典{}
,空元组()
都相当于False
,即not None == not False == not '' == not 0 == not [] == not {} == not ()
- 自定义类型还包含以下规则 ^5
- 如果定义了
__nonzero__()
方法,会调用这个方法,并按照返回值判断这个对象等价于True还是False - 如果没有定义nonzero方法但定义了
__len__
方法,会调用len方法,当返回0时为False,否则为True(这样就跟内置类型为空时对应False相同了) - 如果都没有定义,所有的对象都是True,只有None对应False
- 如果定义了
- is 和 ==
is
:表示的是对象标识符,用来检查对象的标识符是否一致,即两个对象在内存中的地址是否一致。在使用a is b
的时候,相当于id(a) == id(b)
==
:表示两个对象是否相等,相当于调用__eq__()
方法,即'a==b' ==> a.__eq__(b)
- Python里和None比较时,使用
is None
而不是== None
:None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址;而== None
时调用的__eq__()
方法可能被重写
字符串
1 | print('变量值为:{}, value={value}'.format(my_var, value=123)) |
- 下划线驼峰转换
1 | import re |
列表
1 | list = ["smalle", "aezocn", 18, "smalle", "hello"] # 定义数组 |
元组
- 和列表很类似(区别在于元组定义了之后值不能改变)
1 | my_tuple = ('1', 2, 'smalle') # ('1',) |
字典
1 | map = {'name': 'smalle', "age": 18} # 定义 |
JSON转换
1 | import json |
流程控制
if
1 | # if语句 |
for
1 | # while循环 |
lambda
lambda [arg1 [, agr2,.....argn]] : expression
- lambda与def的区别
- def创建的方法是有名称的,而lambda没有
- lambda会返回一个函数对象,但这个对象不会赋给一个标识符,而def则会把函数对象赋值给一个变量(函数名)
- lambda只是一个表达式,而def则是一个语句
- lambda表达式
:
后面,只能有一个表达式,def则可以有多个 - 像if或for或print等语句不能用于lambda中,def可以
- lambda函数不能共享给别的程序调用,def可以
- 示例
1 | g = lambda x : x ** 2 |
yield
- 案例一
1 | ## 定义 |
- 案例二
1 | def foo(num): |
函数
- 函数传递参数的方式有两种:位置参数(positional argument,包含默认参数)、关键词参数(keyword argument)
*args
和**kwargs
:主要将不定数量的参数传递给一个函数。两者都是python中的可变参数*args
表示任何多个无名参数,它本质是一个tuple**kwargs
表示关键字参数,它本质上是一个dict- 如果同时使用
*args
和`kwargs时,必须
*args参数列要在
kwargs前。调用如
MyObj({‘name’: ‘smalle’})`为kwargs的传入 - 其实并不是必须写成
*args
和**kwargs
,*
和`才是必须的**。也可以写成
ar和
**k。而写成
args和
**kwargs`只是一个通俗的命名约定
- 访问级别(python中无public、protected、private等关键字)
public
方法和属性命名不以下划线开头protected
方法和属性命名以下划线(_
)开头private
方法和属性命名以双下划线(__
)开头- 访问私有方法或属性:
myobj._MyObj__func()
,如果使用myobj.__func()
则不行
- 访问私有方法或属性:
面向对象
- 经典类、新式类
- Python 2.x中默认都是经典类,只有显式继承了object才是新式类
- Python 3.x中默认都是新式类,不必显式的继承object
- python支持多继承
- 经典类采用深度优先搜索属性/方法
- 新式类采用广度优先搜索属性/方法
- 类定义
1 | class Employee: |
流/文件
1 | ## 获取控制台输入 [^3] |
文件
- 文件描述符
r
读取模式w
写入。如果文件存在则直接覆盖掉a
追加t
文本模式b
二进制模式x
模式在文件写入时,如果文件存在就报错。多个模式可使用如wb
或w+b
- 创建临时文件和文件夹相关库tempfile
- 增删改查文件
1 | ## 读取文件 |
- 文件路径处理、文件是否存在判断(os.path)
1 | import os |
网络请求requests
1 | # data: 会放到url参数中,java中使用`@RequestParam String curNode`接收 |
日志logging
1 | import logging |
- logging模块化:
common/logging.py
(为了防止日志重复打印应该创建此文件)
1 | import logging |
反射
1 | # 案例1:取值 |
常见错误
1 | map['key'] # 如果字典中不含这个key则会报错 KeyError |
其他
1 | # 1 |
模块
- 引入其他文件变量
from api.config import API_KEY
(映入api包下config.py文件中的API_KEY变量)
内置模块
os
1 | import os |
time
1 | import time |
tempfile
- 通过 TemporaryFile, NamedTemporaryFile, TemporaryDirectory 创建文件或目录,使用完成后会自动清理
gettempdir()
获取临时文件目录
1 | from tempfile import TemporaryFile, NamedTemporaryFile, TemporaryDirectory, gettempdir |
base64
1 | import base64 |
unittest
- 内置测试框架,类似Junit
1 | import unittest |
模块扩展
ConfigParser配置文件读取
- 该模块ConfigParser在Python3中,已更名为configparser
pip install ConfigParser
- 介绍:http://www.cnblogs.com/snifferhu/p/4368904.html
- 配置文件样例:
ini.cfg
1 | ; 注释 |
1 | from configparser import ConfigParser # python3 |
Mysql操作库
pip install mysqlclient
- 推荐,Fork自MySQLdb,使用相同:
import MySQLdb
- 或通过
pip install mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl
安装 使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import MySQLdb
# 注意 这里需要额外导入, 不然会报module 'MySQLdb' has no attribute 'cursors'的错误
import MySQLdb.cursors as cors
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8',
cursorclass=cors.DictCursor)
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql="insert into EMPLOYEE values(%s,%s,%s,%s)"
try:
# 执行sql语句
cursor.executemany(sql,[('Smith','Tom',15,'M',1500),('Mac', 'Mohan', 20, 'M', 2000)])
# 提交到数据库执行
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# 关闭数据库连接
db.close()
- 推荐,Fork自MySQLdb,使用相同:
pip install pymysql
(3.6)pip install MySQL-python
(又称MySQLdb,只支持2.7)报错
win8下 pip安装mysql报错_mysql.c(42) : fatal error C1083: Cannot open include file: ‘config-win.h’: No such file or director
。解决办法:安装 MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl 或MySQL-python-1.2.5.win32-py2.7.exe
(就相当于pip安装)
Flask提供web服务
定时调度库
- schedule:Python job scheduling for humans. 轻量级,无需配置的作业调度库
pip install schedule
1 | import schedule |
- 使用threading
1 | import threading |
- python-crontab:针对系统 Cron 操作 crontab 文件的作业调度库
- Apscheduler:一个高级的 Python 任务调度库
- Celery:是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具, 也可用于任务调度
MongoDB操作库
pip install pymongo
^2
Scrapy爬虫框架
OCR图像识别
muggle_ocr
验证码识别- 离线安装包(官方已经删除了这个包,无法通过pip安装): https://github.com/simonliu009/muggle-ocr
- 下载后离线安装
pip install muggle-ocr-1.0.3.tar.gz
- 下载后离线安装
- 源代码参考: https://github.com/litongjava/muggle_ocr
- 文章参考: https://www.cnblogs.com/kerlomz/p/13033262.html
- 离线安装包(官方已经删除了这个包,无法通过pip安装): https://github.com/simonliu009/muggle-ocr
1 | import time |
paramiko/fabric/pexpect自动化运维
paramiko
模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令、文件传输等功能fabric
模块是在paramiko
基础上又做了一层封装,操作起来更方便。主要用于多台主机批量执行任务pexpect
是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的Python模块
fabric
- 主要在python自动化运维中使用(能自动登录其他服务器进行各种操作)
pip install fabric
支持python2pip install fabric3
支持python3- 常见问题
- 报错
fatal error: Python.h: No such file or directory
- 安装
yum install python-devel
安装python-devel(或者yum install python-devel3
)
- 安装
- 报错
fatal error: ffi.h: No such file or directory
yum install libffi libffi-devel
安装libffi libffi-devel
- 报错
pexpect
- pexpect 是 Python 语言的类 Expect 实现。程序主要用于”人机对话”的模拟,如账号登录输入用户名和密码等情况
pip install pexpect
安装- 参考:https://www.jianshu.com/p/cfd163200d12
1 | # pexpect==4.6.0 |
其他扩展
- pytorch (AI相关)
- 1.13.1安装失败,参考 https://blog.csdn.net/qq_46037444/article/details/125991109
- 下载whl进行安装:https://download.pytorch.org/whl/torch_stable.html,windows下载 cpu/torch-1.13.1%2Bcpu-cp38-cp38-linux_x86_64.whl
- lxml 解析xml等格式
- mac M1安装失败,需要以x86安装python的包。参考:https://til.simonwillison.net/python/lxml-m1-mac
项目创建和发布
项目创建
PyCharm创建django项目
- PyCharm创建django项目
- File - New Project - Django - D:\gitwork\smpython\A02_DjangoTest(项目名需为字母数字下划线)
- Project Interpreter - New environment - Location可以选择(如django项目共用一个虚拟环境) - Inherit global不勾选(表示不包含全局包,否则
pip freeze
会多出很多全局包) - More Setting - Application Name - smtest(不要取test,会和Django自带名称冲突)
- 创建后默认包含
(虚拟环境名,如venv)
虚拟环境(与系统环境隔离,但是默认会使用系统的Python官方库)。再PyCharm中创建一个Terminal创建创建也会有venv
标识(默认打开的Terminal窗口没有) - 在有
venv
的Terminal创建安装类库则不会对系统产生干扰 - 启动django项目添加参数:如执行
python manage.py runserver --insecure
中的--insecure
可在Configuration
-Additional options
中配置
项目发布
- virtualenv使用参考下文(更建议使用pipenv)
- 记录客户端依赖(基于venv环境)
1 | # venv环境运行后会生成一个此项目依赖的类库列表文件(安装上述方法创建项目默认不包含Python官方库) |
- 服务器
1 | # python3 的 pip3 |
- 运行程序脚本如
1 | # 或者 nohup /home/smalle/venv/bin/python3 /home/smalle/pyproject/automonitor/manage.py runserver 0.0.0.0:10000 > console.log 2>&1 & |
工具
Jupyter
- Jupyter notebook
- Jupyter notebook(此前被称为 IPython notebook)是一个基于web的交互式笔记本、编辑器及运行平台,支持运行 40 多种编程语言,已成为科研探索类工作的主要编程和分享工具
- 启动 Jupyter notebook,只需要在 cmd 中,进入自己希望的工作目录后,键入
Jupyter notebook
命令即可。然后访问http://127.0.0.1:8888/tree
即可
JupyterLab
- 作为一种基于web的集成开发环境,可以使用它编写notebook、操作终端、编辑markdown文本、打开交互模式、查看csv文件及图片等功能。JupyterLab是Jupyter主打的最新数据科学生产工具
- JupyterLab包含了Jupyter Notebook所有功能
- 安装
1 | pip install jupyterlab |
IPython
ipython
是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数- https://blog.csdn.net/qq_39362996/article/details/82892671
- 案例
%matplotlib inline
这一句是IPython的魔法函数,可以在IPython编译器里直接使用,作用是内嵌画图,省略掉plt.show()
这一步,直接显示图像。如果不加这一句的话,我们在画图结束之后需要加上plt.show()才可以显示图像
参考文章