作用域

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. 三分钟读懂Oracle数据库容灾架之DataGuard

    Oracle数据库目前依然处于商用数据库的霸主地位. 运行在Oracle数据库上的核心业务及核心数据的安全性尤为重要. 目前市场上针对Oracle数据库常见的容灾产品大致可以分为两大类. Oracle ...

  2. CAS学习笔记(三)—— SERVER登录后用户信息的返回

    一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户信息吧,不然客户端是怎么知道登录的是哪个用户.那么客户端要怎么获取用户信息呢? 其实验证成 ...

  3. IE浏览器中发送到onenote的选项没有调出来??

    最近使用onenote 作为笔记本,发现这个比word好用很多,特别是还有一个功能很好用,发送到onenote,可以选中网页中的内容,发送到onenote.但是有一些IE浏览器这个选项没有调出来,还是 ...

  4. hdu 2546 饭卡(DP)

    很久以前做过这道题,晚上睡不着,看见nyist加了一个DP的比赛,就进来打个酱油. 这道题的点睛之笔是将最大值记录下来,然后将其值改为0.之后就是普通的背包了. #include<stdio.h ...

  5. AE二次开发中,过滤后的图层,实现缩放至图层效果

    //featureClass是自己获取的featureClass,也可是sde中获取的. public void FilterAndZoomToLayer(IFeatureClass featureC ...

  6. phpmailer邮件类下载(转)

    PHPMailer是一个用于发送电子邮件的PHP函数包.它提供的功能包括:*.在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址*.支持多种邮件编码包括:8bit,base64,binary和qu ...

  7. ExtJs4学习(四):Extjs 中id与itemId的差别

       为了方便表示或是指定一个组件的名称,我们一般会使用id或者itemId进行标识命名. (推荐尽量使用itemId.这样能够降低页面唯一标识而产生的冲突) id:   id是作为整个页面的Comp ...

  8. 再回首,Java温故知新(十一):Java反射

    最近继续回顾Java基础,进行到了Java反射这一部分,个人感觉这部分应该算是Java的高级特性了,在日常开发中使用的并不多,应用人员主要是工具构建人员,所以这次学习中以了解为主,Java反射主要应用 ...

  9. SDL 实现透明悬浮窗

    最近一直想用SDL实现弹幕功能,但是一直没法实现悬浮窗和透明背景功能. 在一个老外的博客上发现了思路:EthioProgrammer: Applying transparency using win3 ...

  10. Java多线程之释放对象的锁

          由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁: 1. 执行完同步代码块. 2. 在执行 ...