课程介绍
阶段一:基础到高级
三个项目
- 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("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() # 可以识别汉字,阿拉伯数字