作用域

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. 天津Uber优步司机奖励政策(1月18日~1月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. poj 1321 棋盘问题【dfs】

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28308   Accepted: 13996 Descriptio ...

  3. 417. Pacific Atlantic Water Flow

    正常做的,用了645MS..感觉DFS的时候剪枝有问题.. 为了剪枝可能需要标记一个点的4种情况: 1:滨临大西洋,所有太平洋来的点可以通过: 2:濒临太平洋,所有大西洋来的点可以通过: 3:都不濒临 ...

  4. google、baidu高级搜索技巧

    1.baidu(可以去高级搜索查看更多信息) intitle搜索范围限定在网页标题:intitle:和后面的关键词之间不要有空格----intitle:中国 site搜索范围限定在特定站点中:“sit ...

  5. BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治

    这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将me ...

  6. localstorage 初谈

    废话 : localStorage作为本地存储,比cookie大,可以看做一个小的服务器,几个api也可以看做增,删,查,找..... 设置 window.localStorage.setItem() ...

  7. python的私有变量解析

    在内的内部定义并使用,外部无法訪问,以双下划线作为前作,定义后被python转为 _classname__变量名了 ------------------------------------------ ...

  8. Delphi ListView基本用法大全

    //增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ...

  9. Android 颜色渲染(三) Shader颜色渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 相信看过在上一篇中提到的三篇文章后,大家已经对颜色处理方面有更深的体会. 之前讲到颜色渐变的效果, 具体怎么做呢,这就需要应用颜色渲染. 首先要介 ...

  10. 开源 免费 java CMS - FreeCMS2.1 会员站内信

    项目地址:http://www.freeteam.cn/ 站内信 1.1.1 写信 从左側管理菜单点击写信进入. 输入收信人.标题.内容后点击发送button. 1.1.2 收件箱 从左側管理菜单点击 ...