Python高级编程技巧
admin
2023-07-31 00:48:21
0

译注:本文的英文题目是《Advanced Design Patterns in Python》,可直译为《Python中的高级设计模式》。不过本人在通读完全文之后发现文章的内容与我们通常理解的设计模式有很大出入,原文后的评论中也有其他读者提出了这一点。因此,根据文章内容我将题目译为“Python高级编程技巧”,如有不同意见请留言指出,非常感谢。

正文:

本文展示一些高级的Python设计结构和它们的使用方法。在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求、对数据一致性的要求或是对索引的要求等,同时也可以将各种数据结构合适地结合在一起,从而生成具有逻辑性并易于理解的数据模型。Python的数据结构从句法上来看非常直观,并且提供了大量的可选操作。这篇指南尝试将大部分常用的数据结构知识放到一起,并且提供对其最佳用法的探讨。

推导式(Comprehensions)

如果你已经使用了很长时间的Python,那么你至少应该听说过列表推导(list comprehensions)。这是一种将for循环、if表达式以及赋值语句放到单一语句中的一种方法。换句话说,你能够通过一个表达式对一个列表做映射或过滤操作。

一个列表推导式包含以下几个部分:

  • 一个输入序列
  • 一个表示输入序列成员的变量
  • 一个可选的断言表达式
  • 一个将输入序列中满足断言表达式的成员变换成输出列表成员的输出表达式

举个例子,我们需要从一个输入列表中将所有大于0的整数平方生成一个新的序列,你也许会这么写:

123456789 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = [] for number in num:    if number > 0:        filtered_and_squared.append(number ** 2)print filtered_and_squared # [1, 16, 100, 4, 9]

很简单是吧?但是这就会有4行代码,两层嵌套外加一个完全不必要的append操作。而如果使用filter、lambda和map函数,则能够将代码大大简化:

12345 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = map(lambda x: x ** 2, filter(lambda x: x > 0, num))print filtered_and_squared # [1, 16, 100, 4, 9]

嗯,这么一来代码就会在水平方向上展开。那么是否能够继续简化代码呢?列表推导能够给我们答案:

12345 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = [ x**2 for x in num if x > 0]print filtered_and_squared # [1, 16, 100, 4, 9]

list1

  • 迭代器(iterator)遍历输入序列num的每个成员x
  • 断言式判断每个成员是否大于零
  • 如果成员大于零,则被交给输出表达式,平方之后成为输出列表的成员。

列表推导式被封装在一个列表中,所以很明显它能够立即生成一个新列表。这里只有一个type函数调用而没有隐式调用lambda函数,列表推导式正是使用了一个常规的迭代器、一个表达式和一个if表达式来控制可选的参数。

另一方面,列表推导也可能会有一些负面效应,那就是整个列表必须一次性加载于内存之中,这对上面举的例子而言不是问题,甚至扩大若干倍之后也都不是问题。但是总会达到极限,内存总会被用完。

针对上面的问题,生成器(Generator)能够很好的解决。生成器表达式不会一次将整个列表加载到内存之中,而是生成一个生成器对象(Generator objector),所以一次只加载一个列表元素。

生成器表达式同列表推导式有着几乎相同的语法结构,区别在于生成器表达式是被圆括号包围,而不是方括号:

12345678910 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = ( x**2 for x in num if x > 0 )print filtered_and_squared # at 0x00583E18> for item in filtered_and_squared:    print item # 1, 16, 100 4,9

这比列表推导效率稍微提高一些,让我们再一次改造一下代码:

1234567891011121314151617 num = [1, 4, 5, 10, 7, 2, 3, 1] def square_generator(optional_parameter):    return (x ** 2 for x in num if x > optional_parameter) print square_generator(0)# at 0x004E6418>7bc8c00a5332440053-6\”>print square_generator(0)# at 0x004E6418> in Python》,可直译为《Python中的高级设计模式》。不过本人在通读完全文之后发现文章的内容与我们通常理解的设计模式有很大出入,原文后的评论中也有其他读者提出了这一点。因此,根据文章内容我将题目译为“Python高级编程技巧”,如有不同意见请留言指出,非常感谢。

正文:

本文展示一些高级的Python设计结构和它们的使用方法。在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求、对数据一致性的要求或是对索引的要求等,同时也可以将各种数据结构合适地结合在一起,从而生成具有逻辑性并易于理解的数据模型。Python的数据结构从句法上来看非常直观,并且提供了大量的可选操作。这篇指南尝试将大部分常用的数据结构知识放到一起,并且提供对其最佳用法的探讨。

推导式(Comprehensions)

如果你已经使用了很长时间的Python,那么你至少应该听说过列表推导(list comprehensions)。这是一种将for循环、if表达式以及赋值语句放到单一语句中的一种方法。换句话说,你能够通过一个表达式对一个列表做映射或过滤操作。

一个列表推导式包含以下几个部分:

  • 一个输入序列
  • 一个表示输入序列成员的变量
  • 一个可选的断言表达式
  • 一个将输入序列中满足断言表达式的成员变换成输出列表成员的输出表达式

举个例子,我们需要从一个输入列表中将所有大于0的整数平方生成一个新的序列,你也许会这么写:

123456789 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = [] for number in num:    if number > 0:        filtered_and_squared.append(number ** 2)print filtered_and_squared # [1, 16, 100, 4, 9]

很简单是吧?但是这就会有4行代码,两层嵌套外加一个完全不必要的append操作。而如果使用filter、lambda和map函数,则能够将代码大大简化:

12345 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = map(lambda x: x ** 2, filter(lambda x: x > 0, num))print filtered_and_squared # [1, 16, 100, 4, 9]

嗯,这么一来代码就会在水平方向上展开。那么是否能够继续简化代码呢?列表推导能够给我们答案:

12345 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = [ x**2 for x in num if x > 0]print filtered_and_squared # [1, 16, 100, 4, 9]

list1

  • 迭代器(iterator)遍历输入序列num的每个成员x
  • 断言式判断每个成员是否大于零
  • 如果成员大于零,则被交给输出表达式,平方之后成为输出列表的成员。

列表推导式被封装在一个列表中,所以很明显它能够立即生成一个新列表。这里只有一个type函数调用而没有隐式调用lambda函数,列表推导式正是使用了一个常规的迭代器、一个表达式和一个if表达式来控制可选的参数。

另一方面,列表推导也可能会有一些负面效应,那就是整个列表必须一次性加载于内存之中,这对上面举的例子而言不是问题,甚至扩大若干倍之后也都不是问题。但是总会达到极限,内存总会被用完。

针对上面的问题,生成器(Generator)能够很好的解决。生成器表达式不会一次将整个列表加载到内存之中,而是生成一个生成器对象(Generator objector),所以一次只加载一个列表元素。

生成器表达式同列表推导式有着几乎相同的语法结构,区别在于生成器表达式是被圆括号包围,而不是方括号:

12345678910 num = [1, 4, 5, 10, 7, 2, 3, 1]filtered_and_squared = ( x**2 for x in num if x > 0 )print filtered_and_squared # at 0x00583E18> for item in filtered_and_squared:    print item # 1, 16, 100 4,9

这比列表推导效率稍微提高一些,让我们再一次改造一下代码:

1234567891011121314151617 num = [1, 4, 5, 10, 7, 2, 3, 1] def square_generator(optional_parameter):    return (x **

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...