跳转至

Day 01-15*

0x00*

前 15 天是 Python 的基础知识

0x01 初识*

  • 当前常用 3.7.x,最新 3.8.3
  • 优点,简单;缺点,运行效率低

  • 安装 python,建议使用 anaconda,方便创建环境。

  • import this 会输出 Zen of Python

0x02 语言元素*

  • 常见数据类型:整型、浮点数、字符串、布尔、复数 3+5j
  • 变量命名 PEP 8 要求:小写单词、下划线、protected _ 开头,private __ 开头。
  • type() 获取变量类型
  • 类型转换:int(), float(), str(), chr(), ord()
运算符优先级 描述
[] [:] 下标,切片
** 指数
~ + - 按位取反, 正负号
* / % // 乘,除,模,整除
+ - 加,减
>> << 右移,左移
& 按位与
^ \| 按位异或,按位或
<= < > >= 小于等于,小于,大于,大于等于
== != 等于,不等于
is is not 身份运算符
in not in 成员运算符
not or and 逻辑运算符
= += -= *= /= %= //= **= &= |= ^= >>= <<= (复合)赋值运算符
  • 格式化输出 print("%.1f, %.1f" % (f, c))
  • 三目运算符 ...if condition else ... 中间是条件。

0x03 分支结构*

  • 使用 if...elif...else 结构

0x04 循环结构*

  • for-inrange(start, end, step) 左闭右开
  • while

0x05 构造程序逻辑*

  • 几个简单的算法题

0x06 函数和模块的使用*

  • def <fun_name>([param_list=default])
  • 没有函数重载,用模块管理函数
  • 添加了 if __name__ == ‘__main__’: 的模块引用后不会执行之后的代码
  • 未定义在函数中的变量是全局变量,函数可以嵌套。
  • 查找变量时会按照 局部、嵌套、全局、内置 作用域顺序检索
  • 使用 global 关键字指示函数中的变量来自于全局作用域,如果全局没有则之后会定义并置于全局作用域
  • 函数内部的函数使用 nonlocal 关键字指示变量来自嵌套作用域,即外层函数

  • 希望延长局部变量的生命周期可以使用 闭包

  • 所以最好这么写:

  def main():
      ...

  if __name__ == '__main__':
      main()

0x07 字符串和常用数据结构*

字符串*

  • 用单引号或双引号包裹字符串,可以用三引号可以换行
  • 不希望字符串中的 \ 转义可以用 r'...' 的形式
  • +, *, in, not in, [], [:], [::]
  • 一些内置的字符串函数 len(s), s.find(substr), s.startswith(str), s.strip(), s.rfind(substr)
  • 格式化输出,%, format, f-strings

列表*

  • 使用 enumerate 函数遍历列表可同时获得索引和值

  • append(val), insert(pos, val), l1.extend(l2), remove(val), pop(pos), clear(), sorted(), sort()

  • list1 = [x for x in range(1, 10)] 生成式语法,创建后就分配了空间

  • f = (x for x in range(1, 10)) 是一个生成器对象,需要数据时通过运算得到数据而不需要额外空间存储

  • 通过 yield 关键字可将普通函数改造成生成器函数

  def fib(n):
      a, b = 0, 1
      for i in range(n):
          a, b = b, a + b
          yield a

  def main():
      for i in fib(20):
          print(i)

  if __name__ == '__main__':
      main()

元组*

  • (...) 元组数据不可修改
  • list(tuple), tuple(list)
  • 多线程安全,创建时间空间优于列表

集合*

  • {...} 集合无重复元素,按照哈希值排序
  • add(val), update(list), dicard(val), remove(val), pop():首元素
  • &, |, -, ^, <=, >=
  • 推导式语法 set1 = {num for num in range(1, 100) if num % 3 == 0}

字典*

  • 键值对
  • dict(one=1, two=2)
  • dict(zip(['a', 'b', 'c'], '123'))zip 函数压缩
  • 推导式语法 {num: num ** 2 for num in range(1, 10)}
  • 对值遍历,get(key, default)
  • popitem():字典末尾键值对, pop(key[, default])

0x08 面向对象编程基础*

  • 使用 class 关键字定义类
  • 使用 __init__(self[, attributes]) 函数初始化类对象
  • 访问权限,私有属性命名使用 __ 开头,只是换个名字,只要知道规则还是可以访问
  • 单下划线开头表示受保护,并不是语法规则

