KANIKIG

KANIKIG

just for fun | 兴趣使然 Ph.D. in Engineering|❤️ #NFT $ETH| [Twitter](https://twitter.com/kanikig2)|[Github](https://github.com/KANIKIG)|[Telegram channel](https://t.me/kanikigtech)

Python全栈学习笔记

image

课程介绍#

阶段一:基础到高级#

三个项目

  • ATM + 购物车:面向过程
  • 选课系统:面向对象
  • 计算机病毒:程序、服务端、客户端

阶段二:商业项目#

  • BBS
  • 路飞学城
  • 微信小程序
  • 爬虫
  • 数据分析:金融量化交易
  • 自动化运维:cmdb、代码发布
  • GO 语言开发
  • 人工智能方向

计算机#

计算机五大组成#

dcc451da81cb39dbf8fed5fad5160924ab18305b.jpg

  • CPU 中央处理器
    • 控制器:控制所有其他组件
    • 运算器:数学运算与逻辑运算
  • 存储器 io 设备:数据存取
    • 内存:基于电,断电丢失数据,用于临时存取
    • 外存:硬盘,基于磁,存取慢,永久保存
  • 输入设备:键盘鼠标
  • 输出设备:显示器打印机

操作系统#

概念#

  • 控制计算机硬件
  • 硬件的复杂操作封装

软件

  • 应用软件
  • 系统软件

计算机体系三层结构#

  • 应用程序
  • 操作系统
  • 计算机硬件

平台与跨平台#

平台:

  • 操作系统
  • 计算机硬件

其他#

程序与三大核心硬件#

程序:硬盘 -> 内存

cpu 从内存读取指令执行

cpu 详解#

cpu 分类与指令集#
  • X86-32bit:intel
  • x86-64bit:AMD

指令集,就是 CPU 中用来计算和控制计算机系统的一套指令的集合

  • 精简指令集 RISC:指令短,稳定
  • 复杂指令集 CISC:指令长,丰富
X86-64#
  • x86:intel 发明世界第一个 cpu8086,故将这种架构型号统称为 x86。

  • 64 位:cpu 能一次性从内存中取出多少位二进制指令。

cpu 有向下兼容性。

寄存器#

和 cpu 同材质,速度比内存快。存 cpu 要用的关键数据,提升 CPU 取数据的速度。

内核态与用户态#

两种程序

  • 操作系统:内核态,调用控制硬件的指令集与运算指令集
  • 应用程序:用户态,只调用运算相关指令集

故两种状态频繁切换。

多线程与多核芯片#

moore 定律。

单核双线程,即一个 cpu 干两个 cpu 的工作,伪并行,假双核。

4 核 8 线程:每个 cpu2 线程。

  • intel:所有核调用一个 L2 缓存
  • AMD:每个核分配单独 L2 缓存

存储器 io 相关#

  • 寄存器 L1:32 位 32x32,64 位 64x64
  • 高速缓存 L2:cpu 先在高速缓存找,高速缓存命中,未命中再找内存
  • 内存
  • 磁盘
  • 磁带

速度快 - 慢

RAM#

随机存取存储器

ROM#

只读内存,速度和内存一样。故一般用于出厂关键程序存储,例如 BIOS

CMOS#

也是易失性。速度慢。耗电极低。主板有个主板电池,给时钟芯片供电,计算后存到 cmos

磁盘结构#

v2-dc762f4e4037b261d0134171213c94a0_1440w.jpg

硬盘:

  • 机械硬盘,即磁盘,依赖于机械转动。
    • 磁道:一圈数据 bit(二进制位)-Byte(字节)-kB,实际上硬盘厂商是按 1000 记位
    • 扇区:512 字节,即硬盘一次性读写最小单位。操作系统一次读取一个 block,即 8 个扇区 = 4096 字节
    • 柱面:相同半径的磁道叠在一起形成虚拟柱面
    • 分区:即两个柱面之间的部分
  • 固态硬盘
IO 延迟#

