课程介绍

阶段一:基础到高级

三个项目

  • 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() # 可以识别汉字,阿拉伯数字

列表

元组

字典

集合