Python Django笔记

  1. 快捷键  在settings   keymap 中搜
    1. 快速格式化代码  ctrl+alt+l
    2. 快速复制粘贴选中的代码   ctrl +d
    3. 移动一行代码  ctrl +shift +上下箭头
  1. 注册app 时忘记用逗号分隔  --  导致会找不到模块
  2. 缺少环境变量参数,environment variable DJANGO_SETTINGS_MODULE
    1. 在 pycharm 环境变量中添加DJANGO_SETTINGS_MODULE=projectname.settings    projectname 根据实际情况更改
    2. 在项目的入口 __init__.py 中添加  (注意修改成自己的project name)
      1. import os,django
      2. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "RESTEnd.settings")# project_name 项目名称
      3. django.setup()
  1. 启动celery 时AttributeError: 'NoneType' object has no attribute 'autodiscover_tasks'
    1. celery.py 中os.environ.setdefault('DJANGO_SETTINGS_MODULE','RESTEnd.settings')--- 引号中单词拼错
  1. 在 Python 中一切都是对象,整数也是对象,在比较两个整数时有两个运算符==和is,它们的区别是:
  2. is比较的是两个整数对象的id值是否相等,也就是比较两个引用是否代表了内存中同一个地址。
  3. ==比较的是两个整数对象的内容是否相等,使用==时其实是调用了对象的__eq__()方法。
  4. 把频繁使用的整数对象用一个叫small_ints的对象池缓存起来造成的。small_ints缓存的整数值被设定为[-5, 256]这个区间,也就是说,如果使用CPython解释器,在任何引用这些整数的地方,都不需要重新创建int对象,而是直接引用缓存池中的对象。如果整数不在该范围内,那么即便两个整数的值相同,它们也是不同的对象。
  5. CPython底层为了进一步提升性能还做了一个设定:对于同一个代码块中值不在small_ints缓存范围之内的整数,如果同一个代码块中已经存在一个值与其相同的整数对象,那么就直接引用该对象,否则创建新的int对象。需要大家注意的是,这条规则对数值型适用,但对字符串则需要考虑字符串的长度
 
  1. 浅拷贝与深拷贝
    1. import copy
    2. 浅拷贝 第一层修改互不影响 :
      1. nuber2=num.copy()
      2. nuber2=copy.copy(num)  两者相等,只拷贝第一层
    1. 深拷贝,修改互不影响
      1. number3 = copy.deepcopy(num)
  1. 自符串
    1. \''  显示一个普通的双引号
    2. \n   表示一个换行
    3. \t  表示显示一个制表符
    4. \\表示一个普通的反斜线
    5. 在字符串前加“r” 表示原生字符串
    6. 可以通过下标来获取指定位置的数据  m[index]
    7. 字符串是不可改变的数据类型
    8. 对于字符串的任何操作,都不会改变原有字符串
    9. 切片是从字符串里复制一段指定的内容,生成一个新的字符串m[start:end:step]  包含start 不包含 end
    10. start  和end 为负数表示从右边数  m[-9:-5]  倒数第九个到倒数第五个
    11. end 为负数  反转
    12. x.find('h')  返回指定字符的下标,若不存在,返回-1,默认返回最小下表,x.rfind('h')默认返回最大下标
    13. x.index('h')返回指定字符的下标,若不存在则报错,默认返回最小下标,x.rindex('h')  默认返回最大下标
    14. str1.startwith('h')  str1.endwith('h')  str1.isalpha()   '1234'.isdigit()   '3.14'.isdigital  False    'add1212'.isalnum()   检验是否由数字或字母组成
    15. replace 
    1. 内容分割    split  最大分割  ,与左右分割
      1. splitlines  按照行分隔,返回包含各行为一个元素的列表
      2. partition  指定一个字符串作为分割符,分为三个元素的列表
      3.  

    2. 符编码
      • ord('a')   字符对应的编码
      • chr('97')  编码转字串
      • "1234".encode('utf8')   x.decode('utf8')
    3. 列表
    4. 有序,可变,增删改查
    5. 增加元素  append  insert   extend
    6. 删除数据 
      • x.pop()  删除并返回最后一个数据  ,x.pop(index)删除指定位置的数据
      • remove(obj)   如果数据存在则删除,否则报错
      • clear() 清空一个列表
      • del 可以删除整个变量,或者传入  index 删除指定元素
    7. 查询
      • x.index(obj)   x.count(obj)   obj in x
    8. 修改 
      1. x[5] ="yy"
    9. 交换两个变量的值
      1.  

         

      2.  

         

    10. nums.sort()   nums.sort(reverse=True)  ,直接改变的是原有的列表
    11. x=sorted(nums)   不会改变原有列表
    12. nums.reverse()  反转列表
    13. 冒泡排序   
      • 每一趟比较次数的优化
      • 总比较趟数的优化
      • 元组 不可变,仅有两个方法  index() 和count()   通过下标查找,只有一个元素,加个逗号
  2. 题目
    1. 素数
  3. 求斐波那契数列
  4. 使用递归求阶乘
  5. 白马驮
  6. 珠峰 问题
  7.  

  8. For 循环带下标遍历 加enumerate

  9. 列表推导式    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)]
  10. 字典
    1. 字典里的key 不允许重复,如果重复,后面的会覆盖前一个
    2. 字典的Value 可以是任意数据类型,但Key 只能是不可变的数据类型,一般用字符串,数字,元组
    3. 增加和修改  dict1[key] =value   如果key 存在,则为修改,如果不存在则为添加
    4. pop[key]  以键值对删除,返回value
    5. popitem()  任意删除一个键值对,并返回被删除的键值对
    6. dict1.clear()  清空字典
    7. del dict1[key1]    删除一个键值对
    8. dict1.update(dict2)   将dict2 合并到dict1
    9. 获取所有的key list  dict1.keys()  
    10. 遍历dict1.keys()  可获取每个key 对应的值  dict1['key']
    11. 获取所有的values  dict1.values() 值List 但不可反得到 key ,一般不适用
    12. 获取键值对  dict1.items()     for k ,v in dict1.items()   print(k,v)
    13. 字典推导式   dict1 = {k:v   for k,v in dict1.items()}
  11. 合并
    1. 元组和字符串  合并,可用加法
    2. list 用extend  字典用update
  12. 集合:
      • {} 里放的键值对就是字典,放的单个值就是集合,自动去重
      • 空集合set{}   ,空字典{}
      • set1.add{'ddd'}   set1.pop()  随机删除一个, set1.remove('tt') 
      • set3 =set1.union(set2)  生成一个新的集合  set1.update("value")  拼接
      • 集合运算  A-B  A&B  交,A|B 或,A^B 相同的不要
  13. eval("str")可执行字符串
  14. json
    1. m=json.dumps(dict1)  将字典变成字符串对象
    2. json.loads(m)  将json字符串转换成字典
    3.  

  15. 位置参数(必须传),关键字参数,可变位置参数(*args )以元组的额形式保存,缺省参数num=1 ,可变关键字参数(*kwargs)以字典的形式保存,   先写可变位置参数,再写缺省参数
  16. 匿名函数使用
    1. mul = lambda a,b:a+b   表达一个简单的函数
    2. 列表的相关函数,用到了匿名函数
    3. 把函数传给另一个函数
    4. sort() 需要传入Key 指定排序规则
      1.  

  17. filter(内置类) 对可迭代对象进行遍历,得到一个filter 对象
      • 可以指定两个参数,第一个参数是函数,第二个是可迭代对象
      • x = filter(lambda ele:ele>18,ages)
      • 是个filter 对象,可转成list
  18. map
    1.   m= map(lambda ele :ele+2,ages)
  19. reduce(内置类)
  20. 总结内置类(c)  内置函数(f)
    • builtins.py
    • all(obj)   将obj 中所有值转成布尔值,只要有一个为False ,结果为False 
    • any(obj)  与all()类似
    • bin()
    • oct()八进制
    • hex()十六进制
    • round()四舍五入保留指定小数位
    • divmode() 两商余数
    • chr()
    • ord()
    • dir()  返回对象的所有属性和方法
    • eval()  执行字符串
    • exit()  以指定的退出码退出程序
    • isinstance
  21. 高阶函数
    1. 一个函数作为另一个函数的返回值
    2.  

      一个函数作为另一个函数的参数 

    3.  

  22. 函数的嵌套
  23. 装饰器
  24. 装饰器详解
    1. 扩充原函数可接受的参数
    2. 从可变关键字参数拿参数
  25. 导入模块的语法

    1. 常用的系统模块
  26. 常用的系统模块
  27. 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
    •  

       

  28. sys 系统相关的方法
    1. sys.exit()  与内置函数exit() 功能一致
    2. sys.path  结果是一个列表,表示查找模块的路径
    3. sys.stdin  接受用户的输入和input 相似,但可以不断输入
    4. sys.stdout  标准输出,修改sys.stdout  可改变默认的输出位置
    5. sys.stderr 修改sys.stderr 可改变错误默认的输出位置  默认都是控制台
  29. math 数学相关模块
      • math.factorial()   求阶乘
      • math.floor(12.98)向下取整
      • math.ceil(15.0001)  向上取整
      • math.pow(2,10)    内置函数  pow(2,10) 2**10
      • math.pi
  30. 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)  随机抽取几个
  31. datatime
      • datetime.datetime.now()  获取当前时间
      • datetime.date(2020,1,1) 创建一个日期
      • datetime.time(18,23,45)  创建一个时间
      • datetime.datetime.now()+datetime.timedelta(3)  三天以后
  32. time 
      • time.time   获取从1970 0101 到现在的秒数
      • time.strftime('%Y-%m-%d %H:%M:%S')  按照指定格式输出时间
      • time.ctime()   传入时间戳,转换为日期格式
      • time.asctime()  传入元组数据,转换成日期格式
      • time.sleep(1)
  33. calendar  日历模块
  34. hashlib  单向加密:只有加密过程,不能解密
    1. md5 sha 加密
  35. Hmac
  36.  uuid生成全局唯一的模块

  37. 项目打包
      • pip freeze>requirements.txt  将安装模块重定向到 
      • pip install -r requirements.txt  安装第三方软件
      • 临时换源  pip install flask -i https://pypi.douban.com/sample/
      • 永久换源
  38. 自定义模块
  39.  __name__
      • 直接运行py ,__name__是__main__
      • 被其他模块加载,调用时,__name__是当前模块名
  40. 类和对象
  41. 定义类
      • 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__ 方法  如果不重,默认为地址比较
  42. 私有变量
    1. 以两个下划线开头的为私有属性,在外部不能访问
  43. 静态方法
    1. 如果在一个方法里没有用到实例对象的任何属性,这个方法可设成static
    2. 静态方法可直接通过类.方法  访问
  44. 类方法

    1. 如果这个函数只用到了类属性,我们可以把它定义成一个类方法

    2. 类方法会有一个参数cls,也不需要手动传参会自动传参
    3. cls 指类对象  cls  is person  可以访问类属性
  45. 单例设计模式
    1. 重写__new__ 方法,需要手动申请内存,否则自动申请内存
  46. 面向对象编程三个对象

      • 封装:函数是对语句的封装,类是对函数和变量的封装
      • 继承:父子关系,子类可使用父类的属性和方法
      • 多态:一种技巧,提高代码灵活度
      • 多继承   一条线找到底
  47. 私有属性的继承特点
    1. 父类的私有方法,子类不能访问  可以通过父类访问  子对象_父类名__父类私有方法
    2. 自己类的私有方法  对象名._类名__私有方法()
  48. 新式类和经典类
  49. 面向对象相关方法 


    1. 判断一个对象是否由指定的类或者父类实例化出来
    2. isinstance(p1,Person)
    3. issubclass(Student,Person)  判断一个类是否是另一个类的子类
  50. 多态
    • 子类重写父类方法
    • 子类和父类实现完全不一样,子类可以重写父类方法
    • 子类在父类的基础上有更多的实现
      • 父类类名.父类方法名(self,参数列表)
      • 使用supper 方法直接调用父类方法    supper(类名,self).__init__(name,age)
      •  
      多态的使用
      • 基于继承,通过重写父类的方法,达到不同子类对象调用相同的父类方法,得到不同的结果,提高代码的灵活度
  51. 文件操作
    1. 打开文件
    2. 读取文件
    3.  

       

    4. 以二进制读写  rb,wb
  52. CSV 
  53. 将数据写到内存
    1. 涉及到 StringIO 和BytesIO两个类
  54. 序列化与反序列换
    • 序列化
      • 将数据从内存持久化保存到硬盘的过程
      • dumps 将数据转换成json 字符串,不会保存在文件
      • dump 将数据转换成字符串并写入指定文件
    • 反序列化
      • 将数据从硬盘加载到内存的过程
      • loads 将 Json 字符串加载 成python 里的数据
      • load 读取文件,把读取到的内容加载成python 里的数据
    • json 本质就是字符串
    • python 里存入数据只支持字符串和二进制
    • json:将python 里的数据(str/list/tuple/dict/int/float/bool/None)等转换成对应的字符串
    • pickle 将python 里任意的对象转换成二进制
  55. finally 参数的使用
    1. try  :   finally:    finally里面的命令都会执行
  56. with
  57. 自定义异常
    • 内置常见异常
    • 自定义错误
      • 继承Exception   重写__init__和__str__ 方法
  58. 高级装饰器
  59. 装饰器进行权限控制
  60. 迭代器
    • 可迭代对象  ,for ...in 可迭代对象
    • list/tuple/dict/set/str/range/filter/map
    • isinstance(d,Iterable)   True为迭代器
    • 重写 __iter__   ,就是个迭代器
    • for   ...in   循环本质是可用迭代对象的 __iter__方法,获取这个方法的返回值
    • 这个返回值需要的是一个对象,然后找到这个对象的__net__方法
    • 编写斐波那契迭代器
    • 生成器
    • 生成器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-10-13 20:51  Nancyfeng  阅读(103)  评论(0编辑  收藏  举报