首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

python - http请求带Authorization

# 背景 接入公司的一个数据统计平台,该平台的接口是带上了Authorization验证方式来保证验签计算安全 # 方法 其实很简单,就是在header中加入key=Authorization,value是协商好的协议即可; 如,我们这边是base64.b64encode(uae_name + ":" + uae_passwd); 因此计算就是: # 计算uae的authorizationdef get_authorization(): return base64.b64encode(uae_name + ":" + uae_passwd); headers = { 'Authorization': 'Basic {}'.format(get_authorization()), 'ua': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36' } resp = requests.get(url, headers=headers) get_result(json.loads(resp.content)) print "" 虽千万人,吾往矣!

优秀的个人博客,低调大师

Python数组中求和问题

本专题主要介绍哈希表和指针两种方法来解决该类问题,从两个数之和引申到三个数之和,再从四个数之和的问题上思考如何构建出一种通用的代码(可以解决N个数之和)。本文主要内容是通过001问题来初步了解数组求和的两种常用方法。 001-Two Sum 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 示例 : 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 暴力循环 O(n^2) 唯一需要注意的是同一个元素不能复用 nums_len = len(nums) for i in range( 0 , nums_len): for j in range(

优秀的个人博客,低调大师

Python中*和**的使用

在为函数传递参数和函数定义时使用参数的时候,时常会看到有和*和**,下面分别讲解其作用。 调用函数时使用*和 ** 假设有函数 def test(a, b, c) test(*args):* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3) 。 test(**kwargs):** 的作用则是把字典 kwargs 变成关键字参数传递。比如上面这个代码,如果 kwargs 等于 {‘a’:1,’b’:2,’c’:3} ,那这个代码就等价于 test(a=1,b=2,c=3) 。 定义函数参数时使用*和** def test(*args): 定义函数参数时* 的含义又要有所不同,在这里 *args 表示把传进来的位置参数都装在元组 args 里面。比如说上面这个函数,调用 test(1, 2, 3) 的话, args 的值就是 (1, 2, 3) 。: def test(**kwargs): 类似的, ** 就是针对关键字参数和字典的了。 调用 test(a=1,b=2,c=3) 的话, kwargs 的值就是 {‘a’:1,’b’:2,’c’:3} 了。

优秀的个人博客,低调大师

python-函数入门(一)

