闭包/迭代器/生成器

#函数名可以作为参数传递给函数
#闭包,在内层函数中访问外层函数的变量
#闭包的作用:
#1.可以保护你的变量不受侵害
#2.可以让一个变量常驻内存
def outer():
a = 10#常驻内存,为了inner执行的时候有值
def inner():
print(a)
return inner
fn = outer()
fn() #d调用的时机是不定的

#超简易爬虫
from urllib.request import urlopen
def outer():
#常驻内存
# s = urlopen(“http://www.”).read()
# def getContent(): #闭包
# return s
# return getContent

#如何查看是否是闭包
def func():
a = 10
def inner():
print(a)
print(inner.closure) #如果打印的是None,不是闭包
func()

print(dir(str)) #dir可以查看XX类型的数据可以执行的方法
#可迭代对象可用__iter__()来获取到迭代器
#1.只能向前
#2.几乎不占内存,节省内存
#3.for循环
#4.惰性机制

#迭代器模拟for循环
lst = [“AA”,“BB”,“CC”]
it = lst.iter() #获取迭代器
while 1:
try: #尝试执行
el = it.next() #获取下一个元素
print(el)
except StopIteration: #处理错误
break

#判断是否是可迭代对象或者迭代器
from collections import Iterable #可迭代对象
from collections import Iterator #迭代器
print(isinstance(Ist,Iterable))
print(isinstance(Ist,Iterabtor))

n = 6
for i in range(1,n+1):
for k in range(2n-2i):
print("",end=" “)
for j in range(2i-1):
print("
”,end=" ")
print()

#枚举
lst =[‘a’,‘b’,‘c’,‘d’,‘e’]
for index,el in enumerate(lst,1):
print(index,el)

1.生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式和迭代器一样(next())
生成器一般由生成器函数或者生成器表达式来创建
生成器其实就是手写的迭代器

def func():
print(“aaa”)
yield 1 #return和yield都可以返回数据
print(“bbb”)
gen = func() #不会执行你的函数,拿到的是生成器
ret = gen.next() #执行函数,会执行到下一个yield
print(ret)
gen.next() #继续执行到下一个yield
#函数中如果有yield,这个函数就是生成器函数,生成器函数()获取的是生成器,不执行函数
#yield:相当于return,可以返回数据,但是yield不会彻底中断函数,分段执行函数

send()和__next__()是一样的,可以执行到下一个yield,可以给上一个yield位置传值,必须给参数
#没有上一个yield,必须使用__next__()

#推导式:用一句话来生成一个列
#语法:[结果 for循环 判断]
#lst = [j for j in range(1,16)]
#print(lst)
#lst = [j for j in range(100) if j % 2 == 0]
#print(lst)

#字典推导式
#语法:{key:vaule for循环 条件刷选}
#[11,22,33,44]=>{0:11,1:22,2:33,3:44}
#lst =[11,22,33,44]
#dic ={i:lst[i] for i in range(len(lst))}
#print(dic)
dic = {0: 11, 1: 22, 2: 33, 3: 44}
dic1 = {dic[i]:i for i in dic}
print(dic1)

#没有元组推导式
tu = (i for i in range(10)) #生成器
print(tu.next())
#特点:
#1.惰性机制
#2.只能向前
#3.节省内存

#三元运算符
a if a > b else b

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包在编程中有很多应用场景,以下是一些常见的例子: 1. 数据封装和私有变量:闭包可以用来创建私有变量,从而实现数据封装和保护。这在模块化编程和面向对象编程中非常有用。 2. 函数工厂:闭包可以用来创建一系列相关的函数,这些函数共享相同的外部变量。这在创建类似于Python中的装饰器或JavaScript中的高阶函数时非常有用。 3. 延迟执行和计时器:闭包可以用来实现延迟执行和定时器功能。例如,在JavaScript中,setTimeout和setInterval函数使用闭包来实现延迟执行和定时器功能。 4. 记忆化(Memoization):闭包可以用来实现记忆化,即缓存函数的计算结果,以便在后续调用中重用。这可以提高函数的性能,特别是在处理计算密集型任务时。 5. 事件处理和回调函数:在JavaScript等事件驱动的编程环境中,闭包常用于实现事件处理和回调函数。闭包可以捕获事件处理函数的上下文,使得事件处理函数可以访问其所需的外部变量。 6. 部分应用(Partial Application)和柯里化(Currying):闭包可以用来实现部分应用和柯里化,这是一种将多参数函数转换为一系列单参数函数的技术。这可以简化函数调用,使得代码更加简洁和可读。 7. 实现迭代器生成器:在某些编程语言中,例如Python和JavaScript,闭包可以用来实现迭代器生成器,这是一种用于遍历数据结构的高效方法。
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值