python之闭包以及服务器的开发

闭包: 函数嵌套函数 函数的返回值是一个函数  内部函数使用了外部函数的变量 造成数据不会被释放。

函数的参数是一个变量

def f(a):def f1():print(a)return f1f2 = f(2)
f2() # 2 

函数的参数是另外一个函数

def fn(f):def fn1():f()return fn1def a():print('111')s = fn(a)
s1 = s()
print(s1)

内部函数无法直接修改外部函数的变量

def a():num = 10def b():num = 20print(num)print(num)b()print(num)a() # 10 20 10 内部函数无法直接修改外部函数的变量 

内部函数如果想要修改外部函数的变量值 需要使用关键字 nonlocal 

def a():num = 20def b():nonlocal numnum = 30print(num)print(num)b()print(num)a() # 20 30 30

定义装饰器,相当于是下面的函数直接作为参数传递给闭包的函数

def fn(callback):print('我是外部的函数')def fn1():print('我是内部的函数')callback()return fn1@fn   # 使用装饰器
def callback():print('我是参数的函数啊')callback()

闭包的参数是一个函数 该函数内部还接受参数:

def f(call):num = 10def b(a,b):c = call(a,b)print(c+num) # 30 return c+numreturn b@f
def call(a,b):return a+bcall(10,10)

多个执行器的使用:

def a(call):def b():num = call()return num+1return bdef c(call):def d():num = call()return num+2return d@a
@c
def call():return 10e =call()
print(e) # 13  先执行@c的这个装饰器将最后的结果 再给到@a的执行器再去执行 

带有参数的装饰器

def func(flag):def fn(call):def b(a,b):if flag == '+':print('执行加法')elif flag == '-':print('执行减法')num = call(a,b)print(num)return breturn fn@func("+")
def add(a,b):return a+b@func("-")
def cl(a,b):return a-bg = add(10,20)h = cl(20,10)

使用类装饰器:

class Students(object):def __init__(self,fun):self.fun=fundef __call__(self, *args, **kwargs):print('调用函数')self.fun()@Students
def fn():print('我是被调用的函数')
# 调用函数   我是被调用的函数
fn() # 当函数被调用的时候 会执行 类中的__call__的这个方法 同时fn本身的这个函数也会被调用

web服务 框架开发:

import socket
import framewprk
# 创建服务器 ipv地址 tcp链接
tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 设置端口号复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
# 绑定端口号
tcp_server_socket.bind(('',8000))
# 设置监听
tcp_server_socket.listen(128)
# 循环等待客户端链接
while True:#建立链接后 获取的客户端的内容 new_socket为二进制   ip_prot=127.0.0.1 还有链接的号码new_socket,ip_prot = tcp_server_socket.accept()recv_data=new_socket.recv(4096)print(recv_data)print(len(recv_data)) # 长度725 每次都不固定if len(recv_data) != 0: # 说明有建立链接recv_content = recv_data.decode('utf-8')print(recv_content)  # 转化成了 请求报文的格式了quest_path = recv_content.split(' ',2)[1]print(quest_path) # / 或者 /index.htmlif quest_path == '/':quest_path = '/index.html'if quest_path.endswith('.html'):env = {"request_path":quest_path}# 调用外部的框架来处理动态资源的请求status,headers,response_body = framewprk.handle_request(env)print(status,headers,response_body)# 响应行response_line = "HTTP/1.1 %s\r\n" %status# 响应头response_header = ""for header in headers:response_header+="%s:%s\r\n" % header# 响应报文response_data = (response_line+response_header+"\r\n"+response_body).encode('utf-8')print(response_data)# 发送给浏览器new_socket.send(response_data)# 关闭链接new_socket.close()else:try:with open('./'+quest_path,'rb') as file:file.read()except Exception as e:with open("error.html", 'rb') as file:file_data = file.read()# 设置响应行response_line = 'HTTP/1.1 200 OK\r\n'# 设置响应头response_header = "Server:PWS/1.0\r\n"# 响应体response_body = file_data# 进行拼接 转化为二进制response = (response_line + response_header + "\r\n").encode('utf-8') + response_body# 给客户端响应消息new_socket.send(response)else:# 设置响应行response_line = 'HTTP/1.1 200 OK\r\n'# 设置响应头response_header = "Server:PWS/1.0\r\n"# 响应体response_body = file_data# 进行拼接 转化为二进制response = (response_line + response_header + "\r\n").encode('utf-8') + response_body# 给客户端响应消息new_socket.send(response)finally:# 关闭链接new_socket.close()Framewprk文件中的代码:
import time#获取首页的数据
def index():status="200 ok"response_header = [("Server","PWS/1.1")]# 返回死的数据 也就是返回当前的时间# data = time.ctime()# 这里是返回首页index的内容with open('index.html','r',encoding='utf-8') as file:        file_data = file.read()data = time.ctime()request_body=file_data.replace('{%content%}',data)return status,response_header,request_bodydef center():pass# 处理没有找到动态路径
def not_found():status = '404 Not Found'response_header = [("Server", "PWS/1.1")]data = "not Found"return status,response_header,data# 定义路由表
router_list = [('/index.html',index),('/center.html',center)]# 处理路由的函数
def handle_request(env):request_path = env['request_path']# if request_path == '/index.html':#     return index()# else:#     return not_found()# 上面的代码修改为下面的  key:index.htmll  fun:index()for key,fun in router_list:if key == request_path:return fun()else:return not_found()