1.什么是函数: 可重复使用的,用来实现单一,或相关联功能的代码段。 函数分为内置函数和自定义函数,这里先讲自定义函数 2.如何定义函数: #语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 注:函数必须先定义才能使用,定义阶段不执行代码只检测语法.意思就是语法错误在定义阶段就会检测出来,代码的逻辑错误只有在执行时才会提示. 3.定义函数的三种形式 无参:用于执行一些打印等操作,不需要参数传进去 有参:需要根据传进去的参数进行运算 空函数:用于设计代码结构 # 1.无参函数 # def foo(): # print('from foo') # foo() # # 2.有参函数 # def bar(): # print(x,y) # bar(1,2) # # 3,空函数 # def func(): # pass 4.函数调用 函数调用就是函数名加个()即可 4.1调用函数的三种形式: # 1.语句形式 # def foo(): # print('from foo') # foo() # # 2.表达式形式 # def foo(x,y): # res = x+y # return res # res = foo(1,2) # 3.可以当做参数传给另外一个函数 # def max2(x,y): # if x>y: # return x # else: # return y # res = max2(max2(1,2),3) # print(res) 4.2函数的返回值 1.返回值没有类型限制 2.返回值没有个数限制 注:返回多个值的结果就是返回一个元组,0个值返回为None return是函数结束的标准,可以有多个return但只执行一次 # def f1(): # print('111') # return 1 # print('222') # return 2 # print('333') # return 3 #def f1() #只执行 print('111') 4.3函数的参数 函数的参数分为形参和实参.形参即为变量名,实参为变量值,在函数调用时,把值绑定到变量名上,在函数调用结束后,解除绑定 形参与实参的具体分类(重点) 1.位置参数 1.1位置形参 在定义函数阶段按照从左到右的顺序定义的形参. 注:按位置定义的形参必须被传值,多一个不行,少一个也不行 # def foo(x,y) # print(x,y) # # foo(1,2) #正确 # foo(1,2,3) #错误 1.2位置实参 在调用函数阶段按照从左到右的顺序依次传入的值. 2.关键字参数 关键字实参:在调用函数阶段,按照key=value的形式指名道姓的为指定值传值 注:可以完全打乱顺序,仍可以为指定的形参传值 可以混合使用位置实参和关键字实参,但必须注意(1)位置实参必须放在关键字实参前面(2)不能对一个形参重复赋值 def foo(name,age): print(name,age) foo('zfj',18) foo(age=18,name='egon') # foo(name='zfj',18)#报错 # foo('zfj', age=18) 3.默认参数 指的是在定义阶段就已经为某个形参赋值了,该形参称之为有默认值的形参 注意:1.在定义阶段就已经被赋值,意味着在调用阶段就可以直接使用,默认参数 2.位置形参应该放到默认形参前面 3.默认参数的值,通常应该为不可变类型 def foo(x,y=2): print(x,y) foo(1)#1,2 foo(1,3)#1,3 4.可变长度参数 站在实参的角度,参数长度可变指的是在调用函数时,传入的实参的值个数不固定 4.1在形参中带“*”:会将调用函数时溢出的位置实参保存为元组的形式,然后赋值给*后的变量 def foo(x,y,*z): print(x,y,z) foo(1,2,3,4,5)#1 2 (3, 4, 5) 4.2在形参中带“**”:会将调用函数时溢出的关键字实参保存成字典的形式,然后赋值给**后的变量名 def foo(x,y,**z): print(x,y,z) foo(1,2,a=1,b=2)#1 2 {'a': 1, 'b': 2} 4.3在实参中带“*”:在传值前先被打散成位置实参,然后再进行赋值 def foo(x,y,*z): print(x,y,z) foo(1,*[2,3,4,5,6])#1 2 (3, 4, 5, 6) 4.4在实参中带“**”:在传值前先被打散成关键字实参,然后再进行赋值 def foo(x,y,z): print(x,y,z) foo(1,**{'y':2,'z':1})#1 2 1 5.命名关键字参数 放到*与**之间的参数称为命名关键字参数。函数的调用者可以传入任意不受限制的关键字参数 注意:命名关键字参数必须按照key = value的形式传值 补充: 在形参中带*与**的,*后的变量名应该为args,**后应该是kwargs # 当我们想要将传给一个函数的参数格式原封不动地转嫁给其内部的一个函数,应该使用下面这种格式 def bar(x,y,z): print(x,y,z) def wrapper(*args,**kwargs): bar(*args,**kwargs) wrapper(1,2,z=3) #虽然调用的是wrapper,但是要遵循的却是bar的参数标准 焚膏油以继晷,恒兀兀以穷年。

优秀的个人博客,低调大师

初学Python——Socket网络编程

