列表推导式
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)