day 11 第一类对象、闭包、迭代器

 

课上总结

一.函数名的使用以及第一类对象

1.什么是第一类对象?

在创建一个函数的时候,这个函数就是第一类对象,函数对象可以向变量一样进行赋值操作,还可以作为列表的元素一样使用. 第一类对象 -> 函数名 -> 变量名

比如:  

def func():
    print("我叫第一类对象")

a = func
print(a)  #<function func at 0x00000000004C1E18>   #打印的是内存地址

a() # 我叫第一类对象        #函数名可以进行赋值


func = 666
print(func)  ###坑###  结果还是666,这里的func被赋值给666

 

2.函数名可以放在一个列表里多次调用

def func1():
    print("朱元璋")
def func2():
    print("朱祁镇")
def func3():
    print("王阳明")
def func4():
    print("魏忠贤")
lst = [func1,func2,func3,func4]

lst[0]()  #结果:朱元璋       #单个函数调用

for i in lst:
    i()   #结果:             #用for循环实现多个函数调用
                朱元璋
                朱祁镇
                王阳明
                魏忠贤

 

 

3.在外面调用内部函数

def warpper():
    def inner():
        print("哈哈哈")
    return inner   #return返回给上一级的调用者warpper, inner后面不能加括号"()",这样的话函数没有返回值默认返回None,而且还是只能通过外层函数才能调用
ret = warpper()()  #结果:哈哈哈  #后面两个括号代表,执行inner函数返回给warpper函数的函数名,让warpper可以在外面直接调用嵌套的函数

 

 

4.函数可以作为"实参"多次调用,作为一个代理来使用,有点类似于装饰器的雏形.

def func1():
    print("谢晋")
def func2():
    print("朱元璋")
def func3():
    print("朱友文")


#定义一个函数作为代理来使用,实现函数可以作为是 "实参" 多次调用.
def proxy(a):
    print("我是代理")
    a()
    print("代理执行完毕")

proxy(func1)            
proxy(func2)
proxy(func3)
#结果
   我是代理
   谢晋
    代理执行完毕
     我是代理
     朱元璋
     代理执行完毕
     我是代理
     朱友文
     代理执行完毕

 

 

 二.闭 包

 

1.什么是闭包?

 闭包就是内层函数对外层函数的使用.

 

 

2.闭包的优点:

      保护变量不被侵害

      让变量常驻内存,方便下次调用,能够更快的展示

 闭包的缺点:

      如果内存过大,可能导致内存溢出,或者内存被撑爆.

 

 

3.闭包的应用场景:

目前已知爬虫,可以把一个url放入一个变量内,下次访问这个url时就会走本地缓存,快速访问.

 

三.迭代器

迭代器一定是可迭代的,可迭代的不一定是迭代器. 

例:

from collections import Iterable,Iterator
#Iterable:可迭代对象
#Iterator:迭代器


#
lst = [1,2,3]
print(isinstance(lst,Iterable)) #判断是不是可迭代对象   #True   是可迭代类型的
print(isinstance(lst,Iterator)) #判断是不是迭代器 #False 不是迭代器

it = lst.__iter__()   #把数据转换成"对象".__iter__"再判断就是一个迭代器.
print(isinstance(it,Iterable)) #判断是不是可迭代对象   #True   是可迭代类型的
print(isinstance(it,Iterator)) #判断是不是迭代器       #True  是迭代器

 

1.什么是迭代器?

把一组可迭代的数据进行重新赋值为 >>>> "对象"."__iter__"<<<<,然后用  >>>>"对象".__next__()<<<<  一个一个往外拿值.迭代器是惰性机制的,只能一个一个的往外拿值,当值被拿完就不能再拿,不然会报错,为了防止拿完数据抛异常,可以用  ""try""来处理.

lst = ["张无忌","张三丰","张子龙"]
li = lst.__iter__()

#这里执行了两次__next__()所以只会拿到两个元素
print(li.__next__())
print(li.__next__())        

#结果
张无忌
张三丰

 

 

2.查看一个数据类型是否是可迭代对象和迭代器

方法 1. 用dir来查看,只要是有   ""__iter__""  的都是可迭代对象,都可以用for循环

一个数据类型中包含了__iter__函数表示这个数据是可迭代的
dir(数据): 返回这个数据可以执行的所有操作

print("__iter__" in dir(list))   #只要结果是True的都是可迭代对象

方法2,官方通过代码判断一个对象是否是迭代器

借助于两个模块 Iterator:迭代器,Iterable:可迭代的.

 

from collections import Iterable,Iterator
#Iterable:可迭代对象
#Iterator:迭代器

lst = [1,2,3]

print(isinstance(lst,Iterable)) #判断是不是可迭代对象   #True   是可迭代类型的
print(isinstance(lst,Iterator)) #判断是不是迭代器       #False  不是迭代器

it = lst.__iter__()   #把数据转换成"对象".__iter__"再判断就是一个迭代器.
print(isinstance(it,Iterable)) #判断是不是可迭代对象   #True   是可迭代类型的
print(isinstance(it,Iterator)) #判断是不是迭代器       #True  是迭代器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/yanpeizhang/p/10251703.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值