常用 lambda 小工具

背景说明

到现在也写了很多 Python 代码了,随着项目越来越大,代码量越来越多,自己也积累了很多顺手的小工具,正好写一个文档把这些小工具都积累下来分享给其他人吧。注意,这篇文档中的所有代码都基于 Python3

首先是一系列 lambda 工具,一句话的功夫可以省不少事

import re
import inspect
import json
import netaddr
import ipaddress
import time
import uuid
import shlex

get_current_function_name = lambda: inspect.stack()[1][3]
pprint = lambda x: json.dumps(x, indent=4, sort_keys=True, default=str, ensure_ascii=False)
print_title = lambda x, width=80, fillchar="=": " {} ".format(x).upper().center(width, fillchar)
underscore_and_lowercase = lambda x: re.sub(r"-", "_", str(x)).lower()
underscore_and_uppercase = lambda x: re.sub(r"-", "_", str(x)).upper()
transit_valid_name = lambda x: self.underscore_and_lowercase(re.sub("[\.\:\/]", "_", x))
list_element_to_lowercase = lambda x: [s.lower() for s in x]
list_element_to_uppercase = lambda x: [s.upper() for s in x]
split_string_by_len = lambda string, length: [string[i:i+length] for i in range(0, len(string), length)]
split_line_element = lambda x: shlex.split(x)
get_string_byte_length = lambda string, codeset="UTF-8": len(string.encode(codeset))
strip_duplicate = lambda x: list(set(x))
strip_quotation_sign = lambda x: re.sub(r"[\"\']", "", x)
netmask_to_prefix = lambda ip, netmask: str(ipaddress.ip_interface(f"{ip}/{netmask}"))
ipprefix_to_ipmask_separated_by_space = lambda ip_with_prefix: " ".join(ipaddress.IPv4Interface(ip_with_prefix).with_netmask.split(r"/"))
ipaddr_to_network = lambda ip: str(ipaddress.ip_interface(ip).network)
strip_network_prefix = lambda network: str(network).split(r"/")[0]
generate_uuid = lambda x: str(uuid.uuid5(uuid.NAMESPACE_X500, "".join([str(uuid.uuid1()), x]))).replace(r"-", "")

下面一个一个的介绍

get_current_function_name: 获取当前函数或方法名

一般我把这个工具放在 debug 过程中,它用来获取这个语句所在的函数或者方法名,一般都是这样用:

# 面向过程的代码
get_current_function_name = lambda: inspect.stack()[1][3]

def function():
    print(get_current_function_name())

# 面向对象的代码
class class_A(object):
    def __init__(self):
        self.get_current_function_name = lambda: inspect.stack()[1][3]

    def method_1(self):
        print(self.get_current_function_name())

pprint: 用舒适的方式显示复杂数据结构

这个工具可以很容易的把复杂数据结构用很清晰的方式显示出来。比如嵌套的列表啊,列表中嵌套字典啊,或者字典列表元素中还有函数对象之类的东西啊,这些东西都给解析成人很容易看懂的样子,这样 debug 的时候也会很方便了

比如下面这个实例:

# 先建立一个稍微复杂的数据结构,它是一个列表,列表中的元素包含字典、元组和对象之类的东西
adict = [{"A": 1, "B": 2}, [1, 2, 3, 4], (5, 6, 7), object]

# 用 pprint 解析一下,注意 pprint 只是解析,不负责打印到标准输出,所以真正想在标准输出上看到解析结果还要用 print 语句
print(pprint(adict))

# 这里是标准输出
[
    {
        "A": 1,
        "B": 2
    },
    [
        1,
        2,
        3,
        4
    ],
    [
        5,
        6,
        7
    ],
    "<class 'object'>"
]

underscore_and_lowercase: 字符串合法化转换

有时候收到的英文字符串各种格式都有,用这个小工具可以统一处理这些字符串的格式,让最终输出符合标准,目前仅仅只是把所有大写字符转换成小写并且把中划线转换成下划线,需要的话还可以做更多动作。

另外还有几个姊妹工具,包括 underscore_and_uppercase 用来把英文字符全部转换成大写; transit_valid_name 把各种不合法字符转换成下划线等等

list_element_to_lowercase: 将列表中的所有元素都转换成小写字符

如果有一个每个元素都是字符串的列表,希望将字符串都转换成小写或者大写,那么就可以用这个简单的 lambda ,这个 lambda 可以玩的模式挺多的,可以转换成小写或大写,也可以做 strip 之类的动作,关键是活用了生成器语法

split_string_by_len: 将字符串按长度切分

拿到一个字符串希望按照指定长度来切分一下,比如把几千个字符按 80 个字符一行的方式打印之类的,用这个小工具就很容易搞定了

split_line_element: 根据语法切分字符串

有时候想根据单词切分字符串,如果是英文的话可能会考虑用正则表达式来根据空格来切分,但是这样很难处理某些用单引号或者双引号引起来的词组,很容易就把引号中的字符串也用空白符切分了,这个小工具可以按基本语法来切分字符串,这样引起来的词组就会当做一个整体处理了,比如:

split_line_element("""hello world, I am 'new born' here! "have a nice day" """)

# 引号引起来的词组被当做一个元素处理
=> ['hello', 'world,', 'I', 'am', 'new born', 'here!', 'have a nice day']

get_string_byte_length: 获取字符串的字节长度

这个工具一般用于中英文混合的情况,在 Python3 中,一个中文字符长度被算作 1 ,但实际上如果是 UTF-8 编码格式时在内部字节长度是 3 个字节, gbk 或者 gb2312 编码格式时内部字节长度是 2 个字节,在中英文混合的情况下想拿到正确字节长度就变得很麻烦了,这个小工具能根据编码方式计算内部字节长度

# 英文字符串长度是 5 ,后面的你好和逗号都是中文字符,如果是 gbk 编码的话每个字符占 2 个字节的空间,所以最终字节长度是 11
get_string_byte_length("hello你好,", "gbk")
=> 11

# 英文字符串长度是 5 ,但是后面包括中文逗号的中文有 3 个,用 UTF-8 格式保存每个字符需要 3 个字节,所以最终结果是 14
get_string_byte_length("hello你好,", "UTF-8")
=> 14

strip_duplicate: 去除列表中的重复元素

strip_quotation_sign: 将字符串中的单引号和双引号都转换成双引号

netmask_to_prefix: IP 地址转换方法

IPv4 的 IP 地址有 2 种表示方法,比如 "192.168.1.1 255.255.255.0" 和 "192.168.1.1/24" 的意思是一样的,但是有时候代码中只对一种作支持怎么办?这个小工具就是用来把第一种格式转换成第二种的

ipprefix_to_ipmask_separated_by_space: IP 地址转换方法

和上面 netmask_to_prefix 工具的作用相反,把 "192.168.1.1/24" 转换成 "192.168.1.1 255.255.255.0" 的格式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,725评论 0 10
  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,793评论 2 16
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,128评论 0 3
  • 早上送板栗上幼儿园。 到了教室门口,我说:“宝宝再见。” 她一边抹着眼泪一边跟我摆手一边往教室走。 心里酸酸的。 ...
    辋水沦涟阅读 183评论 0 1
  • 望窗一片白茫茫,透过温暖的窗户也似乎感受到了外边雪夜的寒冷。 凌厉的霜冻似乎冻透了整个世界,屋子里的暖气似乎也被它...
    浣纱陌莲阅读 147评论 0 0