基础复习
1. 可从事的方向
1. 后端开发: 网站, 前端可以是 网页, app, 小程序...
2. 自动化运维: 收集服务器软硬件信息(cmdb),jumpserver(堡垒机),sql审批,监控,日志收集,处理devops:ci/di
3. 自动化测试: selenium,appnium,pytest
4. 安全方向: 端口扫描, 弱口令扫描, sql注入, csrf攻击, xss攻击(利用Python成为顶级黑客)
5. 数据分析
6. 爬虫
7. 量化交易
8. 人工智能, 图像处理
9. 物联网方向
2. 编辑器
Python开发:Pycharm(收费), VSCode(免费), Sublime Tex
Go开发:GoLand(收费), VSCode(免费)
java:idea(收费), Eclipse(免费), MyEclipse(收费)
android: Eclipse + ADT + Android SDK, Android Studio(免费)
前端:WebStorm(收费)
php:PhpStorm(收费)
数据库开发:DataGrip (收费)
* jetbrains公司出的全家桶,一个注册码,可以都用.
3. PyCharm虚拟环境
虚拟环境的作用:
4. 一切皆对象
a = int()
print(a)
print(type(a), type(int), type(type), type(object))
Python定义变量的时候不需要指定的类型的原因, 是Python所有的数据都是对象.
num = int() --> 0
s1 = str1() --> ''
l1 = list() --> []
t1 = tuple() --> ()
d1 = dict() --> {
}
ste1 = set() --> set()
定义时数据是由对应的类型的类创建
num = 1 ==> num = int(1)
查看源码 int继承了object类
class int(object):
pass
int 是一个类, 具体是使用c语言实现的.
type(int) --> <class 'type'>
查看int的类是 type
查看源码 type继承了object类
class type(object):
...
type(object) --> <class 'type'>
查看object的类是 type
函数type就是Python用来创建所有类的元类
所有的数据,包括object都是type类的对象,
产生变量的类, 和type都继承object类,
那么type 与 object 是什么关系?
type 是 object的类
type 继承 object类
type 是自己的类
所有的类, 除了object都继承type, object是由type实例化得到的.
Python中是无法实现的, Python是由C语言写的, C语言解决这些问题.
一切皆对象的好处就是变量可以接受不同类型的值.
a = 1
a = 'hello'
本质: 变量指定一个内存地址, 地址指定真正的值.
a = 1
变量a --存内存地址--> ox123 --存数据--> 1
a = 'hello'
变量a xx断开存内存地址的连接--> ox123 --存数据--> 1
变量a -->内存地址--> 0x456 --存数据--> 'hello'
变量重新赋值, 断开之前连接的内存地址, 指定新的内存地址.
列表之所有能后存任意类型的数据, 是因为它存的是对象的地址.
列表是基于数组存储的. 数组在内存中是连续储存的.
字典是基于链表存储的. 链表在内存中是不连续存储的,动态分配内存.
字典的键必须是可哈希的, 哈希之后再处理存放在内存中, 通过同样的哈希值去获取到值.
Python3.6 之前是无序的, Python3.6开始是有序的.
d1 = {
'k1': 'v1'}
print(hash('k1'))
5. 深浅拷贝
赋值: 内存地址的引用, 指向的都是同一个地址, 怎么变都是一样的.
l1 = [1, [2]]
l2 = l1
print(l1 is l2)
l1[0] = 2
print(l1 is l2)
浅拷贝: 把原列表第一层内存地址不加以区分完全拷贝一份.
l1 = [1, [2]]
l2 = l1.copy()
print(l2 is l1)
l1[0] = 2
print(l2)
l1[1][0] = 3
print(l2)
l1[1] = 'a'
print(l2)
深拷贝: 递归拷贝, 之后修改数据互不影响.
import copy
l1 = [1, [2]]
l2 = copy.deepcopy(l1)
print(l2 is l1)
l1[0] = 2
print(l2)
l1[1][0] = 3
print(l2)
l1[1] = 'a'
print(l2)
6. 可变不可变
Python中一切都是对象, 但是又被划分成可变与不可变.
Python感受传递参数是值传递还是引用传递?
Python的函数参数采有'传递对象引用'的方式, 是传值与传引用的结合.
Python的函数参数传递都是copy一分传递, 由于一切皆对象, 传给的都是对象地址,
Python中区分可变与不可变, 在函数中修改不可变类型, 不会影响原来的数据.
修改可变类型, 影响原来的数据.
a = 1
def func(a):
a += 1
print(a)
func(a)
print(a)
l1 = [1, 2]
def func(l1):
l1.append(3)
print(l1)
func(l1)
print(l1)
7. 字符编码
计算机存储单位: 最小的单位是bit 存储 0/1 0和1的 2 ** 1 次变化
一字节byte = 8bit 0和1的 2 ** 8 次变化
字符编码记录人类使用的字符和数字的对应关系.
ASCII 记录 英文, 符号, 数字 与数字的对应关系, 一个字节.
gbk 记录 中文, 英文, 符号, 数字 与数字的对应关系, 中文2个字节, 英文1个字节.
Unicode 支持所有国家和地区的编码. 存一个字符,统一占用2个字节.
Python2 使用ASCII编码.
Python3 使用Unicode编码.
UTF-8 = unicode的存储方式, 可变长方式就会出现取值问题, 取几个字节.
通过一些方式实现取值不出错.
编码表范式(对应十进制数) |
二进制格式 |
读取 |
0-127 |
0XXXXXXX |
读一个字节 |
128-2047 |
110XXXXX XXXXXXXX |
读两个字节 |
2048-65535 |
1110XXXX XXXXXXXX XXXXXXXX |
读三个字节 |
65535以上 |
11110XXX XXXXXXXX XXXXXXXX XXXXXXXX |
读四个字节 |
8. 闭包函数
定义在函数内部分函数, 并且外部的作用域有引用.
函数是一等公民: 函数可以赋值给一个变量.
装饰器是闭包函数的典型应用.
在不改变函数的源代码和调用方式的基础上添加额外
Python中有装饰器语法糖 @
def outter(func):
def inner(*args, **kwargs):
res = func(*args, **kwargs):
return res
return inner
def a():
pass
a = outter(a)
a()
@outter
def a():
pass
@outter ==> a = outter(a)
@outter() ==> a = inner(a)