列表生成器、生成器函数、装饰器和闭包

列表推导式

import math

import os

1列表推导式

[新元素表达式 for循环 过滤条件]

ls = [i ** 2 for i in range(100) if i % 2 != 0]

print(ls)

ls = [(i, j) for i in range(3) for j in range(3)]

print(ls)

2列表生成器

    generator = (i for i in range(100))

    print(generator)

    print(next(generator))

    print(next(generator))

print(next(generator))

    print(next(generator))

    for item in generator:

        print(item)

    ls = (i for i in range(15))

    print(ls)

   生成器可以简单理解为就是一个数学公式,当我们用到某个值的时候,他才会去临时的计算出该元素的值

 特点:

 1.内存占用低

 2.可以表示无线序列

 3.内部有保存状态的隐变量

 缺点

 不能直接返回中间的值,只能通过next函数或者循环遍历来获取值

3、练习

 写除100以内的偶数的列表推导式、列表生成器

    ls = [i for i in range(101) if i % 2 == 0]

    generator = (i for i in range(101) if i % 2 == 0)

    print(ls[12])

    print(next(generator))

字符串s1=‘ABC,字符串s2=‘123’,要求:生成序列 A1 A2 A3 B1 B2 B3 C1 C2 C3

    ls = [i + j for i in 'ABC' for j in '123']

    print(ls)

 找出1~10之间所有偶数,返回一个列表,包含以这个偶数为半径的圆的面积

    ls = [i ** 2 * math.pi for i in range(11) if i % 2 == 0]

    print(ls)

 打印出C盘下面的子文件,过滤出以.log结尾的文件

    ls = [f for f in os.listdir("C:/") if f.endswith(".lgo")]

    print(ls)

生成器函数 使用yield关键字来返回结果

import time

1.def my_generator():

    first = 1

    second = 1

    while True:

        yield first, second

        first, second = first + second, first + 2 * second

gen = my_generator()

for i in gen:

print(i)

闭包就是函数中的函数

①在函数中写一个内部函数,这个内部函数就是闭包

②闭包函数要使用外部函数的局部变量

③外部函数要将闭包函数作为返回值

 def outer():

     a = 0

     def inner():

         nonlocal a   声明使用外部函数的局部变量

         a += 1

         return a

     return inner

(1)闭包使用的场景1,当我们想要在函数以外使用函数中的局部变量时,我们可以是使用闭包

 fn = outer()

 print(fn())

 print(fn())

 print(fn())

 print(fn())

(2)闭包使用的场景2,当需要一个函数工厂时,就可以使用闭包。所谓的函数工厂,既可以生产函数也可以修改函数

password = "123123"

def fun_factory(fn):

    def product(num):

        pwd = input("请输入交易密码")

        if pwd == password:

            fn(num)

        else:

            print("交易密码错误")

    return product

@fun_factory  buy = fun_factory(buy)

def buy(num):

    print(f"已购买{num}手股票")

@fun_factory  sell = fun_factory(sell)

def sell(num):

    print(f"已售卖{num}手股票")

(3)通过创建闭包函数实现函数修改的功能

 buy = fun_factory(buy)

 sell = fun_factory(sell)

buy(1000)

sell(999)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值