Python基础知识点

**

基础知识点

**

代码调式

调试方式1:

print(输出可能出现错误的数据)

调试方式2

断言调式
需要输出错误信息的位置处 不使用print 而是使用assert
格式:
assert 满足需求的条件, 出现不满足条件的数据提示的错误信息
说明:
如果满足条件 代码继续向下执行
不满足条件 直接在断言的位置报错 提示错误信息

调试方法3:

模块logging中的内容
把输出错误信息的位置 替换成logging
1. 导入模块logging
2. 在需要输出错误信息的位置
   logging.info(提示的数据)
   如果只写这一句 不会显示想输出的数据内容 如果想显示提示的数据 在导入模块的下方添加
   logging.basicConfig(level=logging.INFO) ----> 使设置的info中的信息被输出

调试方法4:

pdb调试 --- 可以实现让代码一行一行执行
使用pdb测试的时候 需要启动pdb  启动语句是在控制台Terminal上书写的
	前提进入到py文件所在的路径
	指令: python -m pdb 执行的py文件
	进入到pdb环境下 输入n执行单行代码
	进入pdb环境下可以指令p 变量名 查看该变量的值
	结束调试 输入q

调试方法5:

debug断点调试

单元测试

单元测试:
	对一个模块, 一个函数或者是一个类进行正确检验的测试工具
比如:
	系统提供的函数:
		int() ----> 将数据转化为整型
需要导入模块 unittest
并且设置一个测试类 继承自unittest.TestCase

# value = [12, 13]
# res = int(value)
# print(res)

def cus_int(n):
    import math
    if type(n) == int:
        return n
    elif isinstance(n, float):
        return math.floor(n)
    elif isinstance(n, str):
        if n.isdigit():
            return eval(n)
        else:
            raise ValueError("数据不能转化为整型")
    elif isinstance(n, bool):
        return 1 if n else 0
    else:
        raise TypeError("不能转换指定类型")


def sort_list(src_list):
    #排序算法 : 冒泡 对列表数据大小进行降序排序
    for out in range(1, len(src_list)):
        for inner in range(0, len(src_list) - out):
            if src_list[inner] < src_list[inner+1]:
                src_list[inner], src_list[inner + 1] = src_list[inner + 1], src_list[inner]
    return src_list


from unittest_pack.test import cus_int, sort_list

import unittest

class Test(unittest.TestCase):
    #测试的方法
    def test_cus_int(self):
        '''
        第一个参数 要进行测验的执行函数
        第二个参数 设置函数运行之后的预期值
        第三个参数 如果函数运行结果 与 预期值不一致 提示的错误信息
        '''
        self.assertEqual(cus_int(5.12), 5, "转换结果不一致")

    def test_sort_list(self):
        self.assertEqual(sort_list([19, 27, 35, 41]), [41, 27, 35, 19], "排序失败")

if __name__ == '__main__':
    unittest.main()

SQL语句的优化

在虚拟环境中安装第三方插件django-debug-toolbar,然后在settings,urls文件中配置所需要的条件,配置好之后,刷新一下浏览器,就会出现debug-toolbar这个插件,在上面我们可以看到页面加载所需要的时间,和页面加载所需要的所有的sql语句等,然后根据加载时间和sql语句对代码进行优化,可以使用redis来进行缓存加载,对于一些sql语句所查询的对象,一般先对redis缓存进行查询,如果存在就直接缓存加载,如果不存在就去数据库查询,然后set到redis当中,当下次加载直接进入缓存获取。

  1. 请简述项目中优化sql语句执行的效率的方法

(1)选择最有效率的表名顺序

(2)WHERE子句中的连接顺序

(3)SELECT子句中避免使用‘*’

(4)用Where子句替换HAVING子句

(5)通过内部函数提高SQL效率

(6)避免在索引列上使用计算。

