Python高级特性之:List Comprehensions、Generator、Dictionary and set comprehensions

我们在需要循环处理数据的时候,往往都会用range(n)这个方法生成list但是如果需要生成奇数list或者其他list怎么办呢?这就是我今天要讲的List Comprehensions

一、List Comprehensions(列表解析/列表生成器)

方法一:循环l.append()

>>> L = []  
>>> for i in range(10):  
    if i % 2 == 1:  
        L.append(i)  

>>> L  
[1, 3, 5, 7, 9]  

方法二:range用法

>>> range(0, 10,2)  
[0, 2, 4, 6, 8]  

方法三:使用List Comprehensions

List Comprehensions语法:[expr for iter_var in iterable][expr for iter_var in iterable if cond_expr]

L = [expr for iter_var in iterable]for iter_var in iterable的作用是依次取 iterable赋值给iter_var,而expr for iter_var in iterable的作用就是依次取值给iter_varexpr做运算后,继续循环,expr运算得到的值赋给变量L

>>> L = [i % 2 == 1 for i in range(10)]  
>>> L  
[False, True, False, True, False, True, False, True, False, True]  
>>> L = [i + 1 for i in range(5)]  
>>> L  
[1, 2, 3, 4, 5]  
>>>   

请注意上面两个表达式的不同结果。

L = [expr for iter_var in iterable if cond_expr]:加了判断条件if cond_expr,也就是满足了判断条件才按expr运算iter_var

>>> L = (i for i in range(10) if i % 2 ==1)  
>>> L  
<generator object <genexpr> at 0x02950F80>  
>>> for i in L:  
    print i  


1  
3  
5  
7  
9 

需要注意的是:第二种方法返回的不是一个list是一个generator(生成器)对象!为什么呢,我们用的是()而不是[],是不是有人写错了?

>>> L = [i for i in range(10) if i % 2 ==1]  
>>> L  
[1, 3, 5, 7, 9]  
>>>   

下面会讲生成器。
注:还有很多其他用法,有需求,就有使用的空间,简单写两个。

1、多层循环

>>> L = [a * b for a in range(1, 10) for b in range(1, 10)]  
>>> L  
[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]  

2、用等连接字典的键值:key=value

>>> d = {1: 'A', 2: 'B', 3: 'C' }  
>>> [str(k) + '=' + v for k, v in d.iteritems()]  
['1=A', '2=B', '3=C']  
>>>   

二、Generator(生成器)

为什么我推荐生成器呢。因为list大的时候很占内存,会受到内存限制;如果我们需要用的元素少,岂不是浪费得很?
generator的机制为:一边循环,一边计算!
generator的创建方法:
1、把List Comprehensions中的[]换为(),上面有例子,不在贴出代码。
有些是不能用List Comprehensions写出来的,例如斐波那契数列用,怎么办呢? 百度百科:斐波拉契数列 维基百科:菲波拉契数列
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。
这个就需要用函数了!但是普通函数不能生成generator,需要用到yield关键字。
2、yield关键字
首先不得不说下generator值的取法:用for循环;用next()方法。

>>> L = (i for i in range(10) if i % 2 != 1)  
>>> L  
<generator object <genexpr> at 0x029518A0>  
>>> for i in L:  
    print i  

0  
2  
4  
6  
8  
>>> for i in L:  
    print i  


>>> 

有没有疑问呢?再看next()方法是什么样的。

>>> L = (i for i in range(10) if i % 2 != 1)  
>>> L.next()  
0  
>>> L.next()  
2  
>>> L.next()  
4  
>>> L.next()  
6  
>>> L.next()  
8  
>>> L.next()  

Traceback (most recent call last):  
  File "<pyshell#6>", line 1, in <module>  
    L.next()  
StopIteration  
>>> for i in L:  
    print i  


>>>

我们发现了什么?L的值被取过一遍后再也取不出来了!next()会报错,for 循环取不出来任何值。
原因是:它并不把所有的值放在内存中,它是实时地生成数据,所以只可以取值一次!
其他的迭代器方法,如下图:
“`
Help on generator object:
= class generator(object)
| Methods defined here:
| close(…)
| close() -> raise GeneratorExit inside generator.
| # 抛出generator内部的GeneratorExit异常,达到停止generator的目的
[python] view plaincopy在CODE上查看代码片派生到我的代码片

L = (i for i in range(10) if i % 2 != 1)
L.next()
0
L.close()
L.next()

Traceback (most recent call last):
File “

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值