<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; 列表推导式</title>
	<atom:link href="https://www.phppan.com/tag/%e5%88%97%e8%a1%a8%e6%8e%a8%e5%af%bc%e5%bc%8f/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sun, 12 Apr 2026 03:47:23 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>关于列表推导式</title>
		<link>https://www.phppan.com/2012/03/list-comprehensions/</link>
		<comments>https://www.phppan.com/2012/03/list-comprehensions/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 03:40:35 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[程序相关]]></category>
		<category><![CDATA[列表推导式]]></category>
		<category><![CDATA[胖子乱想的]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1626</guid>
		<description><![CDATA[列表推导式最开始是一些函数式编译语言的句法特征，比如模式匹配，它能极大提高函数式程序的读写能力。最开始并没有列 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>列表推导式最开始是一些函数式编译语言的句法特征，比如模式匹配，它能极大提高函数式程序的读写能力。最开始并没有列表推导式，只有集合推导式（Set Comprehensions），列表推导式第一次使用是Turner1982年在KRC（Kent Recursive Calculator）上。列表推导式曾经在各种函数式编程语言中出现，如Miranda(一种纯粹的函数式编程语言)，Orwell(一种lazy函数式编程语言，对Haskell有较大影响)。</p>
<p>曾经列表推导式被称为集合抽象，由于抽象(abstractions)这个词语的英文单词在若干个地方有用到，其意思太多了，所以引入了推导式(comprehensions)这样一个词语。从数学上的策梅洛-弗兰克尔集合论（Zermelo-Fraenkel Set Theory）（http://en.wikipedia.org/wiki/Zermelo-Frankel_set_theory）　来看，列表推导式和集合推导式类似。比如求集合Ａ中奇数的平方</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="shell" style="font-family:monospace;">B = {square x | x ∈ A &amp; odd x}</pre></td></tr></table></div>

<p>上面的这个示例，如果A集合是{1,2,3,4}，那么B集合为{1,9}</p>
<p>如果我们把这些数学符号换成常见的编程符号，如：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="shell" style="font-family:monospace;">ys = [square x | x &lt;- xs; odd x]</pre></td></tr></table></div>

<p>或者我们将<-再变为for in，再加上if语句，是不是就是Python的列表推导式了。



<div class="wp_syntax"><table><tr><td class="code"><pre class="python" style="font-family:monospace;">vec <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span>
rs <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span>x * x <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> vec <span style="color: #ff7700;font-weight:bold;">if</span> x % <span style="color: #ff4500;">2</span> <span style="color: #66cc66;">!=</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> rs</pre></td></tr></table></div>

<p> 对应上面的Python示例，我们看下在Python中，列表推导式的一般形式：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="shell" style="font-family:monospace;">[表达式 for item1 in 序列1 ... for itemN in 序列N if 条件表达式]</pre></td></tr></table></div>

<p>上面的表达式分为三部分，最左边是生成每个元素的表达式，然后是for 迭代过程，最右边可以设定一个if 判断作为过滤条件。</p>
<p>[]内的列表写以写为一行，也可以写为多行，一般来说多行更易读些，看个人喜好吧。 </p>
<p>对于Python而言，列表推导式（List Comprehensions）是其最强有力的语法之一，常用于从集合对象中有选择地获取并计算元素，虽然多数情况下可以使用for、if等语句组合完成同样的任务。</p>
<p>其本质是一种语法糖，它提供了一种简洁高效的方式来创建列表和迭代器, 而不必借助map(), filter(), 或者lambda。<br />
简单的列表推导可以比其它的列表创建方法更加清晰简单. 生成器表达式可以十分高效, 因为它们避免了创建整个列表。这里的优点一般是指使用简单的列表推导式时，而对于复杂的列表推导式虽然可以高效，但是生成的表达式可能难以阅读（不排除通过某些注释或排版达到优化可读性的目的）。列表推导式适用于简单情况. 每个部分应该单独置于一行: 映射表达式, for语句, 过滤器表达式. 禁止多重for语句或过滤器表达式. 复杂情况下还是使用循环吧。</p>
<p>如果我们要用PHP去实现列表推导式，应当如何表现呢？（这里假设我们需要实现这样一个语法糖）</p>
<p>有如下想法，其一般形式如下：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="shell" style="font-family:monospace;">list{表达式1, 表达式2, ... if (条件表达式),  $list1 as $key1 =&gt; $row1, $list2 as $key2 =&gt; $row2, ...}
&nbsp;
&nbsp;
//如下示例：
&nbsp;
list{echo $key1, echo $row2, if ($key1 &gt; $key2), $a as $key =&gt; $row, $b as $key2 =&gt; $row2, }</pre></td></tr></table></div>

<p>在if语句前可以有多个表达式处理，以逗号隔开；<br />
在if语句后面可以有多个列表，以逗号隔开；</p>
<p>也许这个YY有点纠结，只是对于PHP来说，这个糖果也许没那么重要？</p>
<p> 参考资料：</p>
<p>Jones &#8211; 《The Implementation of Functional Programming Languages》, PH, 1987</p>
<p>http://zh-google-styleguide.googlecode.com/hg-history/2a227ce093e7b70085818bba22061d9393f3bb99/pyguide/python_language_rules.txt</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2012/03/list-comprehensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
