今天帅气的易哥和大家分享的是Pyton的高级特性,希望大家能和我一起学习这门语言的魅力。

Python高级特性之:List Comprehensions、Generator、Dictionary and set comprehension(su013171165)



我们在需要循环处理数据的时候,往往都会用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]需要注意的是:xrange()消耗的内存小,只做迭代处理的话,推荐一律用xrange()。

help()原文:Like range(), but instead of returning a list, returns an object that generates the numbers in the range on demand.  For looping, this is  slightly faster than range() and more memory efficient.

方法二:range用法【2014.06.01补充:生成奇偶数其实可以用range,但是本文讲的是list comprehensions。

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



方法三:使用List ComprehensionsList 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_var,expr做运算后,继续循环,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        13579需要注意的是:第二种方法返回的不是一个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(生成器)官方demo:https://wiki.python.org/moin/Generators 建议迭代的时候能用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        02468>>> 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:

<genexpr> = class generator(object)

|  Methods defined here:

|  close(...)

|      close() -> raise GeneratorExit inside generator.

|      # 抛出generator内部的GeneratorExit异常,达到停止generator的目的

>>> L = (i for i in range(10) if i % 2 != 1)>>> L.next()0>>> L.close()>>> L.next()Traceback (most recent call last):  File "<pyshell#18>", line 1, in <module>    L.next()StopIteration>>> |  next(...)

|      x.next() -> the next value, or raise StopIteration

|      # 取下一个值,所有都取过则抛出异常StopIteration

|  send(...)

|      send(arg) -> send 'arg' into generator,

|      return next yielded value or raise StopIteration.

|      # 传递参数进入generator,返回下一个yielded的值直到抛出StopIteration异常。

|  throw(...)

|      throw(typ[,val[,tb]]) -> raise exception in generator,

|      return next yielded value or raise StopIteration.

|      # 未知用法,暂未涉及

|  ----------------------------------------------------------------------

下面用斐波那契数列学习generator:

>>> def fbnq(max):        # 生成max个元素的斐波那契数列        L = []        a, b, n = 0, 1, 0        while n < max:            L.append(b)            a, b = b , a + b            n += 1        return L>>> fbnq(10)[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]>>> 我们能构建1个list的斐波那契数列,那么generator的怎么构建呢?很简单!

>>> def fbnq(max):        # 生成max个元素的斐波那契数列        a, b, n = 0, 1, 0        while n < max:            yield b            a, b = b , a + b            n += 1            >>> fbnq(8)<generator object fbnq at 0x02A1C760>>>> G.next()1>>> G.next()1>>> G.next()2>>> for i in G:        print i        3581321>>> 为什么会这样呢?由于有关键字yield,我们构建的第二个函数就不是普通的函数了,而是一个generator。工作原理是:程序执行时,遇到yield就会停下来,并返回当前yield b中的b的值,下次调用时候,又从yield处开始执行,并且执行到下一个yield处暂停,并抛出当前yield b中的b的值。(本例子中有个while循环!)下面是程序运行过程:

>>> def fbnq(max):        # 生成max个元素的斐波那契数列        a, b, n = 0, 1, 0        while n < max:            print "A"             yield b            a, b = b , a + b            n += 1            print "B"            >>> G = fbnq(5)>>> G.next()A1>>> G.next()BA1>>> G.next()BA2>>> G.next()BA3>>> G.next()BA5>>> G.next()BTraceback (most recent call last):  File "<pyshell#70>", line 1, in <module>    G.next()StopIteration>>>

【更新于:2014.07.08另外一种实现方法

>>> def fbnq():        a, b = 0, 1        while True:             yield a            a, b = b , a + b            >>> from itertools import islice>>> list(islice(fbnq(), 10))[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]>>>

三、Dictionary and set comprehensions新特性:2.7.X版本及3.2以上版本。本节内容2014.09.25更新。

set和dict表达式

