作用域

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. poj 3620 Avoid The Lakes【简单dfs】

    Avoid The Lakes Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6795   Accepted: 3622 D ...

  2. c\c++复习基础要点16----枚举类型

    枚举类型: 语法格式: enum 枚举类型名 {变量值列表}; 例如: enum  Weekday{sun, mon, tue, wed, thu, fri, set}; 声明了枚举类型后,就可以定义 ...

  3. Java+protobuf 实例

    之前开发都是JSON格式, 据说用这种格式的 安全, 输入输出全是二进制文件,且 数据占用内存小. 主要永远移动端数据传送.以下是代码: controller: 请求的是实体: package cn. ...

  4. iOS UIKit:viewController之Segues (4)

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  5. Oracle中wm_concat()的使用方法

    以下两种方式使用wm_concat()的使用方法是等效的. 方法一:使用窗口函数,wm_concat支持窗口函数 select distinct classKey,className, classOr ...

  6. win7、xp下Meclipse SVN用户名修改

    Meclipse SVN用户名修改,在网上查找后发现如下方法: 1.查看你的Eclipse中使用的是什么SVNInterface windows>preference>Team>SV ...

  7. CentOS安装最新的Mysql版本

    Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysql及其依赖命令: # yum -y remove ...

  8. JS 模拟C# 字符串格式化操作

    /*** ** 功能: 字符串格式化替换操作 ***/ String.prototype.format = function () { var args = arguments; return thi ...

  9. Unity3D GUI之自定义风格组件

    GUI中可以使用一些默认的组件,里面的最后一个参数一般情况下,不设置就是默认的 ,当然也可以进行手动的指定,比如: GUI.Button(new Rect(0,0,100,100),"开始游 ...

  10. Canvas模糊化处理图片、毛玻璃处理图片之stackblur.js

    Canvas实现毛玻璃效果解决方式1:使用stackblur.js 在Android系统中实现图片的毛玻璃效果比较好用的类库是:Android StackBlur 官方Git地址:https://gi ...