(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。

memcached缓存

memcached与redis相比的缺点是它的数据不能持久化,仅作为缓存来用。

对于单个对象的缓存适合用memcache

缓存整个页面

from django.views.decorators.cache import cache_page

@cache_page(60)

def index(request,page=1)

Celery

Celery是一个用Python开发的异步的分布式任务调度模块

当用户触发的一个操作需要较长时间才能执行完成时,可以把它作为任务交给Celery去异步执行,执行完再返回给用户。这段时间用户不需要等待,提高了网站的整体吞吐量和响应时间。

Celery有一下5个核心角色

Task

就是任务,有异步任务和定时任务

Broker

中间人,接收生产者发来的消息即Task,将任务存入队列。任务的消费者是Worker。Celery本身不提供队列服务,推荐用Redis或RabbitMQ实现队列服务。

Worker

执行任务的单元,它实时监控消息队列,如果有任务就获取任务并执行它。

Beat

定时任务调度器,根据配置定时将任务发送给Broker。

Backend

用于存储任务的执行结果

它的优点:

高可用性

倘若连接丢失或失败,职程和客户端会自动尝试连接,中间人会通过主/主,或主/从的方式复制来提高可用性

快速

单个celery进程每分钟可处理数以百万计的任务,而保持往返延迟在亚毫秒级别

灵活

celery几乎所有部分都可以拓展或单独使用。

session和cookie

  1. 简述Session的原理,并说明session和cookies的区别。

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1、cookie数据存放在客户的浏览器上,

session数据放在服务器上

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗

考虑到安全应当使用session

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

考虑到减轻服务器性能方面,应当使用COOKIE

  1. 什么是http无状态协议,怎么解决?

http协议无状态中的【状态】到底指的是什么?!

先来看这句话的另外两个概念:(标准的http协议是无状态的,无连接的)

标准的http协议指的是不包括cookies, session,application的http协议,他们都不属于标准协议,虽然各种网络应用提供商,实现语言、web容器等,都默认支持它

无连接指的是什么

每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的

无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接

两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session

http和https

  1. http和https的区别和优缺点。

\1. http 的URL 以http:// 开头,https以https:// 开头。

\2. http 标准端口是80 ,https是443。

3.https 协议需要到ca申请证书,http不需要。

4.http 是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

5.http 的连接很简单,是无状态的,https协议是由SSL+http协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。

优点:

  1. 通过证书可以更信任服务器。
  2. 更安全,防篡改。

缺点:

  1. https 需要证书。
  2. 因为对传输进行加密,会一定程度增加cpu消耗。
  3. 由于https 要还密钥和确认加密算法的需要,所以首次建立连接会慢一些。
  4. 带宽消耗会增加。
    TCP和UDP
    tcp传输控制协议
    tcp传输控制协议是面向连接的,面向连接就是在正式通信前必须要与对方建立起连接,比如你给别人打电话,必须等线路接通了,对方拿起话筒才能相互通话。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍
    我们来看看这三次对话的简单过程:
    \1. 主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;
    \2. 主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;
    \3. 主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。
    三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
    tcp传输控制协议可以提供可靠的服务,通过tcp连接传送的数据,无差错,不丢失,且按序到达,但是它的传输效率相对较低
    udp协议
    udp协议是面向非连接的协议,面向非连接协议就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送,比如给别人发短信,你在发短信的时候,只需要输入对方手机号就OK了。
    UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。
    UDP支持一对一,一对多,多对一和多对多的交互通信。但是它的传输的数据容易有差错和会丢失数据。
    token会话机制
    用户使用终端向服务器提供可信凭证(一般登录是用户名密码,微信公众平台是appid+appsecret),服务端确认凭证正确,则返回授权的令牌(以下称Token)。这个Token是随机的字符串且与本次授权唯一相关。返回Token给终端的同时服务端也要一并保存Token,这样终端和服务端都只认Token,终端所有请求发送都需要携带此Token,服务端会验证和控制此Token。此时Token就有两个,一个是终端Token,一个是服务端Token,其中一个不对或没有,服务端都是拒绝的。
    举个例子,你上12306购票,购买过程就是授权你Token的过程,你的纸质票就是Token,另外一半对应的Token保存在12306那的DB里头,所有门闸就是网关,当你过门闸时会验证你Token是否对应DB的Token。你下车后,12306就把DB的Token标记处理掉,这样服务端就不会再认你手上的纸质票,票也就作废了。
    MTV

Django也是一个MVC框架,但在Django中,控制器接受用户输入的部分由框架自行处理,所以Django中更关注的是视图(Views),称为MTV模式:

M 代表模型(Model),数据存取层,该层处理与数据相关的所有事物:如何存取、包含哪些行为以及数据之间的关系等

T 代表模板(Template),即表现层。该层处理与表现相关的决定:如何在页面和其他类型的文档中进行显示

V 代表视图(View),即业务逻辑层。该层包含存取模型及调取恰当模型的相关逻辑,可看作模板与模型之间的桥梁

MVC的优缺点

2018年09月05日 22:02:57 SHUIPING_YANG 阅读数 1744

版权声明:经验之谈,不知能否换包辣条,另,转载请注明出处。 https://blog.csdn.net/zhezhebie/article/details/82431612

MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制(Controller)。 MVC模式的目的就是实现Web系统的职能分工。

Model层实现系统中的业务逻辑。

View层用于与用户的交互。

Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

1、优点

1、耦合性低

视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

模型是自包含的,并且与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。如果把数据库从MySQL移植到Oracle,或者改变基于RDBMS数据源到LDAP,只需改变模型即可。一旦正确的实现了模型,不管数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想能构造良好的松耦合的构件。

2、重用性高

随着技术的不断进步,需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变。由于已经将数据和业务规则从表示层分开,所以可以最大化的重用代码了。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。

3、生命周期成本低

MVC使开发和维护用户接口的技术含量降低。

4、部署快

使用MVC模式使开发时间得到相当大的缩减,它使程后端序员集中精力于业务逻辑,前端程序员集中精力于表现形式上。

5、可维护性高

分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

6、有利软件工程化管理

由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。控制器也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。

2、缺点

1、没有明确的定义

完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。

2、不适合小型,中等规模的应用程序

花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

3、增加系统结构和实现的复杂性

对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

4、视图与控制器间的过于紧密的连接

视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

5、视图对模型数据的低效率访问

依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

6、一般高级的界面工具或构造器不支持模式

改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,会造成MVC使用的困难。

oop

下面浅谈下我对OOP思想的理解,OOP思想中很重要的有五点,类,对象,还有面向对象的三大特征:封装、继承和多态。

封装:封装分为广义上的封装和狭义上的封装,广义上的封装呢就是函数的封装,将一些常用的代码封装成方法。而狭义的封装呢就是将无需对外暴露的内容隐藏起来,进行一个对象属性的私有化,然后提供对应的设置和获取的接口

继承:继承呢就是我们将一些共有的一些属性提取出来,然后自定义一个类,作为一个父类,然后我们可以继承这个父类&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值