python——socket模块与列表映射
从socket模块学习中的一段奇怪代码说起
前言:在学习python标准库中的Socket模块中,发现了一段奇怪的代码。
import socket def get_constants(prefix): dicts=dict((getattr(socket,n),n)
for n in dir(socket)
if n.startswith('IPPROTO_')) print (dicts)
疑问:上述代码中的for..in..循环语句和if 语句都没有冒号结束。为什么?
答案:因为上述“异常”语句产生了一个形如(value,name)的映射列表。
首先我注意到for和if语句都在同一个括号内,也就说for和if语句都不是完整的语句块,而是某个对象/参数的一部分。
该语句完整的样子如下:
dicts=dict((getattr(socket,n),n) for n in dir(socket) if n.startswith('IPPROTO_'))
因此,需要查询如何用dict()构造字典对象。
help(dict)
| dict() -> new empty dictionary
| dict(mapping) -> new dictionary initialized from a mapping object's
| (key, value) pairs
| dict(iterable) -> new dictionary initialized as if via:
| d = {}
| for k, v in iterable:
| d[k] = v
| dict(**kwargs) -> new dictionary initialized with the name=value pairs
| in the keyword argument list. For example: dict(one=1, two=2)
并不是第一种情况(无参数)和第四种情况(name=value pairs)。
第二种情况 :什么是mapping呢?
dict(mapping)构造python字典构造函数,怎么传入这个mapping参数呢?Python下的mapping到底是什么呢?
目前已知有三种方法传入mapping。
一 、方法一,通过使用map函数
def fmap(a, b):
return (a, b)
lik = range(1, 11)
liv = list("abcdefghij")
print map(fmap, lik, liv)
运行结果如下
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g'), (8, 'h'), (9, 'i'), (10, 'j')]
map函数的作用是:每次从可迭代对象(这里是列表lik和liv)取出一个元素值,经过fmap自定义函数的处理后作为新的(返回)列表的元素,故这个map函数的操作方式很像列表解析的概念。
理解了map函数后,便可将返回值作为dict的传入参数了,从而得到一个字典。
def fmap(a, b):
return (a, b)
lik = range(1, 11)
liv = list("abcdefghij")
lim = map(fmap, lik, liv)
d = dict(lim)
print d
执行结果如下所示:
{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j'}
二、方法二 :通过zip函数
k=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
v=[11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
m=zip(k,v)
dict(m)={'a': 11, 'c': 13, 'b': 12, 'e': 15, 'd': 14, 'g': 17, 'f': 16, 'i': 19, 'h': 18, 'j': 20}
三、方法三 :通过使用列表映射
列表映射是通过对列表的每个元素应用一个函数来转换数据。
什么是列表映射?
列表映射介绍
>>> li = [1, 9, 8, 4] >>> [elem*2 for elem in li] [2, 18, 16, 8] >>> li [1, 9, 8, 4] 为了对这一点有一个感性认识,从右向左看它。 li 是一个将要映射的列表。Python循环遍历 li 一次一个元素,临时将每个元素的值赋给变量 elem。 然后Python使用函数 elem*2 ,接着将结果追加到返回列表中。 注意列表映射不改变被映射的列表
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> params.keys()
['server', 'uid', 'database', 'pwd']
>>> [k for k in params.keys()] 1
['server', 'uid', 'database', 'pwd']
>>> [params[k] for k in params.keys()] 2
['mpilgrim', 'sa', 'master', 'secret']
>>> ["%s=%s" % (k, params[k]) for k in params.keys()] 3
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
|
|
因此,对某种构造特殊的list可以调用dict(list)把list对象转换为dict对象。
也许,这种特殊构造的list就是mapping。
因此上述代码:
dicts=dict((getattr(socket,n),n) for n in dir(socket) if n.startswith('IPPROTO_'))
中的(getattr(socket,n),n) for n in dir(socket) if n.startswith('IPPROTO_')部分其实是产生一个list的代码。
即[(getattr(socket,n),n) for n in dir(socket) if n.startswith('IPPROTO_')]。
python——socket模块与列表映射的更多相关文章
- Python接口测试-模块引用与映射
PyCharm中发现模块引用老是有各种问题 可以用映射来解决,例如需要调用登录模块里面的东西的时,可以这样处理: 登录模块:1-login.py import this import requests ...
- python - socket模块1
1.使用生活中的接打电话,解释socket通信流程 2.根据上图,写出socket通信的伪代码 2.1.server端伪代码 #买手机 #买手机卡 #开机 #等待电话 #收消息 #发消息 #挂电 ...
- python --- socket模块详解
socket常用功能函数: socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) ...
- 用python socket模块实现简单的文件下载
server端: # ftp server端 import socket, os, time server = socket.socket() server.bind(("localhost ...
- 项目: 基于Python socket模块实现的简单 ftp 项目:
需要 自己创建一个 info 文件 用来存储用户信息 服务器: import socket import pickle import struct import os import time ''.s ...
- Python socket 基础(Server) - Foundations of Python Socket
Python socket 基础 Server - Foundations of Python Socket 通过 python socket 模块建立一个提供 TCP 链接服务的 server 可分 ...
- python基础===socket模块的讲解(转)
一.网络知识的一些介绍 socket 是网络连接端点.例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web ...
- Python中的socket 模块
Python 提供了两个基本的 socket 模块.第一个是 Socket,它提供了标准的 BSD Sockets API.第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务 ...
- Python网络编程(2)——socket模块(2)
目录: 1. 异常 2. 地址族 3. 套接字类型 4. 模块方法 5. Socket对象与实例方法 socket模块提供了Python中的低层网络连接接口,用于操作套接字操作. 异常 socket模 ...
随机推荐
- k8s的Health Check(健康检查)
强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...
- APP中常见上下循环滚动通知的简单实现,点击可进入详情
APP中常见上下循环滚动通知的简单实现,点击可进入详情 关注finddreams博客,一起分享一起进步!http://blog.csdn.net/finddreams/article/details/ ...
- 理解和上手Redux
顾名思义本文分两个部分,理解和上手,第一部分我先讲个故事,这个故事也许不是特别形象,但对大家理解Redux一定有所帮助.第二部分我举个例子. 先讲个故事: 一个餐厅(应用),我是顾客(用户),这个餐厅 ...
- 如何在windows平台下使用hsdis与jitwatch查看JIT后的汇编码
1. 安装hsids 这一步比较麻烦,需要提前安装cygwin,以及下载openjdk的源码 具体步骤请参考下面的两篇文章 How to build hsdis-amd64.dll and hsdis ...
- 洛谷——P1009 阶乘之和
P1009 阶乘之和 题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一 ...
- 设计模式-设计原则(Design Principle)
本文由@呆代待殆原创,转载请注明出处. 写在前面:所谓设计原则并不是一定要遵守的法则,只是一种建议,因为保持这些原则本身会有一定代价,若是这些代价超过了带来的好处就得不偿失了,所以一切还是以简单为准. ...
- 3Sum Smaller -- LeetCode
Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ...
- 【后缀数组】【二分答案】【差分】poj1743 Musical Theme
差分消除加减一个值得影响,貌似r二分上界要设成(n-2)/2?为啥? sa求不可重叠最长重复子串 给定一个字符串,求最长重复子串,这两个子串不能重叠.算法分析:这题比上一题稍复杂一点.先二分答案,把题 ...
- 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树
让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...
- 【R笔记】R语言中的字符串处理函数
内容概览 尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串同样极为重要.从医疗研究数据里的出生日期到文本挖掘的应用,字符串数据在R程序中使用的频率非常高.R语言提供了很多字符串操作函数,本文仅简 ...