硬盘读写速度很快,慢是在找数据的时间。

  • 平均寻道时间
  • 平均延迟时间:最低为硬盘转半圈的时间

io 延迟为以上两者之和。

优化程序核心方法就是减少从硬盘读写,尽量从内存。

虚拟内存 swap#

物理内存不足时在磁盘上划取。会带来 io 延迟。

IO 设备#

包含

  • 设备控制:驱动程序
  • 设备本身

总线#

连接主板上各组件交互。

t01696027505b77ec8c.jpg

  • PCI 桥:北桥,连接高速设备
  • ISA 桥:南桥,连接慢速设备

操作系统启动流程#

BIOS: Basic Input Output System,出厂被写入 ROM 设备。

启动流程:

  1. 计算机加电
  2. BIOS 运行监测硬件正常
  3. BIOS 读取 CMOS 存储器的参数,选择启动设备
  4. 从启动设备上读取第一个扇区的内容(MBR 主引导记录 512 字节,前 446 位引导信息,后 64 为分区信息,最后两个为标志位)
  5. 根据分区信息读入 BootLoader 启动装载模块,启动操作系统
  6. 操作系统询问 BIOS 获得配置信息,加载驱动。

Python 入门#

编程语言介绍#

  1. 机器语言
  2. 汇编语言
  3. 高级语言
    1. 编译型:c->gcc 编译器 -> 机器语言,执行效率高
    2. 解释型:py-> 字节码 -> 解释器(一行一行)-> 机器,跨平台性强

python 介绍#

  • 解释型
  • 语法风格:PEP8 规范

解释器#

解释器可以用任意语言写,CPython,Jpython。

2.6-2008

2.7-2010 后推出的过渡版本

3.0-2008

3.1-2009

3.2-2011

运行 python 程序的两种方式#

  • 交互式
  • 脚本

程序运行三步骤#

  1. 启动解释器
  2. 解释器读取 py 进内存
  3. 解释器解释执行

变量与基本数据类型#

变量#

三大组成部分#

变量名 赋值符号 变量名

变量名#

推荐小写加下划线

变量值三个特征#

  • id:变量值的内存地址
id()
  • type
type()
  • value

可变与不可变类型#

  • 可变类型:改 value,内存地址 id 不变
    • set
    • list
    • dict
  • 不可变:改 value,id 也变
    • number
    • bool
    • string
    • tuple

is 与 ==#

  • is 比较的是左右变量的内存地址是否相同
  • == 比较变量值

小整数对象池#

从解释器启动会在内存中事先申请一系列内存空间存放常用整数(-5, 256)

IDE 的小整数池会更大。

常量#

python 语法没有常量概念!

全大写代表常量,只是一种规范写法,实际还是变量。

基本数据类型#

字符串#

单、双、三引号定义均可,嵌套时单双应相反,或转义

print('-' * 10)
# -----------

列表#

内存中存的是值的内存地址,不存值!

如果 list2 = list1,即两者指向同一个堆,改变值,两个都会改。

深浅拷贝

  • 浅拷贝:将列表第一层内存地址拷贝,但若有可变类型,还是会连在一起
list2 = list1.copy()
  • 深拷贝:完全独立拷贝一份,不可变类型 id 不变,可变类型 id 改变
import copy
list3 = copy.deepcopy(list1)

字典#

a = {
  "key":"value"
	"1":1,
  "2":"qwe"
}

垃圾回收机制 GC#

引用计数#

垃圾:变量值没有绑定变量名

引用计数:绑定某值的变量个数,python 会清除计数为 0 的值

del x	# 解除变量与值的绑定

直接引用,间接引用

标记清除#

循环引用问题,可能导致内存泄漏

内存栈区存变量名,堆区存值

分代回收#

多次扫描都没有被回收的变量,会认为是常用变量,对他的扫描频率会降低

用户交互#

输入#

input() # 存为str

# python2
raw_input()	# 存为str
input()	# 要求用户输入明确数据类型,输入的是什么类型就为什么类型

