python知识点总结(一)

在这里插入图片描述


一、什么是WSGI,uwsgi,uWSGI

1、WSGI

WSGI:是python web应用程序与web服务器之间的通用标准接口。 它定义了web服务器和python应用程序之间的通信协议,使得不同的web服务器和python框架可以无缝集成。WSGI允许开发者使用统一的方式编写web应用程序,而不用关心底层的服务器实现细节。

为什么需要wsgi呢?
当请求时Web服务器需要和web应用程序进行通信,但是web服务器有很多种啊,例如最新的是nginx,专门提供http服务的;Python web开发框架也对应多种啊,例如django、flask、fastapi,专门开发web应用的;它们之间需要一个桥梁,所以WSGI应运而生,定义了一套通信标准。试想一下,如果不统一标准的话,就会存在Web框架和Web服务器数据无法匹配的情况,那么开发就会受到限制,这显然不合理的。

2、uWSGI

uWSGI:是一种web服务器软件,它实现了WSGI协议,并提供高性能的web服务。uWSGI可以作为一个独立的Web服务器运行,也可以作为一个与其他Web服务器(如Nginx、Apache等)配合使用的应用程序容器。它支持多线程、多进程、异步I/O等特性,能够处理大量并发请求,并提供了丰富的配置选项和插件机制。

3、uwsgi

uwsgi:是一种通信协议,它是uWSGI服务器与其他Web服务器(如Nginx)之间进行通信的协议。 uwsgi协议是uWSGI服务器与前端Web服务器之间传递请求和响应的标准格式,它定义了数据包的结构和字段含义。通过uwsgi协议,uWSGI服务器可以与前端Web服务器进行高效的通信,实现负载均衡、反向代理等功能。

因此,uWSGI 是一个 Web 服务器,可以通过 WSGI 协议与 Python 应用程序通信,并使用 uwsgi 协议进行通信。WSGI 是 Python Web 应用程序与 Web 服务器之间的接口规范,定义了应用程序和服务器之间的标准接口而 uwsgi 则是 uWSGI 服务器与应用程序之间的二进制通信协议。

二、python中为什么没有函数重载?

首先python是解释性语言,函数重载现象通常出现在编译型语言中。
其次python是动态类型语言,函数的参数没有类型约束,也就无法根据参数类型区分重载。
再者python中函数的参数可以有默认值,可以使用可变参数和关键字参数,因此即便没有函数重载,也要可以让一个函数根据调用者传入的参数产生不同的行为。

三、Python中如何跨模块共享全局变量?

要在单个程序中跨模块共享全局变量,请创建一个特殊模块。在应用程序的所有模块中导入配置模块。该模块将作为跨模块的全局变量提供。

四、内存泄露是什么?如何避免?

内存泄漏是指在程序运行时,申请的内存空间没有及时被释放,导致程序占用的内存不断的增大,最终可能导致系统崩溃或者变得缓慢。

Python中的内存泄漏原因可以归结为以下几种情况:

  • 1.对象引用未释放:当一个对象不再被使用时,如果其引用计数没有归零,垃圾回收机制无法回收该对象所占用的内存。这种情况通常发生在循环引用的情况下,即两个或多个对象相互引用,导致它们的引用计数无法归零。为了解决这个问题,可以使用手动解除循环引用。

  • 2.缓存对象未正确管理:在某些情况下,为了提高性能,程序会使用缓存来存储一些对象。如果缓存对象未正确管理,即没有适时地从缓存中移除不再需要的对象,那么这些对象将一直占用内存。解决这个问题的方法是在适当的时机清理缓存,或使用LRU(LeastRecently Used)等缓存替换算法。

  • 3.大对象未释放:Python中的大对象(如大列表或大字典)在不再使用时可能会导致内存泄漏。这是因为这些对象的引用计数可能不会立即归零,从而延迟了垃圾回收的执行。为了避免这种情况,可以考虑手动释放大对象的引用,或者将其拆分为更小的对象来减少内存占用。

不使用一个对象时使用:del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题。
通过 Python 扩展模块gc 来查看不能回收的对象的详细信息。
可以通过 sys.getrefcount(obj)来获取对象的引用计数,并根据返回值是否为 0来判断是否内存泄漏。

五、谈谈lambda函数作用?

(1)、lambda函数比较轻便,即用即扔,很适合需要完成某一项简单功能,但是这个简单的功能只在此一处使用,连名字都很随意的情况下;
(2)、lambda是匿名函数,一般用来给filter,map,reduce这样的函数式编程服务;
(3)、作为回调函数,可以传递给某些应用,比如消息处理等。

六、写一个函数实现字符串反转,尽可能写出你知道的所有方法。

方法1

name = "abcde"
print(name[::-1])

方法2

print(''.join(list(name)[::-1]))

方法3

def a(name):
    res = ''
    for i in range(len(name) - 1, -1, -1):
        res += name[i]
    return res


name = "abcde"
r = a(name)
print(r)

七、时间复杂度和空间复杂度

在这里插入图片描述

八、要求:设计一个装饰器函数,如果被装饰的函数返回字符串则将字符串每个单词首字母大写

class AA:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        res = self.func(*args, **kwargs)
        if isinstance(res, str):
            res=res.title()
            return res
        else:
            return res

@AA
def func123(s):
    return s

print(func123("qwe"))

九、按照题目要求写出对应的函数。

要求:写一个函数,传入的参数是一个列表(列表中的元素可能也是一个列表),返回该列表最大的嵌套深度。
例如:列表[1,2,3]的嵌套深度为1,
列表[[1],[2,[3]]]的嵌套深度为3。

def list_depth(items):
    if isinstance(items, list):
        max_depth = 1
        for item in items:
            max_depth = max(list_depth(item) + 1, max_depth)
        return max_depth
    else:
        return 0


items = [[1], [2, [3]]]
r = list_depth(items)
print(r)


在这里插入图片描述

相关推荐

  1. Python知识总结

    2024-03-17 00:18:03       4 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 00:18:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 00:18:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 00:18:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 00:18:03       18 阅读

热门阅读

  1. 由浅到深认识C语言(1):C语言概论

    2024-03-17 00:18:03       19 阅读
  2. app分发步骤有那些?

    2024-03-17 00:18:03       21 阅读
  3. 如何理解闭包

    2024-03-17 00:18:03       21 阅读
  4. 【Unity】旋转的尽头是使用四元数让物体旋转

    2024-03-17 00:18:03       16 阅读
  5. Websocket服务监听收发消息

    2024-03-17 00:18:03       21 阅读
  6. Meson编译工具安装及使用Meson编译DPDK

    2024-03-17 00:18:03       23 阅读
  7. WSL与VirtualBox区别

    2024-03-17 00:18:03       21 阅读
  8. CentOS8安装docker

    2024-03-17 00:18:03       15 阅读
  9. docker部署zabbix使用postgresql数据库

    2024-03-17 00:18:03       19 阅读
  10. C语言演示多线程编程条件下自旋锁和屏障的使用

    2024-03-17 00:18:03       17 阅读