a = {x: x*x for x in range(6)}aOut[9]: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}type(a)Out[10]: dictb = {('a'*x) for x in range(6)}bOut[12]: {'', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'}type(b)Out[13]: set

Python高级特性之:List Comprehensions、Generator、Dictionary and set ...的更多相关文章

  1. Python 高级特性介绍 - 迭代的99种姿势 与协程

    Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...

  2. 三、python高级特性(切片、迭代、列表生成器、生成器)

    1.python高级特性 1.1切片 list列表 L=['Mli','add','sal','saoo','Lkkl'] L[0:3]  #即为['Mli','add','sal']  从索引0开始 ...

  3. python高级特性:切片/迭代/列表生成式/生成器

    廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...

  4. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  5. python高级特性和高阶函数

    python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...

  6. Python高级特性(3): Classes和Metaclasses(转)

    原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变 ...

  7. Python高级特性(2):Closures、Decorators和functools(转)

    原文:Python高级特性(2):Closures.Decorators和functools 装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过 ...

  8. Python高级特性(切片,迭代,列表生成式,生成器,迭代器)

    掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...

  9. Python高级特性(1):Iterators、Generators和itertools(参考)

    对数学家来说,Python这门语言有着很多吸引他们的地方.举几个例子:对于tuple.lists以及sets等容器的支持,使用与传统数学类 似的符号标记方式,还有列表推导式这样与数学中集合推导式和集的 ...

随机推荐

  1. 网络管理和nmcli命令的使用——网络接口配置-bonding实验步骤

    (实验)网络接口配置-bonding  Bonding 将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡.直接给两块网卡设置同\一IP地址是不可以的.通过bonding,虚拟一块网 ...

  2. Python:判断列表中含有字符串且组成新的列表打印输出-Dotest董浩

    '''题一:判断列表中含有字符串且组成新的列表打印输出知识点:列表.列表的增删改查.for循环.if判断'''#@Author:Dotest软件测试#@QQ:1274057839names = ['D ...

  3. QT新建空白项目-添加QT设计师界面类时出现的各种库无法导入识别

    按照教材上先新建一个空的项目--添加Qt设计师界面类时 出现各种 库无法识别 解决方法: 在 .pro文件中加入一行 QT += widgets 去构建中先执行 qmake 然后再构建一下  ok了 ...

  4. 使用 Hbuilder 连接手机调试移动端项目

    点击界面上的浏览器右侧的倒三角.   弹出列表以后,点击最后一行 “设置web服务器...”.继续弹出,点击右下角的“外置Web服务器设置”.   点新建.   弹出框后,填入“名称”和“浏览器运行U ...

  5. SVO 特征对齐代码分析

    SVO稀疏图像对齐之后使用特征对齐,即通过地图向当前帧投影,并使用逆向组合光流以稀疏图像对齐的结果为初始值,得到更精确的特征位置. 主要涉及文件: reprojector.cpp matcher.cp ...

  6. Codeforces Round #603 (Div. 2) E. Editor 线段树

    E. Editor The development of a text editor is a hard problem. You need to implement an extra module ...

  7. Python必备收藏!博士大佬总结的Pycharm 常用快捷键思维导图

    ​ 搜索 Ctrl + Shift + F7用法高亮显示 Ctrl + Alt + F7显示用法 编辑 ​ Ctrl + Shift + V从最近的缓冲区粘贴 Ctrl + D复制选定的区域或行到后面 ...

  8. 【STM32H7教程】第25章 STM32H7的TCM,SRAM等五块内存基础知识

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第25章       STM32H7的TCM,SRAM等五块内 ...

  9. 【STM32H7教程】第24章 STM32H7的Cache解读(非常重要)

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第24章       STM32H7的Cache解读(非常重要 ...

  10. SQL Server设置数据库为状态为只读

    问题描述: 有时候我们为了防止连接数据库再链接插入数据,就可以把库设置为只读模式 灰色后面显示只读说明已经是只读状态了 1.设置为只读状态 USE [master] GO ALTER DATABASE ...