作用域

Python的作用域是函数,没有块级作用域

if 1 == 1:
name = 'wang' print(name)
#wang
 
for i in range(10):
name = i print(name)
#9
 
def func():
name = 'wang' func()
print(name)
#NameError: name 'name' is not defined
 
name = 'wang'

def f1():
name = 'snow'
print(name) f1()
#snow
作用域链
name = 'wang'
def f1():
name = 'a'
def f2():
name = 'b'
print(name)
f2()
f1()
#b
 
name = 'wang'
def f1():
print(name) def f2():
name = 'snow'
f1() f2()
#wang
在函数未执行之前,作用域已经确定
name = 'wang'
def f1():
print(name) def f2():
name = 'snow'
return f1 ret = f2()
ret()
#wang
 
li = [x+100 for x in range(10) if x > 5]
print(li)
#[106, 107, 108, 109]
 
def f1():
return 1
#相当于
li = [lambda :1]

面试题

li = [lambda :x for x in range(10)]
#li为列表
#li列表中的元素:【函数,函数,函数...】
#函数在没有执行前,内部代码不执行
#列表的第一个元素li[0]是函数
#函数()执行
#li[0]()返回值为9
ret = li[0]()
print(ret)
#9
 
li = []

for i in range(10):
def f1():
return i li.append(f1) ret1 = li[0]()
ret2 = li[1]()
ret3 = li[2]()
ret4 = li[3]()
ret5 = li[4]()
ret6 = li[5]()
ret7 = li[6]()
print(ret1)
print(ret2)
print(ret3)
print(ret4)
print(ret5)
print(ret6)
print(ret7)
#9
#9
#9
#9
#9
#9
#9
只要执行了,就能拿到值
li = []

for i in range(10):
def f1(x = i):
return x
li.append(f1) print(li[0]())
print(li[1]())
print(li[2]())
print(li[3]())
#0
#1
#2
#3

Python3.x中类默认继承object,Python2.7中类不默认继承object;Python2.7中不继承object的类叫经典类,继承的时候一条道走到黑,继承object的类叫新式类,继承的时候与Python3一致。

IO多路复用实现并发

概述:select、poll、epoll

目的:监听socket对象的内部是否变化?

什么时候变化?连接或收发消息的时候。

sk:服务器端接收客户端的连接,并创建conn对象

conn:要收”发”消息了

简单的IO多路复用

server.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9990,))
sk.listen(5) while True:
rlist, w, e = select.select([sk,], [], [], 1)
print(rlist)
#rlist中获取的就是socket对象列表,[sk,]
for r in rlist:
print(r)
conn, addr = r.accept()
conn.sendall(bytes('hello', encoding='utf-8'))
client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket sk = socket.socket()
sk.connect(('127.0.0.1', 9990,))
data = sk.recv(1024)
print(data)
while True:
input('>>>')
sk.close()

IO多路复用实现伪并发

server.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9999,))
sk.listen(5)
inputs = [sk,]
while True:
rlist, w, e = select.select(inputs, [], [], 1)
#len(inputs):监听了几个对象,len(rlist):几个对象发生了变化
print(len(inputs), len(rlist))
#rlist中获取的就是socket对象列表,[sk,]
#rlist = [sk,]
#rlist = [xiaoming,]
#rlist = [xiaozhu, xiaogou,]
for r in rlist:
if r == 'sk':
#新客户端来连接
conn, addr = r.accept()
# conn是socket对象
inputs.append(conn)
conn.sendall(bytes('hello', encoding='utf-8'))
else:
#有人(r)给我发消息了
r.recv(1024)

client.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng 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'))
sk.close()

简单的读写分离

server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9999,))
sk.listen(5)
inputs = [sk,]
outputs = []
while True:
rlist, wlist, e = select.select(inputs, outputs, [], 1)
#len(inputs):监听了几个对象,len(rlist):几个对象发生了变化
print(len(inputs), len(rlist), len(outputs))
#rlist中获取的就是socket对象列表,[sk,]
#rlist = [sk,]
#rlist = [xiaoming,]
#rlist = [xiaozhu, xiaogou,]
for r in rlist:
if r == 'sk':
#新客户端来连接
conn, addr = r.accept()
# conn是socket对象
inputs.append(conn)
conn.sendall(bytes('hello', encoding='utf-8'))
else:
#有人(r)给我发消息了
print('==========')
try:
ret = r.recv(1024)
#r.sendall(ret)
if not ret:
raise Exception('断开连接')
else:
outputs.append(r)
except Exception as e:
inputs.remove(r)
for w in wlist:
#所有给我发过消息的人
w.sendall(bytes('respones', encoding='utf-8'))
outputs.remove(w)

client.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng 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')) sk.close()

