Python 有什么奇技淫巧?

企鹅博客 2019年8月12日00:19:09 评论 240
摘要

0.这个问题虽说是找寻“奇技淫巧”,但其实是想抛砖引玉1.如果想把自己认为或好玩或强大的python使用技巧拿出来跟大家分享,可否稍微详细的讲解一下

0.这个问题虽说是找寻“奇技淫巧”,但其实是想抛砖引玉

1.如果想把自己认为或好玩或强大的python使用技巧拿出来跟大家分享,可否稍微详细的讲解一下

回复内容:

从 Python 2.3 开始,sys 包有一个属性,叫 meta_path 。可以通过给 sys.meta_path 注册一个 finder 对象,改变 import 的行为。甚至可以实现这样的功能:通过 import 来导入一个 json 文件中的数据。

举个例子,有一个 tester.json 文件,里面的内容是:

{ "hello": "world", "this": { "can": { "be": "nested" } } }

更新一个最近发现的技巧,一行代码实现多线程/多进程,来源于python开发者微信公众号。

首先来看下代码:

import urllib2

from multiprocessing.dummy import Pool as ThreadPool

urls = [

'http://www.python.org',

'http://www.python.org/about/',

'http://www.onlamp.com/pub/a/python/2003

]

pool = ThreadPool(4)

results = pool.map(urllib2.urlopen, urls)

pool.close()

pool.join()

对,你没有看错,只要一行代码就可以把普通的任务变成并行任务。不用手动管理线程,一切都由map自动完成。这里演示的是多线程,如果要多进程的话只需把 from multiprocessing.dummy 改成 from multiprocessing ,就是这么任性!

以下为这个库的详细介绍:

在 Python 中有个两个库包含了 map 函数: multiprocessing 和它鲜为人知的子库 multiprocessing.dummy.

这里多扯两句: multiprocessing.dummy? mltiprocessing 库的线程版克隆?这是虾米?即便在 multiprocessing 库的官方文档里关于这一子库也只有一句相关描述。而这句描述译成人话基本就是说:”嘛,有这么个东西,你知道就成.”相信我,这个库被严重低估了!

dummy 是 multiprocessing 模块的完整克隆,唯一的不同在于 multiprocessing 作用于进程,而 dummy 模块作用于线程(因此也包括了 Python 所有常见的多线程限制)。

所以替换使用这两个库异常容易。你可以针对 IO 密集型任务和 CPU 密集型任务来选择不同的库。

原文链接 : http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652563685&idx=2&sn=f563f8913630a4334219ed4a9fa99653&scene=0#wechat_redirect

———————以下为原答案———————————

搜了一下,发现没人说这个。

废话不说,直接上图:



在python中,下滑杠代表上一次运行的结果。不要问我为什么,我也不知道。

这个奇技淫巧是我在查scapy的资料的时候意外发现的,网上关于这个技巧的资料似乎也很少,嗯。(顺便提一下,scapy是个非常强大的库,几乎涵盖了所有网络相关的功能,推荐学习。)

再来说一个吧,关于动态修改代码的。直接上代码:

# socket.py # import sys del sys.modules['socket'] # 从内存中删除当前的socket包 import sys import time import logging import types path = sys.path[0] sys.path.pop(0) import socket # 导入真正的socket包 sys.path.insert(0, path) # 动态path类方法 def re_class_method(_class, method_name, re_method): method = getattr(_class, method_name) info = sys.version_info if info[0] >= 3: # py2和py3的语法略有不同,需要做下判断。 setattr(_class, method_name, types.MethodType(lambda *args, **kwds: re_method(method, *args, **kwds), _class)) else: setattr(_class, method_name, types.MethodType(lambda *args, **kwds: re_method(method, *args, **kwds), None, _class)) # 动态path实例方法 def re_self_method(self, method_name, re_method): method = getattr(self, method_name) setattr(self, method_name, types.MethodType(lambda *args, **kwds: re_method(method, *args, **kwds), self, self)) # 需要修改的类方法 def re_accept(old_method, self, *args, **kwds): return_value = old_method(self, *args, **kwds) #do something return return_value # 需要修改的实例方法 def re_recvfrom(old_method, self, *args, **kwds): return_value = old_method(*args, **kwds) # do something return return_value # 需要修改的类方法(无返回值) def re_bind(old_method, self, *args, **kwds): re_self_method(self, 'recvfrom', re_recvfrom) #把self实例的recvfrom方法替换成re_recvfrom #do something old_method(self, *args, **kwds) setattr(socket.socket, '_list_client_ip', {}) # 绑定类属性(socket不能动态绑定实例属性,只好绑定类属性了) re_class_method(socket.socket, 'bind', re_bind) #把socket类的bind方法替换成re_bind re_class_method(socket.socket, 'accept', re_accept) #把socket类的accept方法替换成re_accept

也有一个 Python 的奇技淫巧分享给大家,让 Python 的 2+2=5:

In [1]: import ctypes In [2]: ctypes.memmove(id(4), id(5), 24) Out[2]: 15679760 In [3]: 2 + 2 Out[3]: 5

刚好看到个




来自于
来自于 python高级编程
作者是 @董伟明 说明在分享一个准备给公司讲python高级编程的slide
这里还有对应的视频讲解

====================================================================

