0x18 Python
1. 基础知识
- Python中变量的特点
- Python是一个解释型的动态语言。
- 解释型: 它是运行在 PVM 中,指令是逐条翻译执行的
- 动态语言: 变量类型是在运行中确定的,并且变量类型可以改变
- Python中的变量可以看作是一个 void* 指针,指向了实际的数据
- 基本变量类型
- float: 浮点数
- int: 整数
- str: 字符串 ‘’ “” “””三引号可以保留格式”””
- 命名规范
- 输入和输出
- Python3
- input(“”): 返回的始终是字符串
- eval(input(“”)): 返回的是实际输入的类型
- Python2
- input: 和3中的eval(input(“”))一样
- raw_input: 和3中的input一样
- 在 Python2中,print是一个表达式,3中,print是一个函数
- 格式化输出
- print(“%d %f” % (10, 10.0)) # 使用%进行输出
- print(“{0} {1:10.8f}”.format(10, 10.0))
- Python中的缩进
- Python中使用缩进标识代码块,不当的缩进会导致异常
2. 运算符和表达式
- and or not
- / //
- /: 表示直接进行除法运算
- 在Python2中,会根据类型保留小数
- 在Python3中,始终都会保留小数
- //: 截断除法
- 幂运算
- 成员关系运算符,判断当前的值是否在一个序列中
- if (‘a’ in “abc”) => True
- is: 判断两个变量的地址是否相等 l1 = l2 l1 is l2 ?
- ==: 判断值是否相等
- Python2 中 <> 表示不等,Python3废除
- if (“”)
- if ([])
- if ({})
- if ((,))
- if (False)
- if (0)
3. 元组列表和字典
- 所有的类型中都可以存放不同类型的数值
- 元组(不可变的)
- 定义: 关键是 , a = 1, 2 => (1, 2)
- 元组分解(解包)
- 将元组分解出每一个部分进行赋值,可以用于交换两个数
- a = 2;b = 3; a, b = b, a;
- 列表(可变的)
- 定义: 关键是 [], a = [1]
- 列表的深拷贝
- 默认的赋值时浅拷贝,修改任意一个,都会影响其它的
- 使用 list.copy() 函数可以进行列表的深拷贝
- 列表生成式
- [s.lower()*2 for s in “12Bcd%^&dsad” if s.isalpha()]
- 从一个列表中筛选出所有的字符串并转换为小写
- 字典
- 定义:关键是 {键:值}, d = {1:”111”, 2:”222”}
- 键和值的要求
- 获取键值对、键、值
- dict.items 键值对
- dict.keys 键
- dict.values 值
4. 可变类型和不可变类型
- 区分条件:修改数据的时候是否会改变地址,使用id查看地址
- 可变类型:
- 不可变类型
5. 三大结构
- 顺序结构
- 选择结构
- 循环结构
- for 元素 in 可迭代序列(列表 字典 元组 字符串 集合)
- **遍历元组**
- **遍历列表**
- **遍历字典**
- **for break else**
- 当for循环被break,就不执行 else
- 当for循环正常退出,则执行else代码
- while
- range
- 返回一个范围内的数据
- range(a, b, c)
- a: 数据的起始位置
- b: 数据的结束位置的后一个
- c: 步长
- range(10, 30, 3)
6. 切片操作
- 谁可以使用切片操作
- 列表和字符串可以使用切片操作
- str[a : b : c]: abc的含义同range len(s)
- 反转一个字符串
- “123456789”[::-1] \ reverse()
7. 函数的使用
- 函数的定义
- def 函数的名称 (函数的形参):
- 函数体 pass
- 函数的返回值
- 函数的返回值使用return返回
- 函数的原型中不需要提供返回值
- 函数没有使用return会返回 None
- 参数的传递
- 支持默认参数,支持给指定参数进行赋值 hosts=”xxxx”, add
- 直接传值 def show(item)
- 传元组 def (*args), 传入的数据不能改变
- 传字典 def (**kwargs) ,传入的数据可以被改变
- 空函数:什么也不做的函数
- 全局变量和局部变量
- 使用 locals() 查看局部变量
- 使用 globals() 查看全局变量
- global
- 在函数中想要使用全局变量,需要在使用前使用 global进行声明
- 在函数中可以使用 global 定义一个全局变量
- 实现一个main函数
- if name == “main“
- 主模块就是直接被运行的模块,否则就是通过 Import 被导入的模块
- 当前模块为主模块的时候,name 才是 main
- 当前模块是被加载的模块,name是模块名
- 匿名函数
- lambda: 创建一个没有名字的函数
- 不能写return 表达式的值就是返回值
- lambda a,b : a if a > b else b
8. 高阶函数的使用
- reduce:
- 在Python3中,不再内置reduce函数,被放在了 functools模块中
- reduce(匿名函数,一个序列)
- 将序列中的值依次放入指定函数,将函数的返回值作为一个参数和下一个值继续进行运算
- functools.reduce(lambda a, b: a + b, a)
- map:依次对传入的序列调用指定的函数
- map(函数,序列1,序列n)
- 将每一个序列对应位置的数据传入到函数中,将返回的结果重新生成一个序列
- filter:过滤传入的序列生成一个新的序列
- filter(函数,序列)
- 将序列内的数据依次放入函数中,将返回值为True的数据,重新组合成一个新的列表
9. 类的使用
- 类的定义
- 类属性和实例属性
- 实例属性:
- 使用 self 或者实例名称可以添加实例属性
- 实例属性只能通过实例进行访问
- 类属性:
- 使用 cls 或者类名可以添加类属性
- 使用实例不可以修改类属性, 但是可以访问
- 推荐使用类名来访问类属性
- 方法的种类
- 实例方法:
- 第一个参数始终表示当前的对象,名称通常为 self
- 类方法
- 静态方法
- 静态方法和类方法在使用上没什么区别
- 类的继承
- class 类名(父类1, 父类2):
- 在Python3中,所有的类的基类都是 object
- 通过 isinstance 可以查看一个实例或类型是否是另一个类的子类
- 在Python中,子类不会主动调用父类的构造函数
- super(子类, self). init ()
- super(). init ()
- 父类名称. init (self, 参数)
- 构造函数和析构函数
- Python 的类不会产生二义性,会采用就近原则(继承链)
10. 模块的使用
- 模块的命名
- 模块的导入
- import XXX
- from functools import reduce 推荐使用的
- from functools import *
- 线程模块
- threading
- Thread(target=线程的起始位置,name=”线程名称”, args=(元组), kwargs={字典})
- python中的线程是伪线程,并且递归的次数有限制,不建议使用递归
- 网络模块
- 随机数模块
- import random
- randrange() 返回只当范围的数
- randint() 返回指定范围的数
11. 异常处理