天天看点

python 第一类对象 闭包 迭代器

def fn():

    print("我叫fn")

fn()

print(fn)## <function fn at 0x0000000001D12E18>

fn()

gn = fn #函数名可以进行赋值

print(gn)# <function fn at 0x0000000001D12E18>

gn()

fn = 666

print(fn) #666

def func1()

    print("朱祁镇")

def func2()

    print("徐杰")

def func3():

    print("王阳明")

def func4():

    print("魏忠贤")

lst = [func1,func2,func3,func4]#函数+() 就是调用

print(lst)

lst[0]()

for el in lst:  #el是列表中的每一项

    el() #拿到的是函数.  执行函数

def wrapper():

    def inner():

        print("哈哈哈")

    return inner#函数名可以像返回值一样返回

ret = wrapper()  #接收的是inner函数

ret() #调用函数inner  在函数外面访问了函数内部的函数

函数可以作为参数进行传递

def func1():

    print("谢晋")

def func2():

    print('杨士奇')

def func3():

    print('徐渭')

def func4():

    print("柳如是")

#代理.装饰器的雏形

de proxy(a)

    print("我是代理")

    a()

    print("代理执行完毕")

proxy(func1)

proxy(func2)  #将函数当做参数进行传参

闭包

闭包的优点

1.可以保持变量不被其他人侵害

2.保持一个常量常驻与内存

def wrapper():

    a = "哈哈" #如果把a放到全局作用域是不安全的一种写法,因为好多内容用着同一个变量,则把它放到一个局部作用域中

    name = "周杰伦"

    def inner

        print(name)#在内层函数中使用了外层的函数的局部变量 

        print(a)

    return inner  #返回函数名

ret = wrapper()  #ret是inner函数

ret()  #调用函数

def wrapper():

    name = "周杰伦"  #局部变量常驻与内存

    def inner():

        print(name) #在内层函数中使用外层函数的局部变量

    return inner  #返回函数名

        #inner()

ret = wrapper()  #ret是一个内层函数

ret()  #ret是inner,执行的时机是不确定的,必须保证里边的name是存在的

#超级简单的爬虫

from urllib.request import urlopen  #导入一个模块

def func():

        #获取到网页中的内容,当网速很慢的时候.反复的打开这个网站 很慢

    content = urloppen("https://www.dytt8.net/").read()

    def inner():

        return  content.decode("gbk")  #网页内容

    return inner

print("开始网络请求")

ret = func()  #网络请求已经关闭

print("网络请求完毕")

print("第一次",ret())

print("第二次",ret()) #加载到内存  不用每次都进行网络请求 直接进行内存的调用  但是变量多的话  内存可能撑不下 

def wrapper():

    name = "alex"

    def inner():

        print("name")

    print(inner.__closure__)  #查看是否闭包.有内容就是闭包,没有内容就不是闭包

    inner()

wrappe()

迭代 

s = "今天下午考试,你们还要睡觉吗 "

for c in s: #字符串是一个可迭代对象

    print (c)

for i in 123: # 'int' object is not iterable整型是不可以迭代的

    print(i)

dir(对象)  #可以帮我们查看xxx数据能够执行的操作

print(dir(str))  #__iter__  

字符串 列表 字典 元组 集合 是可以迭代的  

int 和 bool 是不可以迭代的

共性:所有带有__iter__的东西可以进行for循环,带有__iter__的东西就是可以迭代的

lst = ["贾樟柯", "李安", "杨德昌", "王家卫"]

it = lst.__iter__() #拿到的是迭代器 

print(it.__next__()) #下一个

print(it.__next__()) #下一个

print(it.__next__()) #下一个

print(it.__next__()) #下一个

print(it.__next__()) #下一个 会报错  stopinteration  停止迭代

##想回去只能重新获得迭代器

1.只能项下执行,不能反复

2.结束的时候会扔给我们一个错误  stopiteration

3.整合所有的数据类型进行遍历 (int,bool除外)

用while循环来模拟for循环

it = list.__iter__()

while 1:

        try:

            el = it.__next__:  #拿数据

            print(el)

        except stopiteration:  #出现错误说明数据拿完了 

            break  #退出循环

官方通过代码判断是否是迭代器

借助于两个模块  Iteration 迭代器,iterable 可迭代的

from collections import iterable,iterator

lst = [1,2,3]

print(lst.__next__())

print(isinstance(lst, Iterable)) # xxx是否是xxx类型的. True

print(isinstance(lst, Iterator)) # False

迭代器一定是可迭代的,可迭代的东西不一定是迭代器

isinstens(参数,iterable)  判断xxx是不是某某类型