python11闭包和迭代器

本文围绕Python编程展开,介绍了函数名的应用,它可作为变量,能被赋值、作为参数传递等。还讲解了闭包,即内层函数对外层变量的引用,其能让局部变量常驻内存。此外,阐述了可迭代对象和迭代器,可迭代对象含__iter__(),迭代器含__iter__()和__next__(),迭代器有节省内存等特点。

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

函数名的应用

1.函数名就是一个变量,但他是一个特殊的变量,与括号配合可以执行函数的变量。

def fun():

    print(“你吃了吗?”)

print(fun)# <function func at 0x0000003fe18>

 a = func

print(a)# <function func at 0x0000003fe18>

func()#你吃了吗?

a()         #你吃了吗?

2.

def fun():

    print(“你吃了吗?”)

def a():

    print(“我吃了”)

func = a

func() #我吃了

3.

def f1():

    print(“我是马玉”)

def f2():

    print(“我是马化腾”)

def f3():

    print(“我是马赛克”)

lst = [f1,f2,f3,f4]

for el in lst:

    el()

print(lst)  #打印的是4个内存地址

如果lst = [f1(),f2(),f3(),f4()]

print(lst),那么打印的结果是:

我是马玉

我是马化腾

我是马赛克

[None,None,None,None]

4

可以作为函数的参数

def func(fn):

    fn()

def gn():

   print(“我是火锅”)

func(gn)   #可以把函数作为参数,传递给另一个函数

 

5

def func():

    def inner():

          print("火锅不让吃了,吃了上火”)

      return inner

ret = func() #func执行之后获取到的是inner函数

ret()   #这里是让inner函数执行

闭包

闭包就是内层函数对外层变量的引用

python的基制决定的:闭包的最大作用,让一个局部变量常驻内存

def func():

    name = “alex”   #常驻内存

    def inner():

            print(name)  #在内层函数中调用了外层函数中的变量,叫闭包

     return inner

ret = func()

ret()# alex

1.变量写成全局变量是不安全的

name = “wusir”
def abc():

    global name

    name = “呵呵”

abc()

#这样那么被abc函数修改成了呵呵

2.写成闭包后的效果

def func():

    name=“alex”

    def inner():

       print(name)

    def inner2():

        nonlocal name

        name = “wusir”

    return inner

#这样只能在func函数中修改name变量,别人无法修改

3.闭包的好处

举例:爬虫网站

from urlib.request import urlopen

def but():

    content = urlopen("http://www.xiaohua100.cn/index.html").read()

    def get_content():

        return content

    return get_content

fn = but()  #这个时候就开始加载校花100的内容,后面需要用到这里的内容就不需要在执行非常耗时的网络连接操作了

content = fn()#获取内容

print(content)

content2=fn()#重新获取内容

print(content2)

 

 

迭代器

可迭代对象: str,list,tuple,set,file,dict,这里面只有file是迭代器

所有的以上数据类型中都有一个函数:__iter__(),那么所有包含__iter__()的数据类型都是可迭代的数据类型。Iterable

s = “北京欢迎您”

for i in s:

    print(i)

for i in 123:

    print(i)  #   int object is not iterable  
 

2, lst = [“皇阿玛”,“皇额娘”,“紫薇”]

it = lst.__iter__()   #__iter__()的作用:获取迭代器

print(it.__next__())  #使用迭代器进行迭代,获取第一个元素,皇阿玛

print(it.__next__())  #皇额娘

print(it.__next__())  #紫薇

print(it.__next__())  #迭代到最后一个元素之后,在进行迭代就报错了。stopiteration

3.lst = [“皇阿玛”,“皇额娘”,“紫薇”]

it = lst.__iter()__

while True:

    try:

           name = it.__next__()

           print(name)

     except StopIteration:

           break

4.

迭代器和可迭代对象是两回事

迭代器里面也有__iter__()函数,还有一个函数__next__(),所以说迭代器是可迭代对象

 

lst=【1,2,3】

print(“__iter__” in dir(lst))#True,确定是一个可迭代的

print(“__next__” in dir(lst))#False,确定不是一个迭代器

 

isinstance(对象,类型),判断xx对象是否是xxx类型

from collections import Iterable  #可迭代的

from collections import Iterator  #迭代器

print(isinstance(lst,Iterable)) #确定是否是一个可迭代的  True

print(isinstance(lst,Iterator)) #确定是否是一个迭代器   False

5.

it = lst.__iter__() #这个时候it是个迭代器

print(isinstance(it,Iterable))  #判断是否是可迭代的 迭代器一定是可迭代的。True

print(isinstance(it,Iterator))#迭代器里面一定有__next__(),__iter__()

 

一个对象,如果是可迭代的,那么他不一定是迭代器;如果他是迭代器,那么一定是可迭代的,因为迭代器里面有__iter__()

迭代器的特点:

1.节省内存

2.惰性机制

3.不能反复,只能向下执行

 

可迭代对象(Iterable):内部含有__iter__();str list dict set tuple

迭代器(Iterator):内部含有__iter__()和__next__() ;  f  range

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值