python几大常用且较难理解语法

本文详细介绍了Python中四个关键的语法特性:列表推导式,lambda函数,yield及生成器和迭代器,以及装饰器。列表推导式提供了一种简洁创建列表的方式。lambda函数作为匿名函数,常与其他方法结合使用。yield和生成器节省内存,避免了大列表的创建。装饰器则允许在不修改原有函数代码的情况下,添加额外功能。对于多个参数的装饰器,可以使用*args和**kwargs来处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、列表推导式

a = [1, 2, 3, 4, 5]
result = [i*i for i in a]
print(result)

二、lambda函数

1、lambda函数即为匿名函数,仅在定义匿名函数的地方使用这个函数,其他地方用不到,所以就不需要给它取个阿猫阿狗之类的名字了。
匿名函数一般不会单独使用,而是配合其他方法,为其他方法提供内置的算法或判断条件

a=(lambda x,y:x+y)(3,4)
print(a)

2、与map函数一起使用时:

map(function, iterable, …)
map() 会根据提供的函数对指定序列做映射。
参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

  • function – 函数
  • iterable – 一个或多个序列
  • Python 3.x 返回迭代器
a = [1, 2, 3, 4, 5]
b = [5,4,3,2,1]
result = map(lambda x,y:x*y,a,b)
for i in result:
    print(i)

三、yield 以及生成器和迭代器

迭代器,它可以像list那样被遍历,但又不占用多少内存generator(生成器)是一种特殊的迭代器,只能被遍历一次,遍历结束,就自动消失了
总之,不管是迭代器还是生成器,都是为了避免使用list,从而节省内存
python内置了迭代函数 iter,用于生成迭代器
yield 则是用于构造生成器的
generator保存的是函数算法,节约内存
generator也是可迭代对象
可用next函数调用,也可以用for循环调用
Python3的for循环本质上就是通过不断调用next()函数实现的
generator保存的是算法,每次调用next(generaotr_ex)就计算出他的下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误
generator和函数的执行流程,函数是顺序执行的,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次被next()调用时候从上次的返回yield语句处急需执行,也就是用多少,取多少,不占内存

def fib(max):
    n,a,b =0,0,1
    while n < max:
        yield b
        a,b =b,a+b
        n = n+1

for i in fib(6):
    print(i)

话说py2时代,range()返回的是list,但如果range(10000000)的话,会消耗大量内存资源,所以,py2又搞了一个xrange()来解决这个问题。
py3则只保留了xrange(),但写作range(),xrange()返回的就是一个迭代器,它可以像list那样被遍历,但又不占用多少内存
Python3的for循环本质上就是通过不断调用next()函数实现的

for x in [1, 2, 3, 4, 5]:
    pass

实际上完全等价于

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

四、装饰器

1、程序扫描到装饰器,默认执行,被装饰的函数名作为参数,保存在装饰器里面,被装饰的函数名被替换成装饰器的返回值
2、被“@函数”修饰的函数不再是原来的函数,而是被替换成一个新的东西(取决于装饰器的返回值)
3、调用被装饰的函数,就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改
4、如果程序中另外还有一个函数,也需要使用装饰器,但是这个新的函数有 2 个参数,此时又该怎么办呢??最简单的解决方式是用 *args 和 **kwargs 作为函数装饰器内部函数的参数,*args 和 **kwargs 表示接受任意数量和类型的参数

import time
def timer(func):
    def wrapper(*args, **kwds):
        t0 = time.time()
        func(*args, **kwds)
        t1 = time.time()
        print('耗时%0.3f' % (t1 - t0,))
    return wrapper

@timer  #do_something=timer(do_something)
def do_something(delay):
    print('函数do_something开始')
    time.sleep(delay)
    print('函数do_something结束')
do_something(3)

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值