另外一个感觉就是这个库了ajalt/fuckitpy · GitHub
中间的实现挺厉害的,访问源码逐行加入
try: finally Python没有什么奇技淫巧吧。。。Hidden features of Python
这个链接上有很多小例子

比如for else值得说下。不break的话就执行else

for i in range(10): if i == 10: break print(i) else: print('10不在里面!')

其实 PYC 文件很简单:

>>> import dis, marshal >>> with open('hello.pyc', 'rb') as f: ... f.seek(8) ... dis.dis(marshal.load(f))

昨天刚在 StackOverflow 看到的,break 多层循环:python - Breaking out of nested loops

for x in xrange(10): for y in xrange(10): print x*y if x*y > 50: break else: continue # executed if the loop ended normally (no break) break # executed if 'continue' was skipped (break)

可配置单例,从tornado学来的



Stack Overflow上有一个多人编辑整理的答案,非常全而且经常更新:

Hidden features of Python

收藏这个页面,顺便给我的回答点个赞同啊。 1. 元类(metaclass)

PyPy的源码里有个pair和extendabletype

""" Two magic tricks for classes: class X: __metaclass__ = extendabletype ... # in some other file... class __extend__(X): ... # and here you can add new methods and class attributes to X Mostly useful together with the second trick, which lets you build methods whose 'self' is a pair of objects instead of just one: class __extend__(pairtype(X, Y)): attribute = 42 def method((x, y), other, arguments): ... pair(x, y).attribute pair(x, y).method(other, arguments) This finds methods and class attributes based on the actual class of both objects that go into the pair(), with the usual rules of method/attribute overriding in (pairs of) subclasses. For more information, see test_pairtype. """ class extendabletype(type): """A type with a syntax trick: 'class __extend__(t)' actually extends the definition of 't' instead of creating a new subclass.""" def __new__(cls, name, bases, dict): if name == '__extend__': for cls in bases: for key, value in dict.items(): if key == '__module__': continue # XXX do we need to provide something more for pickling? setattr(cls, key, value) return None else: return super(extendabletype, cls).__new__(cls, name, bases, dict) def pair(a, b): """Return a pair object.""" tp = pairtype(a.__class__, b.__class__) return tp((a, b)) # tp is a subclass of tuple pairtypecache = {} def pairtype(cls1, cls2): """type(pair(a,b)) is pairtype(a.__class__, b.__class__).""" try: pair = pairtypecache[cls1, cls2] except KeyError: name = 'pairtype(%s, %s)' % (cls1.__name__, cls2.__name__) bases1 = [pairtype(base1, cls2) for base1 in cls1.__bases__] bases2 = [pairtype(cls1, base2) for base2 in cls2.__bases__] bases = tuple(bases1 + bases2) or (tuple,) # 'tuple': ultimate base pair = pairtypecache[cls1, cls2] = extendabletype(name, bases, {}) return pair

  • 微信
  • 分享
  • 相关标签:python
  • 本文原创发布php教程 ,转载请注明出处,感谢您的尊重!
    • 上一篇:Python已经式微了吗?为什么学计算机的小伙伴说现在Java和C++才是王道?
    • 下一篇:为什么这个网页的源代码用python爬下来后用beautifulsoup解析后会出现字符丢失?

    相关文章

    相关视频

    • 在Django框架中运行Python应用全攻略
    • 在Python的Django框架中创建和使用模版
    • python获取元素在数组中索引号的方法
    • 浅谈python中截取字符函数strip,lstr...
    • Python 有什么奇技淫巧?
    • Python 简介
    • Python 环境搭建
    • Python 中文编码
    • Python 基础语法
    • Python 变量类型

    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论

  • 立即提交

    专题推荐

    • 独孤九贱-php全栈开发教程

      全栈 100W+

      主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

    • 玉女心经-web前端开发教程

      入门 50W+

      主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

    • 天龙八部-实战开发教程

      实战 80W+

      主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

    作者信息

    php教程

    认证0级讲师

    最近文章

    发布技术文章

    • 最新文章
    • 热门排行

    • python之禅怎么打出来
    • python怎么学
    • boosting和bootstrap区别
    • python库是什么意思
    • python卸载后怎么也安装不上
    • python安装后怎么不见了
    • python怎么卸载模块
    • python能做什么?是什么?

    • pickle库的使用详解
    • Anaconda的新手使用大全
    • python爬虫是什么?为什么把python叫做爬虫?
    • Python微信库:itchat的用法详解
    • 关于python3学习基础知识总结
    • python爬虫是什么
    • 使用Python可以做什么
    • python如何实现可视化热力图

    推荐视频教程

  • javascript初级视频教程
  • jquery 基础视频教程
  • 视频教程分类

    • php视频教程
    • html视频教程
    • css视频教程
    • JS视频教程
    • jQuery视频教程
    • mysql视频教程
    • Linux视频教程
    • Python视频教程
    • 网站首页
    • PHP视频
    • PHP实战

    PHP中文网:独家原创,永久免费的在线php视频教程,php技术学习阵地!

    Copyright 2014-2019 http://www.php.cn/ All Rights Reserved | 皖B2-20150071-9 皖公网安备 34010402701654号 免责申明赞助与捐赠

    weinxin
    欢迎加入中国SEO站长博客之家
    本站的所有资源都会上传分享到博客之家,希望大家互相学习交流进步。
    企鹅博客

    发表评论

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: