python中几个概念汇总

为什么80%的码农都做不了架构师?>>>

列表生成式

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环。

还可以使用两层循环,可以生成全排列:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

生成器

生成器和列表生成式的区别仅在于最外层的 []()[] 表示列表生成式,() 表示生成器。

列表生成式是直接一次性生成一个列表,生产器(generator)是边循环边计算的机制,用函数 next() 从 generator 中取值,generator 本身保存的是一个算法

迭代器

可以直接作用于for循环的对象统称为可迭代对象:Iterable。 可迭代对象不一定是迭代器,迭代器一定是可迭代对象!可迭代对象可以用 iter() 函数转换为迭代器。 可以使用函数 isinstance() 判断一个对象是否是可迭代(iterable)对象

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数。

装饰器

参考: 理解 Python 装饰器看这一篇就够了

在理解装饰器之前,先明白在python的世界里,一切皆对象!即,函数本身也是一个对象。

装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。

**用途: ** 它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

@ 语法糖: @ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。

匿名函数

参考:匿名函数详解

python 使用 lambda 来创建匿名函数

lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的。 在Python中,lambda作为一个关键字,作为引入表达式的语法。相比较 def 函数, lambda 是单一的表达式,而不是语句块!

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数

  • lambda 只是一个表达式,函数体比 def 简单很多。
    • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
    • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
    • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

语法

lambda 函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

#  lambda 参数列表:return [表达式] 变量
#  由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收

map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数:

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

关键字lambda表示匿名函数,冒号前面的x表示函数参数

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。

     (adsbygoogle = window.adsbygoogle || []).push({});  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券