使用装饰器来开发web框架:

import timerouter_list=[]#装饰器处理路由的问题 
def router(path):def decorator(call):# 把对应的路由给添加进去router_list.append((path,call)) # ('/index.html',index)def fn():return call()return fnreturn decorator# 处理没有找到动态路径
def not_found():status = '404 Not Found'response_header = [("Server", "PWS/1.1")]data = "not Found"return status,response_header,data@router('/index.html')
def index():def index():status = "200 ok"response_header = [("Server", "PWS/1.1")]# 返回死的数据 也就是返回当前的时间# data = time.ctime()# 这里是返回首页index的内容with open('index.html', 'r', encoding='utf-8') as file:file_data = file.read()data = time.ctime()request_body = file_data.replace('{%content%}', data)return status, response_header, request_body# 处理路由的函数
def handle_request(env):request_path = env['request_path']for key,fun in router_list:if key == request_path:return fun()else:return not_found()

给客户端返回JSON格式的字符串 并且数据是从mysql数据库中获取的

import time
import pymysql
import json#获取首页的数据
def index():status="200 ok"response_header = [("Server","PWS/1.1")]# 返回死的数据 也就是返回当前的时间# data = time.ctime()# 这里是返回首页index的内容with open('index.html','r',encoding='utf-8') as file:file_data = file.read()data = time.ctime()request_body=file_data.replace('{%content%}',data)return status,response_header,request_bodydef center():conn = pymysql.connect(host="localhost",port=3306,user="root",password="123456",database="test",charset="utf8")cursor = conn.cursor()sql = """select * from user;"""cursor.execute(sql)result = cursor.fetchall()  # ((2, 'zs'), (3, 'hs'), (4, 'wq'))center_data_list=[{"id": row[0], "name": row[1]} for row in result]json_str = json.dumps(center_data_list)cursor.close()conn.close()status = "200 OK"response_header = [("server","pws/1.1")]return status,response_header,json_str# 处理没有找到动态路径
def not_found():status = '404 Not Found'response_header = [("Server", "PWS/1.1")]data = "not Found"return status,response_header,data# 定义路由表
router_list = [('/index.html',index),('/center.html',center)]# 处理路由的函数
def handle_request(env):request_path = env['request_path']# if request_path == '/index.html':#     return index()# else:#     return not_found()# 上面的代码修改为下面的  key:index.htmll  fun:index()for key,fun in router_list:if key == request_path:return fun()else:return not_found()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

autossh实现内外网穿透

一、介绍 ​ Autossh 是一个用于建立和维护 SSH 隧道的工具,它在网络连接断开或中断时可以自动重新连接。通过 Autossh,您可以方便地在不稳定的网络环境下保持持久的 SSH 连接。 ​ Autossh 是一个跨平台的工具,可在多个操作系统上使用&…

Java操作Redis(通过Jedis)

一、环境搭建 这里我使用的SpringBoot版本是2.6.3&#xff0c;所以我引入的Jedis相关版本也不是很高 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency><…

数学建模--Matlab求解线性规划问题两种类型实际应用

1.约束条件的符号一致 &#xff08;1&#xff09;约束条件的符号一致的意思就是指的是这个约束条件里面的&#xff0c;像这个下面的实例里面的三个约束条件&#xff0c;都是小于号&#xff0c;这个我称之为约束条件符号一致&#xff1b; &#xff08;2&#xff09;下面的就是上…

我的3次软考高项通关之旅

1、缘起 初次听说软考是在2022年下半年了&#xff0c;软考的高级分为很多种&#xff0c;我起先想报考高级架构师&#xff0c;但是架构师一年才考一次&#xff0c;如果一次考不过得再准备一年&#xff0c;时间对我来说太长了&#xff0c;于是我决定报考一年考两次的高项。对于国…

iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件

从iOS设备恢复数据。 对于任何数据恢复软件来说&#xff0c;从iOS设备恢复数据都是一项复杂的任务&#xff0c;因为Apple已将众多数据保护技术集成到现代iPhone和iPad中。其中包括硬件加密和文件级加密。iOS 上已删除的数据只能通过取证文件工件搜索来找到&#xff0c;例如分析…

Python 报错 Max retries exceeded with url 解决方案

下面有三个常见的方法&#xff1a; 1、增加重试连接次数&#xff1a; requests.DEFAULT_RETRIES 52、关闭多余的链接&#xff1a; 默认的http connection是keep-alive的&#xff0c;在post请求中&#xff0c;header中有这样一个字段&#xff1a;Connection&#xff0c;我们…

抖音集团基于 Apache Doris 的实时数据仓库实践

