Python Django笔记
- 快捷键 在settings keymap 中搜
- 快速格式化代码 ctrl+alt+l
- 快速复制粘贴选中的代码 ctrl +d
- 移动一行代码 ctrl +shift +上下箭头
- 注册app 时忘记用逗号分隔 -- 导致会找不到模块
- 缺少环境变量参数,environment variable DJANGO_SETTINGS_MODULE
- 在 pycharm 环境变量中添加DJANGO_SETTINGS_MODULE=projectname.settings projectname 根据实际情况更改
- 在项目的入口 __init__.py 中添加 (注意修改成自己的project name)
- import os,django
-
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "RESTEnd.settings")# project_name 项目名称
-
django.setup()
- 启动celery 时AttributeError: 'NoneType' object has no attribute 'autodiscover_tasks'
- celery.py 中os.environ.setdefault('DJANGO_SETTINGS_MODULE','RESTEnd.settings')--- 引号中单词拼错
- 在 Python 中一切都是对象,整数也是对象,在比较两个整数时有两个运算符==和is,它们的区别是:
- is比较的是两个整数对象的id值是否相等,也就是比较两个引用是否代表了内存中同一个地址。
- ==比较的是两个整数对象的内容是否相等,使用==时其实是调用了对象的__eq__()方法。
- 把频繁使用的整数对象用一个叫small_ints的对象池缓存起来造成的。small_ints缓存的整数值被设定为[-5, 256]这个区间,也就是说,如果使用CPython解释器,在任何引用这些整数的地方,都不需要重新创建int对象,而是直接引用缓存池中的对象。如果整数不在该范围内,那么即便两个整数的值相同,它们也是不同的对象。
- CPython底层为了进一步提升性能还做了一个设定:对于同一个代码块中值不在small_ints缓存范围之内的整数,如果同一个代码块中已经存在一个值与其相同的整数对象,那么就直接引用该对象,否则创建新的int对象。需要大家注意的是,这条规则对数值型适用,但对字符串则需要考虑字符串的长度
- 浅拷贝与深拷贝
- import copy
- 浅拷贝 第一层修改互不影响 :
- nuber2=num.copy()
- nuber2=copy.copy(num) 两者相等,只拷贝第一层
- 深拷贝,修改互不影响
- number3 = copy.deepcopy(num)
- 自符串
- \'' 显示一个普通的双引号
- \n 表示一个换行
- \t 表示显示一个制表符
- \\表示一个普通的反斜线
- 在字符串前加“r” 表示原生字符串
- 可以通过下标来获取指定位置的数据 m[index]
- 字符串是不可改变的数据类型
- 对于字符串的任何操作,都不会改变原有字符串
- 切片是从字符串里复制一段指定的内容,生成一个新的字符串m[start:end:step] 包含start 不包含 end
- start 和end 为负数表示从右边数 m[-9:-5] 倒数第九个到倒数第五个
- end 为负数 反转
- x.find('h') 返回指定字符的下标,若不存在,返回-1,默认返回最小下表,x.rfind('h')默认返回最大下标
- x.index('h')返回指定字符的下标,若不存在则报错,默认返回最小下标,x.rindex('h') 默认返回最大下标
- str1.startwith('h') str1.endwith('h') str1.isalpha() '1234'.isdigit() '3.14'.isdigital False 'add1212'.isalnum() 检验是否由数字或字母组成
- replace
- 内容分割 split 最大分割 ,与左右分割
- splitlines 按照行分隔,返回包含各行为一个元素的列表
- partition 指定一个字符串作为分割符,分为三个元素的列表
-
- 符编码
- ord('a') 字符对应的编码
- chr('97') 编码转字串
- "1234".encode('utf8') x.decode('utf8')
- 列表
- 有序,可变,增删改查
- 增加元素 append insert extend
- 删除数据
- x.pop() 删除并返回最后一个数据 ,x.pop(index)删除指定位置的数据
- remove(obj) 如果数据存在则删除,否则报错
- clear() 清空一个列表
- del 可以删除整个变量,或者传入 index 删除指定元素
- 查询
- x.index(obj) x.count(obj) obj in x
- 修改
- x[5] ="yy"
- 交换两个变量的值
- nums.sort() nums.sort(reverse=True) ,直接改变的是原有的列表
- x=sorted(nums) 不会改变原有列表
- nums.reverse() 反转列表
- 冒泡排序
- 每一趟比较次数的优化
- 总比较趟数的优化
- 元组 不可变,仅有两个方法 index() 和count() 通过下标查找,只有一个元素,加个逗号
- 题目
- 素数
- 素数
-
求斐波那契数列
- 使用递归求阶乘
- 白马驮
- 珠峰 问题
-
For 循环带下标遍历 加enumerate
-
列表推导式 nums =[i for in range(10)]x=[i for in in range(10) if i%2]points = [(x,y) for i in range(5,9) for y in range(10,20)]
- 字典
- 字典里的key 不允许重复,如果重复,后面的会覆盖前一个
- 字典的Value 可以是任意数据类型,但Key 只能是不可变的数据类型,一般用字符串,数字,元组
- 增加和修改 dict1[key] =value 如果key 存在,则为修改,如果不存在则为添加
- pop[key] 以键值对删除,返回value
- popitem() 任意删除一个键值对,并返回被删除的键值对
- dict1.clear() 清空字典
- del dict1[key1] 删除一个键值对
- dict1.update(dict2) 将dict2 合并到dict1
- 获取所有的key list dict1.keys()
- 遍历dict1.keys() 可获取每个key 对应的值 dict1['key']
- 获取所有的values dict1.values() 值List 但不可反得到 key ,一般不适用
- 获取键值对 dict1.items() for k ,v in dict1.items() print(k,v)
- 字典推导式 dict1 = {k:v for k,v in dict1.items()}
- 合并
- 元组和字符串 合并,可用加法
- list 用extend 字典用update
- 集合:
-
- {} 里放的键值对就是字典,放的单个值就是集合,自动去重
- 空集合set{} ,空字典{}
- set1.add{'ddd'} set1.pop() 随机删除一个, set1.remove('tt')
- set3 =set1.union(set2) 生成一个新的集合 set1.update("value") 拼接
- 集合运算 A-B A&B 交,A|B 或,A^B 相同的不要
-
- eval("str")可执行字符串
- json
- m=json.dumps(dict1) 将字典变成字符串对象
- json.loads(m) 将json字符串转换成字典
- 位置参数(必须传),关键字参数,可变位置参数(*args )以元组的额形式保存,缺省参数num=1 ,可变关键字参数(*kwargs)以字典的形式保存, 先写可变位置参数,再写缺省参数
-
匿名函数使用
-
mul = lambda a,b:a+b 表达一个简单的函数
- 列表的相关函数,用到了匿名函数
-
把函数传给另一个函数
- sort() 需要传入Key 指定排序规则
-
- filter(内置类) 对可迭代对象进行遍历,得到一个filter 对象
- 可以指定两个参数,第一个参数是函数,第二个是可迭代对象
- x = filter(lambda ele:ele>18,ages)
- 是个filter 对象,可转成list
- map
- m= map(lambda ele :ele+2,ages)
- reduce(内置类)
-
总结内置类(c) 内置函数(f)
- builtins.py
- all(obj) 将obj 中所有值转成布尔值,只要有一个为False ,结果为False
- any(obj) 与all()类似
- bin()
- oct()八进制
- hex()十六进制
- round()四舍五入保留指定小数位
- divmode() 两商余数
- chr()
- ord()
- dir() 返回对象的所有属性和方法
- eval() 执行字符串
- exit() 以指定的退出码退出程序
- isinstance
- 高阶函数
- 一个函数作为另一个函数的返回值
-
一个函数作为另一个函数的参数
- 函数的嵌套
- 装饰器
- 装饰器详解
- 扩充原函数可接受的参数
- 从可变关键字参数拿参数
-
导入模块的语法
-
常用的系统模块
-
常用的系统模块
-
os 模块
-
- 用来调用操作系统的方法
- os.name 获取操作系统名字,windows nt
- os.sep 路径分割符 windows "\" 非windows "/"
- os.path.abspath(filename) 获取文件的绝对路径
- os.path.isdir(filename) 判断是否是文件夹
- os.path.isfile(filename) 判断是否为文件
- os.path.exists(filename) 判断是否存在
- os.path.splitext('2020.2.21.demo.py') 分隔hou'zhui
-
- sys 系统相关的方法
- sys.exit() 与内置函数exit() 功能一致
- sys.path 结果是一个列表,表示查找模块的路径
- sys.stdin 接受用户的输入和input 相似,但可以不断输入
- sys.stdout 标准输出,修改sys.stdout 可改变默认的输出位置
- sys.stderr 修改sys.stderr 可改变错误默认的输出位置 默认都是控制台
- math 数学相关模块
-
- math.factorial() 求阶乘
- math.floor(12.98)向下取整
- math.ceil(15.0001) 向上取整
- math.pow(2,10) 内置函数 pow(2,10) 2**10
- math.pi
-
-
Random 模块
-
- random.randiant(2,9) 包含2,不包含9 的随机数
- random.randrange(2,9) 包含
- random.random() [0,1)包含0,不包含1 的随机浮点数
- random.choice(['a','b','c']) 随机抽取
- random.sample(['a','b','c'],2) 随机抽取几个
-
- datatime
-
- datetime.datetime.now() 获取当前时间
- datetime.date(2020,1,1) 创建一个日期
- datetime.time(18,23,45) 创建一个时间
- datetime.datetime.now()+datetime.timedelta(3) 三天以后
-
- time
-
- time.time 获取从1970 0101 到现在的秒数
- time.strftime('%Y-%m-%d %H:%M:%S') 按照指定格式输出时间
- time.ctime() 传入时间戳,转换为日期格式
- time.asctime() 传入元组数据,转换成日期格式
- time.sleep(1)
-
- calendar 日历模块
-
hashlib 单向加密:只有加密过程,不能解密
- md5 sha 加密
- Hmac
-
uuid生成全局唯一的模块
- 项目打包
-
- pip freeze>requirements.txt 将安装模块重定向到
- pip install -r requirements.txt 安装第三方软件
-
临时换源 pip install flask -i https://pypi.douban.com/sample/
- 永久换源
-
- 自定义模块
- __name__
- 直接运行py ,__name__是__main__
- 被其他模块加载,调用时,__name__是当前模块名
- 类和对象
- 定义类
-
- Class MyClass: 驼峰命名
- Class MyClass(object):
- 在__init__ 方法里以参数的形式定义属性
- 创建对象时,自动调用__init__方法
- s=Student('张三',18)
- 调用__new__方法,申请一段内存空间
- 调用__init__方法,并让self 指向申请好的那段内存空间,填充数据
- 让S1也指向这段内存空间
- 直接使用没有定义的属性会报错
- 使用等号赋值 s.height ="180",动态属性
- 如果属性不存在会创建一个新属性
- 如果属性存在,会修改属性的值
- __slots__ = ('name','age') 这个属性直接 定义在类里规定该类能存在哪些属性
- 魔术方法,是类里的特殊方法,不需要手动调用,会在合适的时机自动调用
- 以__ 开始 和结束,方法名由系统定义
- 申请空间 __new__
- 创建对象 __init__
- 对象被销毁时(程序结束),会自动调用__del__
- 打印对象时会调用对象的__str__ 或者__repr__方法
- 对象名加括号,调用对象的 __call__方法
- id(对象) 获取对象的内存地址
- is 判断两个对象是否为同一个对象,内存相同即为同一对象
- == 调用对象的 __eq__ 方法 如果不重,默认为地址比较
-
- 私有变量
- 以两个下划线开头的为私有属性,在外部不能访问
- 静态方法
- 如果在一个方法里没有用到实例对象的任何属性,这个方法可设成static
- 静态方法可直接通过类.方法 访问
-
类方法
-
如果这个函数只用到了类属性,我们可以把它定义成一个类方法
- 类方法会有一个参数cls,也不需要手动传参会自动传参
- cls 指类对象 cls is person 可以访问类属性
-
- 单例设计模式
- 重写__new__ 方法,需要手动申请内存,否则自动申请内存
-
面向对象编程三个对象
-
- 封装:函数是对语句的封装,类是对函数和变量的封装
- 继承:父子关系,子类可使用父类的属性和方法
- 多态:一种技巧,提高代码灵活度
- 多继承 一条线找到底
-
-
私有属性的继承特点
- 父类的私有方法,子类不能访问 可以通过父类访问 子对象_父类名__父类私有方法
- 自己类的私有方法 对象名._类名__私有方法()
- 新式类和经典类
-
面向对象相关方法
- 判断一个对象是否由指定的类或者父类实例化出来
- isinstance(p1,Person)
- issubclass(Student,Person) 判断一个类是否是另一个类的子类
- 多态
-
子类重写父类方法
-
子类和父类实现完全不一样,子类可以重写父类方法
-
子类在父类的基础上有更多的实现
-
父类类名.父类方法名(self,参数列表)
-
使用supper 方法直接调用父类方法 supper(类名,self).__init__(name,age)
-
-
多态的使用
-
基于继承,通过重写父类的方法,达到不同子类对象调用相同的父类方法,得到不同的结果,提高代码的灵活度
-
-
- 文件操作
- 打开文件
- 读取文件
- 以二进制读写 rb,wb
- CSV
- 将数据写到内存
- 涉及到 StringIO 和BytesIO两个类
-
序列化与反序列换
-
序列化
-
将数据从内存持久化保存到硬盘的过程
-
dumps 将数据转换成json 字符串,不会保存在文件
-
dump 将数据转换成字符串并写入指定文件
-
反序列化
-
将数据从硬盘加载到内存的过程
-
loads 将 Json 字符串加载 成python 里的数据
-
load 读取文件,把读取到的内容加载成python 里的数据
-
json 本质就是字符串
-
python 里存入数据只支持字符串和二进制
-
json:将python 里的数据(str/list/tuple/dict/int/float/bool/None)等转换成对应的字符串
-
pickle 将python 里任意的对象转换成二进制
-
-
-
- finally 参数的使用
- try : finally: finally里面的命令都会执行
- with
-
自定义异常
-
内置常见异常
-
-
自定义错误
-
继承Exception 重写__init__和__str__ 方法
-
-
- 高级装饰器
- 装饰器进行权限控制
-
迭代器
-
可迭代对象 ,for ...in 可迭代对象
-
list/tuple/dict/set/str/range/filter/map
-
isinstance(d,Iterable) True为迭代器
-
重写 __iter__ ,就是个迭代器
-
-
-
for ...in 循环本质是可用迭代对象的 __iter__方法,获取这个方法的返回值
-
这个返回值需要的是一个对象,然后找到这个对象的__net__方法
-
编写斐波那契迭代器
-
-
-
-
生成器
-
-
-
-
生成器
-
-