一、编辑器
- python开发:pycharm(收费),vscode(免费),sublime text,
- go开发:goland(收费),vscode,国产的
- java:idea(收费),eclipse(免费),MyEclipse(收费)
- android:androidstudio(免费),eclipse+adt
- 前端:webstorm(收费)
- php:phpstorm(收费)
数据库开发:data
二、编译型、解释型
开发的系统环境:
一般是使用windows系统作为作为主流的开发环境,但是有些框架像sanic、fastapi框架在windows上面装不上,只能用mac或者linux作为开发环境,或者在电脑上面装其他系统的虚拟环境,还可以远程连接linux系统进行开发, 或者远程联linux内的docker进行开发。
编译型:
-
c
c代码写完,编译(不同平台),跨平台运行,linux上源码安装软件,自行编译,运行
-
java
java是编译型还是解释型有争议,它能做到一处编译处处都可以运行,java其实是有编译过程的,将java的源代码编译成字节文件,
xxx.class
,而且不能直接运行在操作系统上,需要有个java的虚拟机(jvm) ,jvm运行至少要300m的内存。- jdk
- jre
- jvm
- javaas/javaee/javame
-
go
跨平台编译(windows平台可以编译成mac平台的可执行文件),所有的go代码打包成一个可执行文件
解释型:
-
python
强类型动态语言
-
js
只能在浏览器中运行,借助node.js可以将代码运行到后端服务器上
-
php
web开发
三、python就业方向
-
python后端开发
做网站,前端可以是app,小程序的python后端
-
自动化运维
收集服务器软硬件信息(cmdb),jumpserver(堡垒机),sql审批/监控,日志收集/处理
devops:ci/di
-
自动化测试
selenium,appnium,pytest
-
数据分析
-
爬虫
-
量化交易
-
人工智能,图像处理
-
安全方向:端口扫描,弱口令扫描,sql注入,csrf攻击、xss攻击(书籍推荐:《利用python成为顶级黑客》)
-
网络方向
-
物联网方向
四、数据类型
python中一切皆对象,
- type是object的类
- type继承object
- type是自己的类
- object是有type实例化得到的
- 在python3中所有的类默认都继承object类,包括type,除了object本身
a=int(2)
print(type(a))
"""
<class 'int'> int是一个类,具体实现是由c语言实现的,如果一个类的源代码方法里写的全是pass,那么就是用c写的,看不到具体的源码"""
print(type(int))
print(type(dict))
"""
<class 'type'>
<class 'type'>
int/dict..都是type类的对象,并且他们都继承了object
"""
# type与object的关系
print(type(object))
print(type(type))
"""
<class 'type'>
<class 'type'>
object是type的对象,type是type自己的对象,具体用c来实现"""
# 函数的类
def a():
pass
print(type(a))
"""
<class 'function'>
函数是function类的对象"""
五 、深浅拷贝
一切皆对象的优点:
不同类型之间的变量可以直接相关赋值
a = 66
a = 'xxx'
"""
本质就是变量都指向了一个内存地址,由此会出现深浅拷贝的问题"""
l1 = [1, 2, 3, [4, 5, 6]]
l2 = l1
l2[2] = 'aa'
print(l1)
print(l2)
print(l2 is l1)
"""
[1, 2, 'aa', [4, 5, 6]]
[1, 2, 'aa', [4, 5, 6]]
True
"""
# 浅拷贝
from copy import copy
l3 = copy(l1)
print(l1)
print(l3)
print(l1 is l3)
l3[3][1] = 999
print(l1)
print(l3
"""
[1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5, 6]]
False
[1, 2, 3, [4, 999, 6]]
[1, 2, 3, [4, 999, 6]]"""
# 深拷贝
l=[1,2,3,[4,5,6]]
from copy import copy
from copy import deepcopy
l4=deepcopy(l1)
l4[3][1]=999
print(l4 is l1)
print(l1)
print(l4)
"""
False
[1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 999, 6]]"""
六、可变不可变
可变不可变是在python中才有的个概念
-
可变类型:
- 字典(字典的key必须用不可变类型,可以hash)
- 列表
- 集合
-
不可变类型:
- 数字
- 字符串
- 元组
python中参数传递都是copy一份传递过去,由于一切皆对象的,传过去的都是内存地址,python中区分可变与不可变类型,可变类型在函数中修改会影响原理的,而不可变则不会影响原来的。
七、字符编码
# 计算机的计量单位;
bit比特位:0或者1的一个小格
八个bit是一个byte,一个字节
1024byte = 1KB
1024KB = 1GB
1024Gb = 1TB
...
ascii码:一个字节有2的八次方种变化,可以表示所有的字符(数字,字母,标点符号)
gbk:中国的编码方式,可以表示汉字,GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。
计算机到了不同国家,不同国家有不同国家编码方式,就会出现乱码问题
Unicode:统一各国的编码方式,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
八、闭包函数
- 定义在函数内部
- 对外部作用域有引用
函数是一等公民:函数可以赋值给一个变量
# 装饰器是闭包函数的典型应用
# python中有装饰器语法糖 @
def wrapper(func):
def inner(*args,**kwargs):
# 代码
res=func(*args,**kwargs)
# 代码
return res
return inner
# def a():
# print("xxx")
# 没有语法糖
# a=wrapper(a)
# a()
# 有语法糖
# @wrapper()
def a():
print("xxx")
# 面向切面编程 AOP
# OOP 面向对象编程
作业:
作业一:
前后端传数据三种编码格式,传json格式,原生django不能从POST中取出字典,用中间件或者装饰器前端不管传json还是其他格式,requests对象中有个data属性
from django.utils.deprecation import MiddlewareMixin
import json
class DataMiddleware(MiddlewareMixin):
def process_request(self, request):
meta = request.META # 请求信息
print(meta.get('CONTENT_TYPE')) # 通过请求信息获取数据的类型:application/json
request.data = {}
try:
request.data = json.loads(request.body)
except Exception as e:
if request.POST:
request.data = request.POST.copy()
"""
request.POST数据不可以,这里的赋值仅仅是指向了同一内存地址,
所以无法接下来修改操操作,因此要copy一份,生成新的内存地址"""
if request.FILES:
for key in request.FILES:
request.data[key] =request.FILES.get(key)
print('data:',request.data)
作业二:
申请github账号,维护一个博客(博客园,自己写的,hexo)