作者&#xff1a;字节跳动数据平台 在直播、电商等业务场景中存在着大量实时数据&#xff0c;这些数据对业务发展至关重要。而在处理实时数据时&#xff0c;我们也遇到了诸多挑战&#xff0c;比如实时数据开发门槛高、运维成本高以及资源浪费等。 此外&#xff0c;实时数据处…

游戏心理学Day26

游戏测试 我们能够成为创建游戏机制和系统的专家&#xff0c;却无法在没有测试数据支持的情况下&#xff0c;妄言游戏的真实品质。因为游戏更关注的是人的感受而非系统&#xff0c;毕竟系统通常都很清晰且符合逻辑&#xff0c;而玩家的感受却个人化且难以洞悉。我们能够在自身…

C#面试题目含参考答案(四)

前言 面试是应聘一个工作岗位的环节&#xff0c;来考察一个人的工作能力与综合素质。在应聘C#程序员或与C#相关岗位时&#xff0c;我们都会被问到一些与.NET、C#、数据库、业务知识或编程思想等问题。本文列举一些问题及提供参考答案&#xff0c;题目&#xff08;四&#xff0…

用谷歌Gemini免费批量生成微信公众号图书带货文章

谷歌Gemini 的api现在是免费的&#xff0c;功能很强大。可以在其官网简单几步操作申请到API&#xff1a;https://ai.google.dev/pricing 以上是一些Excel表格中的图书名称&#xff0c;现在要通过谷歌Gemini来批量生成这些图书的带货推广文章。 ChatGPT中输入提示词&#xff1a…

NVIDIA GPU参数

NVIDIA作为全球领先的GPU制造商&#xff0c;其产品广泛应用于深度学习、机器学习、高性能计算&#xff08;HPC&#xff09;和图形计算等领域。以下是NVIDIA一系列GPU的性能参数概述&#xff1a; V100 Tensor Core GPU V100是NVIDIA的一款高性能GPU&#xff0c;专为深度学习、机…

java对word文档预设参数填值并生成

目录 &#xff08;1&#xff09;定义word文档模板 &#xff08;2&#xff09;模板二次处理 处理模板图片&#xff0c;不涉及图片可以跳过 处理模板内容 &#xff08;3&#xff09;java对word模板填值 &#xff08;4&#xff09;Notepad的XML Tools插件安装 工作上要搞一个…

什么是服务器硬盘?

什么是服务器硬盘呢&#xff1f; 服务器硬盘顾名思义&#xff0c;指的就是在服务器上所使用的硬盘&#xff0c;如果服务器是数据网络中的核心部分&#xff0c;那么服务器硬盘则是指数据网络核心的数据仓库&#xff0c;其中所有的软件应用与用户数据信息都是存储在服务器硬盘当中…

C#与工业自动化结合还有搞头吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c#的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;当然有搞头&#xff01;C#是一…

Java 8 新特性:Lambda表达式让你的代码焕然一新——掌握它,让编程变得轻松又高效!

前言 Java 8 是 Java 发展史上的一次重要里程碑。作为企业级开发语言&#xff0c;它在性能和功能上做了巨大的提升。这其中&#xff0c;Lambda表达式是一个关键的新特性&#xff0c;它为 Java 语言带来了函数式编程的概念。本篇文章将深入探讨Lambda表达式&#xff0c;并结合热…

中断变轮询的一种机制

前言 MCU中断嵌套中断很容易引起问题&#xff0c;例如我们在MCU中引入串口shell&#xff0c;封装一些指令&#xff0c;如果这些指令中需要调用其他中断&#xff0c;例如I2C发送中断等&#xff0c;就很容易引起问题&#xff0c;这个时候我们就需要搞一个缓冲机制 思考 那么应…

element 问题整合

没关系&#xff0c;凡事发生必有利于我 文章目录 一、el-table 同级数据对齐及展开图标的位置问题二、el-table 勾选框为圆角及只能勾选一个 一、el-table 同级数据对齐及展开图标的位置问题 element 官方提供的扩展tree型数据在表格里默认是靠左边对齐&#xff0c;项目需求需要…

超越边界:探索深度学习的泛化力量

深度学习的泛化能力 一. 简介1.1 深度学习的定义1.2 什么是泛化能力1.3 深度学习模型的泛化能力1.4 提升深度学习模型的泛化能力 二. 泛化能力的重要性2.1 深度学习中泛化能力的作用2.1.1 防止过拟合2.1.2 处理噪声和不完整数据2.1.3 对于数据分布的变化具有适应性 2.2 泛化能力…

Gitlab合并代码并解决冲突演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【SQL】数据操作语言(DML) - 删除数据:精细管理数据的利刃

目录 前言 DELETE语句的基础使用 删除指定记录 清空表与删除表数据的区别 注意 前言 在数据库管理的日常工作中&#xff0c;数据的删除是一项需要格外小心的操作&#xff0c;因为一旦数据被删除&#xff0c;往往难以恢复。数据操作语言(DML)中的DELETE语句&am…