0x18 Python

1. 基础知识


  • Python中变量的特点
    • Python是一个解释型的动态语言。
      • 解释型: 它是运行在 PVM 中,指令是逐条翻译执行的
      • 动态语言: 变量类型是在运行中确定的,并且变量类型可以改变
    • Python中的变量可以看作是一个 void* 指针,指向了实际的数据
  • 基本变量类型
    • float: 浮点数
    • int: 整数
    • str: 字符串 ‘’ “” “””三引号可以保留格式”””
  • 命名规范
    • 和C语言的命名规范一样
  • 输入和输出
    • Python3
      • input(“”): 返回的始终是字符串
      • eval(input(“”)): 返回的是实际输入的类型
    • Python2
      • input: 和3中的eval(input(“”))一样
      • raw_input: 和3中的input一样
    • 在 Python2中,print是一个表达式,3中,print是一个函数
      • 2: print 123
      • 3:print(123)
    • 格式化输出
      • print(“%d %f” % (10, 10.0)) # 使用%进行输出
      • print(“{0} {1:10.8f}”.format(10, 10.0))
  • Python中的缩进
    • Python中使用缩进标识代码块,不当的缩进会导致异常

2. 运算符和表达式


  • and or not
    • 与或非,返回的结果是True|False
  • / //
    • /: 表示直接进行除法运算
      • 在Python2中,会根据类型保留小数
      • 在Python3中,始终都会保留小数
    • //: 截断除法
      • 无论如何都会舍去小数

  • 幂运算
    • in not in
  • 成员关系运算符,判断当前的值是否在一个序列中
  • if (‘a’ in “abc”) => True
    • is ==
  • is: 判断两个变量的地址是否相等 l1 = l2 l1 is l2 ?
  • ==: 判断值是否相等
    • != <>
  • Python2 中 <> 表示不等,Python3废除
    • 为 False 的一些表达式
  • 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()]
      • bb cc dd dd ss aa dd
    • 从一个列表中筛选出所有的字符串并转换为小写
  • 字典
    • 定义:关键是 {键:值}, d = {1:”111”, 2:”222”}
    • 键和值的要求
      • 键(下标): 必须是不可变类型
      • 值: 无所谓
    • 获取键值对、键、值
      • dict.items 键值对
      • dict.keys 键
      • dict.values 值

4. 可变类型和不可变类型


  • 区分条件:修改数据的时候是否会改变地址,使用id查看地址
  • 可变类型:
    • 字典、列表
  • 不可变类型
    • int float str tuple

5. 三大结构


  • 顺序结构
    • 自上而下
  • 选择结构
    • if elif else: 使用上和c语言的一样
  • 循环结构
    • for 元素 in 可迭代序列(列表 字典 元组 字符串 集合)
      • 遍历字符串

image.png

  1. - **遍历元组**

image.png

  1. - **遍历列表**

image.png

  1. - **遍历字典**

image.png

  1. - **for break else**
  2. - for循环被break,就不执行 else
  3. - for循环正常退出,则执行else代码

image.png

  • while
    • while 表达式: 缩进的代码
  • range
    • 返回一个范围内的数据
    • range(a, b, c)
      • a: 数据的起始位置
      • b: 数据的结束位置的后一个
      • c: 步长
    • range(10, 30, 3)
      • 10 13 16 19 22 25 28

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) ,传入的数据可以被改变
  • 空函数:什么也不做的函数
    • def func():
    • pass
  • 全局变量和局部变量
    • 使用 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)
      • 将每一个序列对应位置的数据传入到函数中,将返回的结果重新生成一个序列

image.png

  • filter:过滤传入的序列生成一个新的序列
    • filter(函数,序列)
    • 将序列内的数据依次放入函数中,将返回值为True的数据,重新组合成一个新的列表
    • image.png

9. 类的使用


  • 类的定义
    • class 类名(父类): 父类是 object
  • 类属性和实例属性
    • 实例属性:
      1. 使用 self 或者实例名称可以添加实例属性
      1. 实例属性只能通过实例进行访问
    • 类属性:
        1. 使用 cls 或者类名可以添加类属性
        1. 使用实例不可以修改类属性, 但是可以访问
          • 使用实例修改类属性相当于添加了一个同名的实例属性
        1. 推荐使用类名来访问类属性
  • 方法的种类
    • 实例方法:
      • 第一个参数始终表示当前的对象,名称通常为 self
    • 类方法
      • 第一个参数始终为 cls
      • @classmethod
    • 静态方法
      • 静态方法对参数没有要求
      • @staticmethod
    • 静态方法和类方法在使用上没什么区别
  • 类的继承
    • class 类名(父类1, 父类2):
    • 在Python3中,所有的类的基类都是 object
    • 通过 isinstance 可以查看一个实例或类型是否是另一个类的子类
    • 在Python中,子类不会主动调用父类的构造函数
      • super(子类, self). init ()
      • super(). init ()
      • 父类名称. init (self, 参数)
  • 构造函数和析构函数
    • 构造的名字: init
    • 析构的名字: del
  • Python 的类不会产生二义性,会采用就近原则(继承链)
    • 通过 Test.mro() 可以查看继承链

10. 模块的使用


  • 模块的命名
    • 模块的名字中不能包含中文字符,不能是纯数字
  • 模块的导入
      1. import XXX
      1. from functools import reduce 推荐使用的
      1. from functools import *
  • 线程模块
    • threading
    • Thread(target=线程的起始位置,name=”线程名称”, args=(元组), kwargs={字典})
    • python中的线程是伪线程,并且递归的次数有限制,不建议使用递归
  • 网络模块
    • import socket
  • 随机数模块
    • import random
    • randrange() 返回只当范围的数
    • randint() 返回指定范围的数

11. 异常处理


  • try :在可能产生异常的代码中捕获异常
  • except :捕获到了异常就处理异常
  • else :当没有捕获到异常的时候,会执行else
  • finally:无论有没有产生异常,都执行
  • raise:抛出一个指定的异常
    1. # 捕获所有类型的异常并打印异常的信息
    2. try:
    3. 可能产生异常的代码
    4. except Exception as e:
    5. print(e)