IO多路复用增强版

server.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9999,))
sk.listen(5)
inputs = [sk,]
outputs = []
messages = {}
"""
messages = {
xiaoming:[消息1, 消息2]
xiaozhu:[消息1, 消息2]
}
"""
while True:
rlist, wlist, errorlist = select.select(inputs, outputs, [], 1)
#len(inputs):监听了几个对象,len(rlist):几个对象发生了变化
print(len(inputs), len(rlist), len(outputs))
#rlist中获取的就是socket对象列表,[sk,]
#rlist = [sk,]
#rlist = [xiaoming,]
#rlist = [xiaozhu, xiaogou,]
for r in rlist:
if r == 'sk':
#新客户端来连接
conn, addr = r.accept()
# conn是socket对象
inputs.append(conn)
messages[conn] = []
conn.sendall(bytes('hello', encoding='utf-8'))
else:
#有人(r)给我发消息了
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('respones', encoding='utf-8')
w.sendall(resp)
outputs.remove(w)
client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng 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')) sk.close()
select:支持跨平台,底层通过for循环实现,效率不高,监听有个数(1024)限制。
poll:linux使用,内部for循环实现,效率不高,监听个数没有限制。
epoll:内部不在通过for循环,socket对象谁变化谁通知,nginx通过epoll实现,效率高。
IO多路复用不仅仅支持socket对象,只要是IO操作都支持。

Day10 网络编程(续)的更多相关文章

  1. 网络编程Socket之TCP之close/shutdown具体解释(续)

    接着上一篇网络编程Socket之TCP之close/shutdown具体解释 如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道writ ...

  2. UNIX网络编程——原始套接字的魔力【续】

    如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...

  3. Day10 Python网络编程 Socket编程

    一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...

  4. [转]C#网络编程(异步传输字符串) - Part.3

    本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part3.aspx 这篇文章我们将前进一大步,使用异步的方式 ...

  5. C/C++ 用libcurl库进行http通讯网络编程

    C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...

  6. TCP/IP的经典网络编程

                                                                             TCP/IP网络编程之四书五经             ...

  7. 第十三章:Python の 网络编程进阶(二)

    本課主題 SQLAlchemy - Core SQLAlchemy - ORM Paramiko 介紹和操作 上下文操作应用 初探堡垒机 SQLAlchemy - Core 连接 URL 通过 cre ...

  8. python学习之路网络编程篇(第二篇)

    新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = ...

  9. 基于Socket网络编程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...

随机推荐

  1. Cookie 和Session

    会话:  简单理解: 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话要解决的问题: 每个用户与服务器进行交互的过程中,各自会有一些数据,程序 ...

  2. linux常用命令大全(转)

    由于记忆力有限,把平时常用的Linux命令整理出来,以便随时查阅: linux 基本命令 ls     (list 显示当前目录下文件和目录 ls -l 详细显示 =ll ) [root@linux ...

  3. jersey 过滤器

    这里使用的Jersey 是 1.1 版本 1.  web.xml 配置 <?xml version="1.0" encoding="UTF-8"?> ...

  4. Apache让一台虚拟主机接受多域名解析(转)

    之前写了一篇文章关于linux下apache虚拟主机配置,配置那是相当简单: <VirtualHost *:80> ServerAdmin admin@example.com Docume ...

  5. Qt 学习之路 :使用 QJson 处理 JSON

    XML 曾经是各种应用的配置和传输的首选方式.但是现在 XML 遇到了一个强劲的对手:JSON.我们可以在 这里 看到有关 JSON 的语法.总体来说,JSON 的数据比 XML 更紧凑,在传输效率上 ...

  6. Java语言基础(六)

    Java语言基础(六) 前一章提到的, BigDecimal, DecimalFormat等具体用法,这里就不在说了,网上有许多 一.下面让我们看一个例子(自由落体运动位移) 说明: (1).公式是 ...

  7. linux 管道--转

    linux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. ...

  8. Restart-ServiceEx.psm1

    详细描述 利用WMI的Win32_Service类重启指定计算机上的服务. Restart-ServiceEx cmdlet 通过WMI的Win32_Service类向指定计算机(ComputerNa ...

  9. linux下vi命令笔记

    vim 编辑器 全屏编辑器 模式化编辑器 vi:Visual Interfacevim:VI iMproved vi增强版vi模式:    编辑模式(命令模式)(默认处于编辑模式)        Ct ...

  10. ZOJ 3905 Cake(贪心+dp)

    动态规划题:dp[i][j]表示有i个Cake,给了Alice j个,先按照b排序,这样的话,能保证每次都能成功给Alice Cake,因为b从大到小排序,所以Alice选了j个之后,Bob最少选了j ...