格式化输出#

  • % 格式化输出
print("name: %(name)s, age:%(age)d" % {"name": "a", "age": 10})
# %s可以接受任何类型
  • str.format
print("name: {name}, age:{age}".format(name = "a", age = 10))
  • f
print(f"name: {name}, age:{age}")

基本运算符#

算数运算符#

10 // 3	#只保留整数部分,即整除
3 ** 10	#指数
10 % 3 #取余数

比较运算符#

1 != 2
1 < x < 3

赋值运算符#

  • 变量赋值
a = 1
  • 增量赋值
 a += 1
 b *= 1
  • 链式赋值
z = y = x = 10 
  • 交叉赋值
m, n = n, m
  • 解压赋值
list = [1, 2, 3, 4]
a, b, c, d = list
x, y, *_ = list	#取前两个
*_ , x, y = list	#取后两个
# 字典解压取值的是key

逻辑运算符#

隐式布尔:所有值,除了 0,None, False,Null,空值 都是 True

优先级 not>and>or

短路运算:从左至右读取条件,连续 and 有一个 false 就不再往右读,并返回该位置的值

成员运算符 in#

"a" in "abc"
1 in [1, 2, 3]

身份运算符 is#

流程控制#

if#

if 16 < a < 20:

elif 条件从上到下,上面的不满足才进下一个条件

while#

条件循环

while+else#

循环正常结束,没有被 break,运行 else

while True:
	...
else:
	...

for#

迭代循环

for variable in Iterable object:
	...
  

for i in range(1, 100):
	...
  

for+else#

range#

# py2
>>> range(0, 5)
[0, 1, 2, 3, 4]
#py3 优化
>>> range(0,5)
range(0,5)

print#

print("hello", end="*")	# 自定义结束,默认为换行

基本数据类型及内置方法#

数字类型#

int#

python3 没有 long 长整型了

int('10')
bin(11) # 0b1011  0b开头即二进制
oct(11) # 0o13	8进制
hex(11)	# 0xb	16进制
int(int('0b1011', 2))	# 二进制转10进制

float#

float('11')

虚数#

x = 10 + 2j
x.real	#10
x.imag	#2

字符串#

# 不可变,是一个整体,不可单独改某个字符
str(10)
msg = "hello"

# 切片
msg[0] # h
msg[-1] # o
msg[0:5] # hello 顾头不顾尾
msg[0:5:2] # hlo
msg[5:0:-1] # olle

"alex" in ”alexxxx"	# true
"alex" not in ”alexxxx"	# false

msg = "    eee   "
res = msg.strip()	# 默认去除两边空格 字符串不可变,故需要新赋值
msg = "***eee***"
res = msg.strip(“*”)  # strip只去两边,不去中间
res = msg.lstrip()
res = msg.rstrip()

# 切分:按某字符分割字符串,返回列表
res = msg.split(":", 1) # 默认按空格为分隔符 分割次数,从左往右算
res = msg.lsplit(":", 1)
res = msg.rsplit(":", 1) #从右往左

res2 = ":".join(res) # 以:为分隔符拼接

res = msg.lower() # 小写
res = msg.upper()
res = msg.startswith("aaa") # True 以什么开头
res = msg.endswith("aaa")
res = msg.replace("you", "me" ,1) #字符串替换,次数

123”.isdigit() # 纯数字

msg.find("e") # 返回索引,找不到返回-1
msg.index("e") # 返回索引,找不到程序报错
msg.count("e") # 数子串出现次数
"分割线".center(50, "*") #两侧用*填充
"分割线".ljust(50, "*") #右侧填充
"分割线".rjust(50, "*")
"分割线".zfill(50) # 左侧用0填充

# is 判断系列 查文档
isalpha()
isdigit()
isdecimal() # 只识别阿拉伯数字 py3 默认unicode
isnumeric() # 可以识别汉字,阿拉伯数字

列表#

元组#

字典#

集合#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。