课程介绍#
阶段一:基础到高级#
三个项目
- ATM + 购物车:面向过程
- 选课系统:面向对象
- 计算机病毒:程序、服务端、客户端
阶段二:商业项目#
- BBS
- 路飞学城
- 微信小程序
- 爬虫
- 数据分析:金融量化交易
- 自动化运维:cmdb、代码发布
- GO 语言开发
- 人工智能方向
计算机#
计算机五大组成#
- 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
磁盘结构#
硬盘:
- 机械硬盘,即磁盘,依赖于机械转动。
- 磁道:一圈数据 bit(二进制位)-Byte(字节)-kB,实际上硬盘厂商是按 1000 记位
- 扇区:512 字节,即硬盘一次性读写最小单位。操作系统一次读取一个 block,即 8 个扇区 = 4096 字节
- 柱面:相同半径的磁道叠在一起形成虚拟柱面
- 分区:即两个柱面之间的部分
- 固态硬盘
IO 延迟#
硬盘读写速度很快,慢是在找数据的时间。
- 平均寻道时间
- 平均延迟时间:最低为硬盘转半圈的时间
io 延迟为以上两者之和。
优化程序核心方法就是减少从硬盘读写,尽量从内存。
虚拟内存 swap#
物理内存不足时在磁盘上划取。会带来 io 延迟。
IO 设备#
包含
- 设备控制:驱动程序
- 设备本身
总线#
连接主板上各组件交互。
- PCI 桥:北桥,连接高速设备
- ISA 桥:南桥,连接慢速设备
操作系统启动流程#
BIOS: Basic Input Output System,出厂被写入 ROM 设备。
启动流程:
- 计算机加电
- BIOS 运行监测硬件正常
- BIOS 读取 CMOS 存储器的参数,选择启动设备
- 从启动设备上读取第一个扇区的内容(MBR 主引导记录 512 字节,前 446 位引导信息,后 64 为分区信息,最后两个为标志位)
- 根据分区信息读入 BootLoader 启动装载模块,启动操作系统
- 操作系统询问 BIOS 获得配置信息,加载驱动。
Python 入门#
编程语言介绍#
- 机器语言
- 汇编语言
- 高级语言
- 编译型:c->gcc 编译器 -> 机器语言,执行效率高
- 解释型:py-> 字节码 -> 解释器(一行一行)-> 机器,跨平台性强
python 介绍#
- 解释型
- 语法风格:PEP8 规范
解释器#
解释器可以用任意语言写,CPython,Jpython。
2.6-2008
2.7-2010 后推出的过渡版本
3.0-2008
3.1-2009
3.2-2011
运行 python 程序的两种方式#
- 交互式
- 脚本
程序运行三步骤#
- 启动解释器
- 解释器读取 py 进内存
- 解释器解释执行
变量与基本数据类型#
变量#
三大组成部分#
变量名 赋值符号 变量名
变量名#
推荐小写加下划线
变量值三个特征#
- 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() # 可以识别汉字,阿拉伯数字