zoukankan      html  css  js  c++  java
  • python重点串讲

    1、解释型和编译型

    开发环境:windows开发(主流),但是有些如sanic,fastapi框架的话,windows不支持,所以需要安装unbuntu,在上面开发

    远程连接linux开发,院成立案件linux内的docker开发

      c:c代码写完,编译(不同平台),跨平台运行,linux上源码安装软件,自行编译,运行

      java:一处编码,处处运行,java是编译型还是解释型?编译型,编译过程---把java源代码编译成字节码文件
    .class---不能直接运行在操作系统之上---->jvm(java虚拟机),jvm运行至少要300m内存(jdk、jre、jvm、javase、javame、javaee)

      go:编译型,跨平台编译(windows平台可以编译出mac平台的可执行文件),所有go代码打成一个可执行文件
      python: 强类型动态语言
      js:只能在浏览器中运行,nodejs
      php:web开发

    2、数据类型

    python当中一切皆对象

    type和object的关系

    1、type是object的类
    2、type继承了object
    3、type是type自己的类
    4、object也是由type实例化得到
    

    注意:所有类,除了object都能继承自object,包括type

    3、深浅拷贝

    python一切皆对象的好处是不同类型之间的变量直接可以相关赋值。

    其本质变量都是指向了一个内存地址。

    浅拷贝只拷贝了一个值,这个值对应的地址没有拷贝。

    深拷贝是吧所有的内容全部复制一份,也就意味着相对于浅拷贝,深拷贝占了很大的资源。

    4、可变类型和不可变类型

    字典,列表,集合----->可变类型

    数字,字符串,元组----->不可变类型

    字典的key必须用不可变类型,可以hash

    python中参数传递都是copy一份传递过去,由于一切皆对象,传过去,都是地址,python中区分可变和不可变类型,可变类型在函数中修改会影响原来的,不可变类型,不会影响原来的

    5、字符编码

    计算机的计量单位

      bit比特位:0或者1的一个小格
      8个bit位是一个byte,一个字节
      1024个字节--->1kb
      1024kb--->1mb
      1024mb--->1gb

    1个字节--->2^8种变化,就可以表示出所有的字符(数字,字母,标点符号)

    Unicode编码统一了,字符和数字的对应关系

    utf-8:目前主流的编码方式

    6、闭包函数

    注意:定义在函数内部;对外部作用域有引用

    def warrper(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")
    

    7、python中的魔法方法

    # __init__:类实例化会触发
    # __str__:打印对象会触发
    # __call__:对象()触发,类也是对象  类(),类的实例化过程调用元类的__call__
    # __new__:在类实例化会触发,它比__init__早(造出裸体的人,__init__穿衣服)
    # __del__:del 对象,对象回收的时候触发
    # __setattr__,__getattr__:(.拦截方法),当对象.属性--》赋值会调用setattr,如果是取值会调用getattr
    # __getitem__,__setitem__:([]拦截)
    # __enter__和__exit__ 上下文管理器
    
    

    setattr,getattr,setitem,getitem演示

    class Person:
        def __init__(self,name):
            self.name=name
            def __setitem__(self, key, value):
            setattr(self,key,value)  #反射
        def __getitem__(self, item):
            return getattr(self,item) # 反射取值
    
    p=Person('lqz')
    # p.name='ppp'
    p['name']=10 # 如何变行 重写__setitem__魔法方法
    # print(p.name)
    
    print(p['name'])
    
    
    # dic={'name':'lqz','age':19}
    
    class Mydic(dict):
        def __setattr__(self, key, value):
            print("对象加点赋值,会触发我")
            self[key]=value
        def __getattr__(self, item):
            print("对象加点取值,会触发我")
            return self[item] # 不要加引号
    
    mydic=Mydic(name='lqz',age=18)
    # print(mydic['name'])
    print(mydic.name)
    # mydic.name=99
    # print(mydic.name)
    

    with 上下文管理器

    class Person:
        def __enter__(self):
            print("我在with管理的时候,会触发")
            print('进入with语句块时执行此方法,此方法如果有返回值会赋值给as声明的变量')
            return 'oo'
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('退出with代码块时执行此方法')
            print('1', exc_type)
            print('2', exc_val)
            print('3', exc_tb)
    
    
    with Person() as p:   # 这句话执行,会触发类的__enter__
        print(p)
    

    eq

    class A:
        def __init__(self,x,y):
            self.x = x
            self.y = y
    
        # def __eq__(self,obj):
        #     # 打印出比较的第二个对象的x值
        #     print(obj.x)
        #     if self.x +self.y == obj.x+obj.y:
        #         return True
        #     else:
        #         return False
    
    a=A(1,2)
    b=A(99,3)
    print(a=='ddd')   # 当执行==s时,会触发__eq__的执行,并且把b传进去,就是object
    # ==后只要是对象,就可以传进去,就是object
    
    

    8、cookie,session,token

    HTTP协议:无状态,无连接,基于请求响应,基于tcp/ip,应用层协议
    
    mysql:c/s架构:底层基于socket,自己封装的协议,mysql的客户端:
    
    navcate(c++图形化界面,实现了请求和响应协议),pymysql(用python语言实现了请求和响应协议)
    
    redis:c/s架构:底层基于socket,自己封装的协议
    
    docker:c/s架构,基于http协议,使用restfull规范
    
    elasticsearch:c/s架构,基于http协议,使用restfull规范
    
    cookie:是存在于浏览器的键值对,向服务端发送请求,携带它过去(不安全)
    
    session:存在于服务端的键值对(放在哪?内存中,文件,mysql,redis)
    #  缺陷:如果用户量很大,存储需要耗费服务器资源
    
    token:就是个字符串(既安全,又存个人信息),加密字符串,会有个人信息
    
    token现在应用非常广泛,契合了前后端分离
    JWT:json web token
    

    9、django中的session底层原理

      在中间件中,请求走的时候,process_response,取出request.session的modify属性,判断是否是true,如果是true,表示在视图函数中修改过session,数据库同步修改,如果是false,就不修改,返回给前端sessionid:随机字符串
      请求来了,通过sessionid,取出随机字符串--》去数据库中查--》把表的数据转成字典,赋值给request.session,后面视图函数中就可以操作它了
    

    10、异常处理

    try:
    except   :
    finally:
    else:  什么时候执行
    
    
    try:
        print("xxx")
        # print(1/0)
    except Exception as e:
        print(e)
    else:  # 基本上不会用到
        print("正常执行,没有出异常,会走")
    finally:
        print("我是finally")   # 用于会走,无论是否有异常
    

    11、pymysql的使用

    import pymysql
    
    #连接数据库
    conn=pymysql.connect(host='101.133.225.166', user='root', password="123456",database='test', port=3306) #
    
    # 获取游标
    cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 查出来数据是字典格式
    
    # 操作 定义一个sql
    sql='select id,name from book'
    cursor.execute(sql)
    ret=cursor.fetchall()
    print(ret)
    
    # 插入
    sql='insert into book(id,name) values (%s,%s)'
    cursor.execute(sql,[3,'lqz'])
    conn.commit()
    
    # 删除
    sql='delete from book where name=%s'
    cursor.execute(sql,['lqz'])
    conn.commit()
    
    # 更新
    sql='update book set name=%s where id=%s'
    cursor.execute(sql,['xxx',1])
    conn.commit()
    
  • 相关阅读:
    tee & vim
    xml ui
    Maven多模块项目打包前的一些注意事项(打包失败)
    jdk11+ spring5+ 报反射错误的屏蔽方法
    Plugin 'org.springframework.boot:spring-boot-maven-plugin:' not found 用IDEA创建springboot项目的时候遇到的一些坑
    如何在Zynq-7000上烧写PL Image
    python3 使用ssl安全连接发送邮件
    Centos7 启动指定docker容器报错
    Linux下多进程编程
    make的变量及赋值运算
  • 原文地址:https://www.cnblogs.com/Lance-WJ/p/13220929.html
Copyright © 2011-2022 走看看