python 复习
python知识点概览
- Python的基础语法(变量定义,字符串,选择结构)
- 循环结构(while for-earch)
- Python的容器(列表,元组,字典)
- Python的函数(默认参数,变参)
- Python的面向对象
- Python异常处理
- Python的高阶函数
- Python常用模块(时间,随机)
- Python多线程编程
- Python网络编程
01 基础语法
- python变量特点
- python 是解释型动态语言
- 解释型:它运行在PVM中,指令逐条执行
- 动态语言:变量类型在运行中确定,可以动态修改
- number = 10; number =”hello”
- python 是解释型动态语言
- python变量可以当作void * 类型指针,它指向真正的数据
- python 数据类型
- folat: 浮点型
- int : 整型(无限大)
- str: 字符串类型,‘ ’,” “,””” 多行字符串 “””
- python命名规则
- 与C语言一样
- python 输入输出
- input(“提示语句”) : 返回值字符串
- eval(input(“输入数字”)): 返回实际数据类型(将字符串转换数字)
- print(“hello”)
- print(“%d”%(100))
- 格式化字符串
- ” “ %()
- buff = “%d %s”%(10,”hello”)
- python的缩进
- python使用缩进组织代码,如果使用不当会触发异常
- 没有缩进的代码,会被当作主函数(main)执行
- 运算符与表达式
- and or not : 对应C语言&& || !
- //: 表示取整除
- 10/3 = 3
- / : 表示除法
- 10/3 = 3.33333333333
- **: 幂运算
- in (not in): 成员运算,判断一个变量是否在序列中
- if( “a” in “abcdef”) => True
- is : 身份运算符,比较两个变量的地址是否相同
- ==:比较的是两个变量的值是否相同
- 表达式值为False:
- ‘’: 空字符串
- []:空列表
- (,):空元组
- {}:空字典
- None
- 0
02 顺序循环
- 设计语言的三大结构:
- 顺序结构
- 自上而下
- 顺序结构
- 选择结构
- if elif else 使用方式与C语言方式一样
fruits = [“苹果”, “梨子”,”香蕉”]
循环迭代
for food in fruits: print(food)
循环索引
for index in range(len(fruits)): print(fruits[index])
- 可迭代序列:
- 元组,字典,列表,字符串
- 循环控制语句
- continue: 跳过本次循环
- break: 跳出循环语句
- for 和 else 是一对组合,break 跳过else语句
```python
for x in range(10):
if(x == 3):
break # 如果执行break else就不会被执行
else:
pass
03 python容器
- 这些容器都可以存放不同类型的数据
list 列表
定义:[]
l = [1,2,3,4,5,"hello",0.3]
使用
l[0]
l[1] = "hello"
len(l)
l.append(4)
range(x,y,z) 函数
# 生成一个范围的序列
list(range(0,10,1))
# range(x,y,z)
# x代表 起始位置
# y代表 终止位置
# z代表 步进
list(range(0,8,2))
# 0 2 4 6
列表生成式
# 生成规则 for 条件
l = [x for x in range(0,10) if x%2==0]
# 0 2 4 6 8
切片
l=[0,1,2,3,4,5,6,7]
l[0:3] # 0,1,2
# [x:y:z]
# x代表 起始位置
# y代表 终止位置
# z代表 步进
s = "hello"
s[0:3] # "hel"
s[0::2] # "hlo"
tuple 元组
定义: ()
t = (1,)
使用
t=(1,2,3,4,5)
t[1]
# t[1] = "hello" 错误,元组不允许修改内容
可变类型和不可变类型
- 可变类型: 字典,列表
- 不可变类型:int float str tuple
- 区分: 修改数据时,地址是否发生变化,可以通过id查看
- 交换两个数
a =10
b =20
a,b = b,a
dict 字典
定义: {键:值 }
d = {'name':'xiaoming','id':1001}
字典使用
- 键:必须是不可变类型
- 值:没有限制
d = {'name':'xiaoming','id':1001}
d['name']
d['name'] = '小明'
- 获取键值
- dict.items(): 获取键值对
- dict.keys(): 获取所有的键
- dict.values():获取所有的值
04 python的函数
函数的定义
def 函数名(参数):
函数体
函数的返回值
- 函数可以通过return 返回数据
- 函数原型不需要指定返回值类型
- 函数没有return时,默认返回的是None
函数参数传递
- 直接传递 def fun(arg) , fun(100)
- 支持默认参数 def fun(arg1 ,arg2=100) , fun(1)
- 支持指定参数赋值 def fun(arg1,arg2) , fun(arg2 =100, arg1=99)
变长参数:
# 通过元组方式传递
def fun(*arg):
print(arg) # (1,2,3,4,5)
fun(1,2,3,4,5)
关键字参数:
# 通过字典方式传递
def fun(**arg):
print(arg) # {"name":"小明","id":99}
fun(name="小明",id=99)
- 局部变量和全局变量
- 全局变量,定义在函数外的变量
- global
- 当函数外有全局变量时,使用global声明使用全局变量
- 当函数外没有全局变量时,使用global声明全局变量时,它会创建一个全局变量
- 可以使用globals(),查看全局变量
- 可以使用locals(),查看局部变量
- main函数
- if
__name__
=="__main__"
- 主模块,直接运行模块,剩下的通过import的方式,都是导入模块
- 运行在主模块下,name会等于main
- 运行在导入模块,name会等于当前模块名
- if
- 匿名函数
- lambda: 创建一个匿名函数
lambda 参数: 返回值(表达式)
lambda a,b: a if a>b else b
# 比较两数大小
- lambda: 创建一个匿名函数
05 python面向对象
定义一个类
class OBJ(object): pass
创建实例
o = OBJ()
- 构造与析构
- `def __init__(self)` :self(C++ this)
- `def __del__(self)`
- 类属性和实例属性
- 实例属性:
- 通过self或者实例添加实例属性
- 只能同过实例访问
- 类属性:
- 通过cls或者类名添加类属性
- 使用实例不可以修改类属性,但是可以访问
- 实际通过实例修改类属性,是给这个实例添加一个实例属性
- 推荐使用类名去访问类属性
- 类中的方法
- 实例方法:
- 第一参数必须是self( c++ this)
- def fun(self)
- 类方法
- 需要使用@classmethod修饰类方法
- 第一参数是cls
- def fun(cls)
- 静态方法
- 需要使用@staticmethod修饰静态方法
- 参数没有限制
- def fun()
- 类方法和静态方法本质没有什么区别。
- 继承
- class 类名(父类1,父类2)
- 都继承至object
- 通过isinstance(),去判断一个实例是否继承至某个类
- 类不会自动调用父类的构造函数,手动调用父类构造函数
- `super().__init__()`
- `super(子类,self).__init__()`
- `父类名.__init__(self,参数)`
- 二义性
- python 没有二义性,使用就近原则(继承链)
- 类名.mro() 查看继承链
<a name="23e44523"></a>
## 06 python的异常处理
- try: 在可能触发异常代码处捕获异常
- except: 捕获指定异常类型
- else: 如果没有产生异常,else中代码会被执行
- finally: 无论是否有异常,都会执行
- raise: 主动抛出异常
```python
# 捕获所有异常类型,并输出异常信息
try:
# 可能触发异常的代码
print(a)
except Exception as msg:
print(msg)
07 python的高级函数
- filter
- filter(函数,序列)
- 将序列中的元素依次传入到函数中,将函数返回值为True的数据,保存到新的序列中
# 过滤0-100的偶数
l = list(filter(lambda a:a%2==0,range(0,101)))
print(l)
# >> 0 2 4 6 ...
- map
- map(函数,序列)
- 将序列中的元素依次传入到函数中,将函数返回值加入到新的序列中
# 产生26小写字母,map转换成大写字母 abcd
l = list(map(lambda a:a.upper(),[chr(x) for x in range(97,123)] ))
print(l)
# A B C D.....
- reduce
- reduceb在python3中被封装到functools模块
- reduce(函数,序列)
- 将序列中元素依次传入到函数中,将函数返回值当成第一个参数与序列中的下值进行运算
# 计算 1+100
import functools
number = functools.reduce(lambda a,b:a+b,range(1,101))
print(number)
# 5050
08 python的常用模块
- 导入模块的3种方式:
- import 模块名: 需要 模块名.fun()
- from 模块名 import fun : 直接调用fun()
- from 模块名 import * : 导出模块中所有内容,fun()
- time
- 时间有三种表示方式: 时间戳,元组,字符串
- time.sleep(): 秒为单位
- time.time(): 获取时间戳
- time.localtime(): 获取当前时间,以元组形式返回
- time.strftime():将元组转换成字符串
- random
- random.randint(): 产生一个范围中数
- random.rnadrange(): 产生一个范围中数
- 文件操作
- open(): 打开一个文件,返回文件对象
- f.read() : 通过文件对象可以读取指定字节数
- f.write(): 通过文件对象写入数据
- f.close(): 关闭文件句柄
- os
- os.listdir(): 遍历指定路径下的文件,以列表形式返回
- os.mkdir(): 创建目录
- os.rmdir(): 删除目录
- os.removedirs(): 递归方式删除目录
- os.path模块,根路径相关的操作
09 python的多线程编程
- threading模块
- 创建一个线程对象:thread = threading.Thread(target=回调函数,name=线程名字,args=(元组),kwargs={键:值})
- thread.start() 启动线程
- thread.join() 等待线程
```python import threading
回调函数
def fun(*arg): print(arg)
创建一个线程对象
thread1 = threading.Thread(target=fun,args=(1,2,3,4,5))
启动线程
thread1.start()
等待线程
thread1.join()
- 多线程同步
- 多个线程同时访问全局变量时,造成不可预料的后果
- 使用锁 threading.Lock() 解决这个问题
- 创建锁对象: lock = threading.Lock()
- 获取锁: lock.acquire()
- 要保护的数据(全局变量 g_number +=1)
- 释放锁: lock.release()
<a name="c41260b2"></a>
## 10 python的网络编程
- socket 模块
- 服务端
- sock = socekt.socket(): 创建TCP套接字对象
- sock.bind() : 绑定,参数是一个元组(ip,端口)
- sock.listen():监听
- csok , addr = sock.accpet(): 等待链接,返回是元组(csock,addr)
- csok .send()
- csok.recv()
- csok.close()
- 客户端
- sock = socekt.socket(): 创建套接字
- sock.connect(): 发起链接
- csok .send()
- csok.recv()
- csok.close()
- 编码问题
- 需要两个数据类型
- str 字符串 显示 ”abcd“
- bytes 字节串 存储 b"\x00\x79\x00"
- 两个类型的转换
- str => encode() => bytes
- bytes => decode() => str
- 使用什么方式编码,就使用什么方式解码
- 常用编码有哪些
- ascii
- gbk
- utf-8
- utf-16
- struct 模块
- 可以使python字节串和C结构体转换。
- struct两个函数
```c
struct Msg{
int type;
int len;
char buff[10];
};
- pack:
- 将python数据转换成字节串类型, 最后返回字节串
- msg = pack("ii10s",1,10,"hello".encode('gbk'))
- b”\x01\x00\x00\x00\x0a\x00\x00\x00hello“
- unpack:
- 将字节串类型转换成python数据类型,返回值是元组
- msg_type , msg_len, msg_buff = unpack("ii10s",msg)
- msg_buff .decode('gbk')