48.基础复习

基础复习

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)  # 0

print(type(a), type(int), type(type), type(object))  
# <class 'int'> <class 'type'> <class 'type'> <class 'type'>
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 是什么关系?

201808150903445.png


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'))  # 2525425972030036546

5. 深浅拷贝

赋值: 内存地址的引用, 指向的都是同一个地址, 怎么变都是一样的.
l1 = [1, [2]]
l2 = l1
print(l1 is l2)  # True
l1[0] = 2
print(l1 is l2)  # True
浅拷贝: 把原列表第一层内存地址不加以区分完全拷贝一份.
l1 = [1, [2]]

l2 = l1.copy()

print(l2 is l1)  # False 地址不一眼

l1[0] = 2
print(l2)  # [1, [2]]  修改第一层内存地址, 不受影响

l1[1][0] = 3
print(l2)  # [1, [3]] 修改第二层内存地址, 跟随改变

l1[1] = 'a'
print(l2)  # [1, [3]]  修改第一层内存地址, 不受影响
深拷贝: 递归拷贝, 之后修改数据互不影响.
import copy

l1 = [1, [2]]

l2 = copy.deepcopy(l1)

print(l2 is l1)  # False 地址不一眼

l1[0] = 2
print(l2)  # [1, [2]] 修改第一层内存地址, 不受影响

l1[1][0] = 3
print(l2)  # [1, [2]] 修改第二层内存地址, 不受影响

l1[1] = 'a'
print(l2)  # [1, [2]] 修改第一层内存地址, 不受影响

6. 可变不可变

Python中一切都是对象, 但是又被划分成可变与不可变.
Python感受传递参数是值传递还是引用传递?
Python的函数参数采有'传递对象引用'的方式, 是传值与传引用的结合.
Python的函数参数传递都是copy一分传递, 由于一切皆对象, 传给的都是对象地址,
Python中区分可变与不可变, 在函数中修改不可变类型, 不会影响原来的数据.
修改可变类型, 影响原来的数据.
a = 1


def func(a):
    a += 1
    print(a)  # 2


func(a)
print(a)  # 1
l1 = [1, 2]


def func(l1):
    l1.append(3)
    print(l1)  # [1, 2, 3]


func(l1)
print(l1)  # [1, 2, 3]

7. 字符编码

计算机存储单位: 最小的单位是bit 存储 0/1  01 2 ** 1 次变化
一字节byte = 8bit 01 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)

猜你喜欢

转载自blog.csdn.net/qq_46137324/article/details/124037298