认识socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。 建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据。 基本参数 Socket Families(地址簇) socket.AF_UNIX 本机进程间通信 socket.AF_INET IPV4(默认) socket.AF_INET6 IPV6 Socket Types(类型) socket.SOCK_STREAM 流式socket,代表TCP协议(默认) socket.SOCK_DGRAM 数据报式socket,代表UDP协议 socket方法 sk = socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 建立socket连接对象 sk.bind(address) s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。 sk.listen(backlog) 开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。 backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5 这个值不能无限大,因为要在内核中维护连接队列 sk.setblocking(bool) 是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。 sk.accept() 接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。 接收TCP 客户的连接(阻塞式)等待连接的到来 sk.connect(address) 连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 sk.connect_ex(address) 同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061 sk.close() 关闭套接字 sk.recv(bufsize[,flag]) 接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。 sk.recvfrom(bufsize[.flag]) 与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。 sk.send(string[,flag]) 将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。 sk.sendall(string[,flag]) 将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。 内部通过递归调用send,将所有内容发送出去。 服务端步骤: 步骤:1.server = socket.socket() 声明实例,生成连接对象2.server.bind() 绑定要监听的端口3.server.listen() 开始监听4.conn,addr = server.accept()等待客户端发起连接,阻塞5.接收数据(发送数据)6.当客户端断开连接后,继续监听等待下一个客户端建立连接……关闭连接对象 代码示例: import socket "服务器端" server = socket.socket() # 生成连接对象 server.bind(("localhost",6000)) # 绑定要监听的端口 server.listen(5) # 开始监听(最大允许挂起的连接) while True: print("\n服务器在等待...") conn,addr = server.accept() # 等待客户端发起建立连接,起到阻塞作用 # conn 是客户端链接过来而在服务器端为其生成的连接实例,addr是IP地址+端口 print("已成功连接") print("连接对象:{0},地址:{1}\n".format(conn,addr)) while True: try: data = conn.recv(1024) # 接收数据 # (如果客服端断开连接,此步骤将会被无限循环操作,所以一定要有检查机制) if data != b"000001": # 接收到的信号不是"000001"的话就正常执行 print("接收客户端信息:", data.decode()) msg = input(">>输入返回客户端的数据:") conn.send(msg.encode(encoding="utf-8")) # 向客户端发送数据 else: print("该客户已主动断开连接") break except ConnectionResetError as e: print("该客户机异常!已被强迫断开连接",e) break else: print("It's OK !") server.close() 客户端步骤: 步骤:1.client = socket.socket() 声明实例,生成连接对象2.client.connect() 与服务器建立连接3.与服务器交互(发送接收数据)4.client.close() 断开连接 代码示例: import socket "通信案例客户端消息接收与发送" client = socket.socket() # 声明socket类型,并生成socket连接对象 try: client.connect(("localhost",6000)) # 与服务器建立连接 while True: msg = input(">>输入要向服务器发送的信息:") client.send(msg.encode(encoding="utf-8")) # 向服务器发送信息(只能发送bytes字节类型,不能是str字符类型) data = client.recv(1024) # 接收来自服务器的1024个字节 print("接收来自服务器的数据:",data.decode()) # 打印服务器发送的数据 chioce = input("按任意键继续,按0退出客户端") if chioce == "0": client.send(b"000001") # 发送此信号表明客户端要断开连接 break client.close() except ConnectionRefusedError as e: print("服务器还没开机!请静候") 需要注意的是: 1.客户端再发送数据时,要主要服务器接收的大小限制。如果超过了这个限制,超出的部分暂时存在系统缓冲区,第二次接收的时候再输出剩下的部分。例如服务器端的recv(1024),而客户端一次发了2024字节,那么剩下的1000字节存在缓冲区,第二次接收的时候会接收缓冲区的内容,将不会接收新发来的数据,会造成数据错误。官方建议一次性不超过8192字节 2.双发收发数据只能是bytes类型 3.粘包问题,下面讲 socket粘包问题 什么是粘包呢?我们知道发送数据,并且数据量比较大时,并不会一次性发送,即使能一次发送,客户端也不一定能一次性接收,所以服务器有个缓冲区,等客户端下次再接收数据的时候再发送给客户端,所以,就需要将数据分成几次发送,客户端分成几次接收。那又出来问题了,客户端知道数据(文件)有多大么?它怎么知道要接收几次?当然是要服务器告诉他啦! 于是,我们设计服务器首先发送数据大小(数据),再开始分批发送数据,客户端先接收文件大小(数据),再开始分批接收。问题就有可能在这里出现了。如果连续2次send数据,很有可能将两次的数据黏在一起发送出去,在客户端也无法将其分开,怎么办呢? 我们可以让服务器每次发送数据后,接收来自客户端的确认,这样会强制清空缓冲区,就不会造成粘包。当然,基于上面讲的方法,只需要在发送正式数据之前接收确认就好。 最后,如果希望100%确认双发收发数据是否一致,可以采用MD5校验。 服务器端步骤: 1.读取文件名2.检测文件是否存在3.打开文件4.检测文件大小5.将文件大小发给客户端6.确认7.开始边读边发(循环发送)8.发送MD5 代码: import socket,os,hashlib ser = socket.socket() ser.bind(("localhost",5000)) ser.listen() while True: try: print("正在等待客户端连接...") conn,addr = ser.accept() print("已连接,new conn:",addr) while True: data = conn.recv(8192) filename = data.decode() print("寻找文件",filename) if os.path.isfile(filename): conn.send(b"01") conn.recv(1024) f = open(filename,"rb") m = hashlib.md5() file_size = os.stat(filename).st_size conn.send(str(file_size).encode(encoding="utf-8")) client_ack = conn.recv(1024) # 接收确认信息 if client_ack == b"1": print("开始发送数据") for line in f: m.update(line) conn.send(line) f.close() conn.send(m.hexdigest().encode(encoding="utf-8")) # 发送MD5值 else: conn.send(b"00") #表示文件不存在 print("该文件不存在!") except ConnectionResetError: print("该客户端已断开连接") ser.close() print("服务器已关闭") 客户端步骤: 1.发送接收文件请求,同时将文件名发送给服务器 2.接收文件长度 3.本地新建同名文件,循环接收数据,并将其写入文件 4.同时更新本地MD5值 5.接收数据完毕后,再接收服务器的MD5值,与本地MD5值进行比较 代码: import socket,hashlib def receive1(client): "真正的数据接收" while True: res = b"" res = res + client.recv(1024) return res def receive(client,filename): "接收处理" m = hashlib.md5() rece_res_size = int(client.recv(1024).decode()) # 接收的结果长度,转成int型 client.send(b"1") rece_size = 0 res = b"" filename = filename.decode() f = open(filename + ".new","wb") while rece_size < rece_res_size: if rece_res_size - rece_size >1024: # 如果不是最后一次接收数据 size = 1024 else: # 最后一次接收数据 size = rece_res_size - rece_size a = client.recv(size) # 循环接收数据 res = res + a rece_size = len(res) m.update(a) f.write(a) print("发送数据量:{0},接收数据量:{1}".format(rece_res_size,rece_size)) else: serves_md5 = client.recv(1024).decode() print("服务器MD5:",serves_md5) print("客户端MD5:",m.hexdigest()) if serves_md5 == m.hexdigest(): print("文件接收并校验完毕!") res.decode() f.close() def main(): client = socket.socket() try: client.connect(("localhost", 5000)) while True: filename = input("请输入需要的文件名").strip().encode(encoding="utf-8") if len(filename) == 0: print("输入为空,重新输入") continue client.send(filename) is_file = client.recv(1024) if is_file == b"01": client.send(b"OK") receive(client,filename) # 调用函数接收数据,返回结果res(bytes) else: print(" {0} 文件不存在!".format(filename.decode())) except ConnectionRefusedError: print("等待服务器开机") client.close() main() socketserver 什么是socketserver?为什么需要它呢? 我们在前面的文章中普通的socket并不能同时处理多个客户端,当一个客户端在与服务器连接时,其它客户端只能排队。而sockerserver则不同,它可以并发地处理多个客户端请求。 import socketserver ''' 每一个客户端请求过来,都会实例化 MyTCPHandler ''' class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): "跟客户端所有的交互都是在handle里完成的" while True: try: self.data = self.request.recv(1024).strip() print("{0} wrote:".format(self.client_address[0])) print(self.data) if not self.data: print("输入为空") self.request.send(bytes("输入为空", "utf-8")) else: self.request.send(self.data.upper()) except ConnectionResetError : print("客户已断开连接") break if __name__ == "__main__": HOST, PORT = "localhost", 9999 #server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) # 实例化一对一的连接对象 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) # 实例化多并发的连接对象(多线程) server.serve_forever() 客户端并没有什么区别: import socket HOST, PORT = "localhost", 9999 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST, PORT)) while True: data = input("输入字符") try: sock.sendall(bytes(data + "\n", "utf-8")) received = str(sock.recv(1024), "utf-8") finally: print("Sent: {0}".format(data)) print("Received: {0}".format(received)) sock.close()

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册