Python 基础知识总结
本文总结了 Python 基础和使用 Python 编写脚本所涉及的知识。
由于 shell 脚本的书写和阅读都比较困难,并且 CentOS 7 自带 python2.7,拟改用 python 编写部署脚本,记录下学习内容,知识点大体覆盖脚本编写。
一、python 基础
1.1 变量
数字:a = 1 或 a = 1.0
常用计算:加(+)、减(-)、乘(*)、除(/)、乘方(**)
字符串:a = 'hello' 或 a = "hello"
查看变量 a 的类型:type(a)
变量 a 转字符类型:str(a)
变量 a 转整数类型:int(a)
注释:# 注释一行 ,''' 注释多行 '''
1.2 if 语句
格式:
if 表达式 : |
举例:
a = [] |
或
a = 'hello world' |
1.3 while 语句
格式:
while 表达式: |
举例:
a = 0 |
1.4 for 语句与 range 函数
for 语句格式:
for 变量 in 序列: |
range 函数:生成整数列表
格式:range(start, stop[, step]),start 默认是 0,step 默认是 1,stop 必须有,范围左闭右开,即 [start, stop)
举例:
for i in range(5): |
1.5 输入输出
| python2 | python3 | |
|---|---|---|
| 输入 | a = raw_input() 输入内容会被转换成字符串,建议使用 a = input() 输入什么类型就是什么类型 |
a = input() 输入内容会被转换成字符串 |
| 输出 | print a |
print(a) |
| 不换行输出 | print a, |
print(a, end='') |
1.6 列表
定义列表: a = [1, 2, 'hello', 3]
随机访问: a[下标],如 a[0] ,a[-1] 表示最后一位元素
获取 a 列表第 0、1 个元素:c = a[0:2]
翻转 a 列表:d = a[::-1]
复制列表:b = a[:]
打印列表: print a
遍历访问:
for element in a: |
修改列表: a[index] = value
添加元素:
a.append(element) # 尾部添加 |
删除元素:
del a[index] # 知道下标 |
一些补充:
len(a)获取列表元素个数a.sort()对列表永久排序sorted(a)对列表临时排序a.reverse()对列表元素进行翻转
1.7 元组
可以看作列表常量:a = (1, 2, 'hello', 3)
如果只有一个元素: b = (1,) 用逗号结束,为了避免歧义:(1) 表示小括号中 1
遍历元组:
for element in a: |
元组的元素不可更改:a[0] = 0 会异常
如果元组里面的元素是列表,那么列表里的元素可以修改
c = [1, [1, 2], 3] |
1.8 字典
创建字典: a = dict()
添加元素:
a = dict() |
修改元素: a['age'] = 18
删除某个键值对: del a['age']
遍历字典:
for key, value in a.iterms(): # 遍历 key, value |
1.9 函数
格式:
def function(参数): |
位置参数:def f(a):
关键字参数:def f(a = 1):
位置参数必须在关键字参数之前
参数顺序必须是位置参数 关键字参数 任意数量参 任意数量的关键字参数
1.10 文件读写
语法:
file = open(file_name [, access_mode][, buffering]) |
推荐:
with open('文件名') as file: |
打开文件模式:
| 文件模式 | 描述 |
|---|---|
| r | 只读 |
| w | 只写 |
| a | 只追加 |
| r+ w+ | 可读可写 |
| a+ | 读写追加 |
| rb wb ab | 二进制文件读 写 追加 |
| rb+ wb+ | 二进制文件可读可写 |
| ab+ | 二进制文件读写追加 |
常用函数:
file.read() # 读取所有内容 |
1.11 类
class person(): # person 是类名 |
1.12 异常
语法:
try: |
通常通过打印异常类型来判断产生某种异常:
try: |
二、python 脚本
2.1 python 脚本执行 shell 命令
无返回值
import os
os.system(cmd) # 执行命令但不返回结果有返回值
from subprocess import Popen, PIPE
def run_cmd(cmd):
res = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=True)
out, err = res.communicate()
ret = res.wait()
return (ret, out, err)
# ret 是命令执行返回码 0 是成功 1 是失败
# out 是命令执行结果 err 是错误信息
ret, out, err = run_cmd('ls /root') # 调用 shell 执行
2.2 python 读取 json 文件
# unicode 转 utf-8 |
2.3 python 访问 pg 数据库
python2 需要安装 pip2 和 psycopg2
下载地址:https://pypi.org/project/psycopg2-binary/
import psycopg2 |
2.4 python 写日志文件
import logging |
日志级别:
设置了输出 level,系统便只会输出 level 数值大于或等于该 level 的的日志结果,例如我们设置了输出日志 level 为 INFO,那么输出级别大于等于 INFO 的日志,如 WARNING、ERROR 等,DEBUG 和 NOSET 级别的不会输出。
| 级别 | 数值 |
|---|---|
| CRITICAL | 50 |
| FATAL | 50 |
| ERROR | 40 |
| WARNING | 30 |
| WARN | 30 |
| INFO | 20 |
| DEBUG | 10 |
| NOTSET | 0 |
Formatter:
| 格式 | 含义 |
|---|---|
| %(levelno)s | 打印日志级别的数值 |
| %(levelname)s | 打印日志级别的名称 |
| %(filename)s | 打印当前执行程序名 |
| %(pathname)s | 打印当前执行程序的路径,其实就是 sys.argv[0] |
| %(funcName)s | 打印日志的当前函数 |
| %(lineno)d | 打印日志的当前行号 |
| %(asctime)s | 打印日志的时间 |
| %(thread)d | 打印线程 ID |
| %(threadName)s | 打印线程名称 |
| %(process)d | 打印进程 ID |
| %(processName)s | 打印进程名称 |
| %(module) | 打印模块名称 |
| %(message)s | 打印日志信息 |
三、python 进阶
3.1 生成器
列表生成式
# 生成列表 |
生成器
a = (x * x for x in range(6)) |
引入 yield 关键字
yield 的作用等价于 return,但是再次调用函数的时候会从 yield 语句的下一句开始执行
def square(n): |
总结: 生成器就是列表生成式的内存优化
3.2 高阶函数
命令式编程: 关心解决问题的步骤
函数式编程: 关心数据的映射
函数式编程特性:
- 函数必须有输入和输出
- 输入不变,输出一定不变
- 变量不可变,
x = 1就不能修改x的值 - 高阶函数
高阶函数: 允许把函数本身作为参数传入另一个函数,还允许返回一个函数
命令式(c 语言)
int add_abs(int a, int b) { |
函数式(c 语言)
int add_abs(int a, int b) { |
python 中的高阶函数:
map: 对序列中每个元素调用函数并返回成一个新的列表格式:
map(函数, 序列)reduce: 把函数执行的结果作为一个参数与下一个元素进行计算格式:
reduce(函数, 序列)注: 该函数必须两个参数
filter: 对序列中每一个元素调用函数,返回值是 false 则丢弃格式:
filter(函数,序列)sorted: 按照指定顺序排序格式:
sorted(序列,比较函数)关于比较函数通常认为两个元素
x,yx < y返回-1x == y返回0x > y返回1
3.3 匿名函数
def f(x): |
等价于
lambda x: x*x |
匿名函数通常用作参数传给高阶函数
表达式只能用纯表达式,不能赋值或使用 while、try 等语句
a = ['hello', 'name', 'test'] |
3.4 装饰器
假设函数 func 返回的结果并不是需要的,但是又不想改变 func 的源码,该如何做?
def dec_f(func): # 把函数作为参数传进来 |