zoukankan      html  css  js  c++  java
  • Python--Demo13--高级特性匿名函数、推导式、迭代器、生成器

    学完函数,我们还需要知道一些让我们能够提高效率的高级特性:

    使用lambda关键字来创建匿名函数:

    • lambda表达式只是一个表达式,而不是是一个代码块,函数体比def简单很多;
    • lambda表达式仅仅能够封装一些简单的逻辑;
    • lambda表达式拥有自己的命名空间。
    >>> def plusitem(pam):
    ...     return pam*pam
    ...
    >>> type(plusitem)
    <class 'function'>
    >>> plusitem(12)
    144
    >>> nonamefuc=lambda item:item*item
    >>> type(nonamefuc)
    <class 'function'>
    >>> nonamefuc(12)
    144

    说明:lambda表达式就是一个函数昂。

    列表推导式:

    在不知道有列表推导式之前,我们想要生成一个[1,2,3...,9]的列表,是这样子写的 :

    >>> mylis=[]
    >>> for item in range(1,10):
    ...     mylis.append(item)
    ...
    >>> mylis
    [1, 2, 3, 4, 5, 6, 7, 8, 9]

    如果我们有了列表推导式,可以十分简洁地生成一个列表:

    >>> newlis=[item for item in range(1,10)]
    >>> newlis
    [1, 2, 3, 4, 5, 6, 7, 8, 9]

    列表推导式的花式玩法:

    1、增加条件判断

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

    2、多重循环

    >>> shuangceng=[x*y for x in range(1,10) for y in [1,2,3]]
    >>> shuangceng
    [1, 2, 3, 2, 4, 6, 3, 6, 9, 4, 8, 12, 5, 10, 15, 6, 12, 18, 7, 14, 21, 8, 16, 24, 9, 18, 27]

    迭代:

    • 迭代的概念就是通过for循环遍历对象的每个元素的过程。
    • python中的for可以遍历任何可迭代对象。
    • 在python中list、tuple、str、dict、set都是可迭代数据类型。
    • 在python中可以使用collextions模块中的Iterable类型来判断一个对象是否可以迭代。

    迭代器:

    一种可以被遍历的对象,并且可以作用于next()函数。迭代器对象从第一个元素访问,直到所有的元素被访问完才结束。迭代器只能往后遍历不能回溯。迭代器常用的两个方法iter()和next()。

    我的理解就是:

    把迭代器看成时间 你可以往后看十年、二十年、但是最终你是无法看到时间的终点的
    而 我们把 可迭代对象 看成我们的上下五千年历史  我们可以看 公元10年 公元100 知道我们可以追溯到当下 2020年 可迭代对象是有终点的
    python可以通过使用iter()函数 将上下五千年史---可迭代对象 转换成 历史长河---迭代器

    >>> from collections import Iterable
    >>> isinstance('123',Iterable)
    True
    >>> isinstance(123,Iterable)
    False
    >>> lis=[1,2,3,4]
    >>> lis
    [1, 2, 3, 4]
    >>> it=iter(lis)
    >>> it
    <list_iterator object at 0x0000021E54846BE0>
    >>> next(it)
    1
    >>> for x in it:
    ...     print(x)
    ...
    2
    3
    4

    说明:iter()可以创建迭代器,使用next()可以获取迭代器的下一个元素。for循环可以遍历迭代器。python中的for循环本质上就是通过next()函数实现的。

    生成器:

    有时候列表内的元素个数非常巨大,一下子制造出来放到内存中是内存压力会很大。我们可以通过某种算法把元素推算出来,用到哪儿时再计算出来使用。这就是生成器的作用。

    通过圆括号---推导式的方法,可以编写生成器:

    >>> g=(x for x in [2,4,6,8,10])
    >>> g
    <generator object <genexpr> at 0x0000021E5498C270>
    >>> g[0]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'generator' object is not subscriptable
    >>> next(g)
    2
    >>> for item in g:
    ...     print(item)
    ...
    4
    6
    8
    10

    使用yield关键字可以让一个函数制造出一个生成器。

    比如下面,返回一个列表元素的平方。

    >>> def genfunc(pams):
    ...     print('开始了..')
    ...     for item in pams:
    ...             yield item*item
    ...
    >>> lis=[1,2,3,4,5]
    >>> rtn=genfunc(lis)
    >>> rtn
    <generator object genfunc at 0x000001B6598795F0>
    >>> next(rtn)
    开始了..
    1
    >>> next(rtn)
    4

    说明:

    拥有了yield的函数就变成了可以创造生成器的函数,函数调用之后,函数体不立即执行,反倒是返回一个生成器。

    当我们使用next()作用到生成器上时,函数体开始执行,每执行到一次yield就暂时终止一次,将结果return回来。

    再次调用next(),函数体还是会从上一次中断的地方继续。

  • 相关阅读:
    net core体系-2继续认识net core
    net core体系-1概要
    iOS开发UI篇—懒加载
    iOS开发UI篇—简单的浏览器查看程序
    iOS开发UI篇—transframe属性(形变)
    iOS开发UI基础—手写控件,frame,center和bounds属性
    iOS开发UI篇—Button基础
    Foundation框架—集合
    Foundation框架—字符串
    Foundation框架—结构体
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/12350022.html
Copyright © 2011-2022 走看看