0x09 面向对象进阶*

  • @property 可以直接通过方法名访问,不用加括号,因此可以构造一个属性的 getter 方法。如果还需要通过这种方式修改属性,需要加一个 setter 方法,使用 @<name>.setter修饰。类似的还可以添加 deleter 方法。
class Test:
    def __init__(self, test_a):
        self.__test_a = test_a

    @property
    def test_a(self):
        return self.__test_a

    @test_a.setter
    def test_a(self, test_a):
        self.__test_a = test_a

    @test_a.deleter
    def test_a(self):
        self.__test_a = None

t = Test(10)
print(t.test_a)
t.test_a = 11
print(t.test_a)
del t.test_a
print(t.test_a)
  • python 是动态语言,允许在程序运行时给对象绑定或解绑新的属性或方法,使用 __slot__ 可以限定当前类对象(对子类不起作用)可绑定的属性。
  • 静态方法 @staticmethod,类方法 @classmethod,第一个参数为 cls
  • UML 统一建模语言
  • 继承和多态,子类可以重写父类方法
  • 可以使用 abc 模块中的 ABCMeta, abstractmethod 实现抽象类的效果

0x0A 图像用户界面和游戏开发*

  • tkinter 模块开发 GUI,GUI 通常是事件驱动式的,进入主事件循环后就是监听鼠标、键盘等事件发生并执行对应的代码进行事件处理。三种 Tk 的三种布局管理器 Placer, Packer, Grid
  • 使用 Pygame 进行游戏开发

0x0B 文件和异常*

  • open 函数指定路径,文件模式,编码
  • 使用 try ... except ... finally 语句捕获异常,finally 块总会执行,可用于释放资源,或者使用 with 关键字指定上下文并在离开时自动释放资源
with open('filename') as f:
    print(f.read())
  • 还可以使用循环逐行读取或者用 readlines() 按行读取到列表中。
  • 使用 json 模块可将字典或列表以 json 格式保存到文件,主要函数:dump/dumps, load/loads

0x0C 字符串和正则表达式*

函数 说明
compile(pattern, flags=0) 编译正则表达式返回正则表达式对象
match(pattern, string, flags=0) 用正则表达式匹配字符串 成功返回匹配对象 否则返回None
search(pattern, string, flags=0) 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
split(pattern, string, maxsplit=0, flags=0) 用正则表达式指定的模式分隔符拆分字符串 返回列表
sub(pattern, repl, string, count=0, flags=0) 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
fullmatch(pattern, string, flags=0) match函数的完全匹配(从字符串开头到结尾)版本
findall(pattern, string, flags=0) 查找字符串所有与正则表达式匹配的模式 返回字符串的列表
finditer(pattern, string, flags=0) 查找字符串所有与正则表达式匹配的模式 返回一个迭代器
purge() 清除隐式编译的正则表达式的缓存
re.I / re.IGNORECASE 忽略大小写匹配标记
re.M / re.MULTILINE 多行匹配标记

0x0D 进程和线程*

  • 进程,资源分配单位,通过 fork 或 spawn 的方式创建新的进程来执行其他的任务。进程间通过 IPC, Inter-Process Communication 来实现数据共享,具体方式包括管道、信号、套接字、共享内存区等。
  • 线程,CPU 调度单位,同一进程间共享上下文。
  • Python 多进程,linux 上使用 os 模块中的 fork() 函数创建进程。win 上没有 fork(),要使用 multiprocessing 模块的 Process 类创建子进程,该模块还提供了进程池、进程通信队列、管道等高级封装。
  • Python 多线程,_thread 模块,threading 模块,可以直接使用 Thread 类,还可以通过继承 Thread 类创建自定义的线程类。多线程共享资源需要注意临界资源的竞争。
  • 任务间切换需要保存当前执行环境,然后装载目标任务的环境。CPU 密集型任务设计成多任务对应的切换代价也多,I/O 密集型任务启动多任务可以减少等待时间。

0x0E 网络编程入门*

  • 网络体系结构、TCP/IP、HTTP
  • 使用 json 传输数据
  • Python requests 库
  • 套接字编程,TCP、UDP 套接字

0x0F 图像和办公文档处理*

  • Pillow 模块操作图像,Image
  • word、excel 等文件也有对应的处理模块

最后更新: November 26, 2020