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(),函数体还是会从上一次中断的地方继续。

原文地址:https://www.cnblogs.com/bigbosscyb/p/12350022.html

时间: 2024-07-31 00:31:33

Python--Demo13--高级特性匿名函数、推导式、迭代器、生成器的相关文章

Python的高级特性2:列表推导式和生成器

一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: ['i:el' for i,el in enumerate(["one","two","three"])] Out[23]: ['i:el', 'i:el', 'i:el'] enumerate是内建函数,可以让列表获得“下标”的属性.而如果不用列表推导式,上例需要这么写 In [24]: lst = ["one",

三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

一 三元表达式.列表推导式.生成器表达式 1.三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 2.列表推导式 #1.示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2.语法 [expression for item1 in iterabl

part4-2 流程控制二(循环结构,while、for循环,列表推导式、生成器推导式,常用工具函数,控制循环结构,4个简单实例)

循环语句在循环条件满足时,可反复执行某一段代码,这段被重复执行的代码称为循环体.在循环体中,需要在合适的时候把循环条件设置为假,从而结束循环:否则循环一直执行下去形成死循环.循环语句通常包含如下4个部分.(1).初始化语句(init_statements):在循环开始前执行,有一条或多条语句,用于完成一些起初始化工作.(2).循环条件(test_expression):一个布尔表达式,决定是否执行循环体.(3).循环体(body_statements):循环的主体,根据循环条件是否允许,这个代码

Python之推导式、生成器表达式

l = [i for i in range(10)] print(l) l1 = ['选项%s'%i for i in range(10)] print(l1) 1.把列表解析的[]换成()得到的就是生成器表达式 2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存 3.Python不但使用迭代器协议,让for循环变得更加通用.大部分内置函数,也是使用迭代器协议访问对象的.例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议

day14,列表推导式,生成器表达式,内置函数

一.列表推导式.生成器表达式: # li = []# for i in range(1,101):# li.append(i)# print(li) #l1 = [python1期,python2期,python3期.....]# l1 = []# for i in range(1,12):# l1.append('python%s期' % i)# print(l1)#一行搞定,列表推导式:用列表推导式能够构建的任何列表,用别的都可以构建.#一行,简单,感觉高端.但是,不易排错.# li = [

Python 列表\集合\ 字典推导式、生成器表达式

Python 列表\集合?字典推导式.生成器表达式 列表推导式 循环模式 l1 = [i for i in range(1,11)] l2 = [i ** 2 for i in range(100)] l3 = [f'python{i}' for i in range(50)] 筛选模式: l1 = [i for i in range(1,31) if i % 3 == 0] 嵌套循环: names = [['tom','billy','jefferson'],['wesley','steven

Python3 三元表达式、列表推导式、生成器表达式

Python3 三元表达式.列表推导式.生成器表达式 三元表达式 表达式中,有三个元素 name = input("请输入姓名: ")ret = '输入正确' if name == 'aaa' else '输入错误'print(ret)  列表推导式 #1.示例# 方法1egg_list1 = []for i in range(10): egg_list1.append('鸡蛋%s' % i)print(egg_list1) #方法2egg_list2 = ['鸡蛋%s' %i for

六 三元表达式、列表推导式、生成器表达式

一 三元表达式 二 列表推导式 三 生成器表达式 一 三元表达式 1 name=input('姓名>>: ') 2 res='abc' if name == 'lucy' else 'jack' 3 print(res) 二 列表推导式 #1.示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2.语法 [expression for ite

列表推导式和生成器表达式

# 列表推导式 lis = [i for i in range(10)] print(lis) # 生成器表达式 crt = (i for i in range(10)) print(crt) print(crt.__next__()) print(crt.__next__()) print(crt.__next__()) #打印: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <generator object <genexpr> at 0x00000188F0FED9

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma