设为首页 收藏本站
查看: 1455|回复: 0

[经验分享] python——socket模块与列表映射

[复制链接]

尚未签到

发表于 2015-4-25 07:47:14 | 显示全部楼层 |阅读模式
从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']

>>> ["%s=%s" % (k, params[k]) for k in params.keys() if k.startswith('s')]
['server=mpilgrim']

1     
简单的列表映射举例。映射表达式刚好是元素自身,所以这个列表映射返回列表的原封不动的拷贝。它等于 params.keys().
2     
效难一点的映射。重复遍历 params.keys(),变量 k 按顺序赋与每个元素,映射表达式接收元素然后在字典 params 中查找相应的值。它等于 params.values()。
3     
用一些简单的字符串格式化将前面两个例子合并起来 ,我们就得到一个键-值对列表。这个看上去有点象程序的输出,剩下的就只是将这个列表中的元素接起来形成一个字符串了。               
  

  因此,对某种构造特殊的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_')]。

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60379-1-1.html 上篇帖子: 用python绘制漂亮的图形 下篇帖子: Python中使用pickle持久化对象
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表