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-in,range(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 字符串和正则表达式*
- 正则表达式 30 分钟入门
- Python 提供 re 模块支持正则表达式
| 函数 | 说明 |
|---|---|
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