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是不是某某类型
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄
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是不是某某类型

更多精彩