容易混淆的知识点 、多路复用
一、容易混淆的知识点
1.Pythoy中无块级作用域
#Pythoy中无块级作用域 if 1==1: name='alex' for i in range(10): name =i print (name) #执行结果: 9
2、Python中以函数为作用域
#Python中以函数为作用域 #作用域 def f1(): name='a' def f2(): name ='b' print(name) f2() f1() #以下为执行结果: b
3、python 的作用域在执行之前已经确定
name = "alex" def f1(): print (name) #python 的作用域在执行之前已经确定 def f2(): name='eric' f1() f2() #执行结果为: alex name = "alex" def f1(): print(name) def f2(): name = "eric" return f1 ret=f2() ret() #执行结果为: alex
4、新浪面试题
li =[lambda :x for x in range(10)] print (li) #li列表中的元素:[函数,函数,函数...] #li#函数在诶有执行之前,内部代码不执行 r = li[0]() print (r) #执行结果 9
二、多路复用
1.server
#server import socket import select sk = socket.socket() sk.bind(('127.0.0.1', 9999,)) sk.listen(5) inputs = [sk,] outputs = [] messages ={} while True: rlist,wlist,e, = select.select(inputs, outputs,[],1) print(len(inputs),len(rlist),len(wlist), len(outputs)) # 监听sk(服务器端)对象,如果sk对象发生变化,表示有客户端来连接了,此时rlist值为【sk】 # 监听conn对象,如果conn发生变化,表示客户端有新消息发送过来了,此时rlist的之为 【客户端】 # rlist = 【吴文煜,】 # rlist = 【张磊,白宇,】 # rlist = [sk,] for r in rlist: if r == sk: # 新客户来连接 conn, address = r.accept() # conn是什么?其实socket对象 inputs.append(conn) messages[conn]=[] conn.sendall(bytes('hello', encoding='utf-8')) else: # 有人给我发消息了 print('=======') try: ret = r.recv(1024) # r.sendall(ret) if not ret: raise Exception('断开连接') else: outputs.append(r) messages[r].append(ret) except Exception as e: inputs.remove(r) del messages[r] # 所有给我发过消息的人 for w in wlist: msg=messages[w].pop() resp=msg +bytes('response', encoding='utf-8') w.sendall(resp) outputs.remove(w)
2.client
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket sk = socket.socket() sk.connect(("127.0.0.1", 9999,)) data = sk.recv(1024) print(data) while True: inp = input(">>>") sk.sendall(bytes(inp,encoding='utf-8')) print(sk.recv(1024)) sk.close()

浙公网安备 33010602011771号