day11-2018-10--31 第一类对象.闭包,迭代器
# def __(): # pass # __() # a = 10 # b = a # print(b) # def a(): # print("我是可怜的a") # # b = a # print(b) # # b() # 可以正常的使用 # def func1(): # print("我是可怜的func1") # # def func2(): # print("我是可怜的func2") # # def func3(): # print("我是可怜的func3") # # lst = [func1, func2, func3] # # print(lst) # for el in lst: # el() # # def outer(): # def inner(): # print("我是可怜的inner") # # return inner # 函数名可以作为返回值 # # # ret = outer() # ret() # 代理模式 # 装饰器的雏形 # 把函数名当成变量来使用 def chi(fn): # fn 代理了func1和func2 print("开挂") fn() print(fn.__name__) print("洗包") def play_dnf(): print("疯狂的刷") def func1(): print("我是func1") def func2(): print("我是func2") def he(): print("我要喝酒") chi(he) # def outer(): # def inner(): # print("哈哈") # return inner # outer()() if __name__ == '__main__': bs = b'é\x9d\x9e常æ\x8a±æ\xad\x89ï¼\x8cæ\xad¤æ¬¡æ´»å\x8a¨é¢\x86å\x8f\x96次æ\x95°å·²è¾¾æ\x9c\x80大ï¼\x8cä¸\x8dè\x83½é¢\x86å\x8f\x96ï¼\x81' print(bs.decode("gbk"))
# 保护我们的变量 # 必须是局部变量 # a = 10 # 全局的东西都是不安全的 # # def func1(): # print(a) # # def func2(): # print(a) # # func1() # # # 你的同事搞事情 # def func3(): # global a # a = 20 # # func3() # # func2() # def func(): # a = 10 # 安全的 # def func2(): # print(a) # def func3(): # print(a) # def func4(): # nonlocal a # a = 20 # 闭包: 内层函数对外层函数的变量的使用 # 作用: # 1. 保护我们的变量不受侵害 # 2. 可以让一个变量常驻内存. # def outer(): # # a = 10 # def inner(): # print("哈哈") # print(inner.__closure__) # (<cell at 0x000001C079677588: int object at 0x0000000054776D30>,) # return inner # # ret = outer() # # 1800行代码... # ret() # 由于inner函数执行的时机是不确定的. 必须要保证innter可以正常执行. 必须把a保留到最后 # # 爬虫 (low版本) # from urllib.request import urlopen # 打开一个连接用的模块 # # 外层函数 # def but(): # # 打开连接. 读取源代码 # content = urlopen("http://www.cctv.com/").read() # 永久驻留在内存 # # 内层函数 # def get_content(): # # 返回content # return content # return get_content # 内层函数 # # fn = but() # 这里会很慢. 需要网络请求 # print(fn()) # 不会再进行网络请求了 # print(fn()) # 关联的小点 # def func(a, b): # ''' # 文档注释 # 这个函数用来计算两个数的和并返回 # :param a: 第一个数 # :param b: 第二个数 # :return: 第一个数和第二个数的和 # author:sylar # date:2018-10-31 # ''' # print("我是func") # return a + b # print(func.__doc__) # document 文档注释 # print(func.__name__) # name 名字 获取函数名 def func1(): def func2(): def func3(): print("嘿嘿") return func3 return func2 func1()()() # 迭代器 def func(): a = 10 def aa(): print("哈哈") return aa ret = func() ret() # 天行健, 君子以自强不息 -> 飞龙在天 -> 易经 -> 乾 # 地势坤, 君子以厚德载物 -> 亢龙有悔 -> 易经 -> 坤 # 最早的二进制 # 百分之百准 -> 周易江湖 # 苏武牧羊 # 结果: 不好. # 物极必反 # 庄子 # 鬼谷子 -> 厚黑学 # 做好人
# print(dir(str)) # 查看str能够执行的操作. 内部的方法 # __iter__ 字符串可以被迭代. 发现了__iter__ # print(dir(list)) # print(dir(open("x",mode="w"))) # int中没有__iter__ # 简单的下一个结论. 主要这个数据类型可以执行__iter__ 可以被迭代的数据类型 # lst = ["汉高祖", "清高祖", "明高祖", "哈哈", "娃哈哈", "爽歪歪"] # it = lst.__iter__() # <list_iterator object at 0x000001ED54B17128> iterator 迭代器 # print(it) # print(dir(it)) # 迭代器本身是可迭代的 # 可以使用__next__获取数据 # print(it.__next__()) # 汉高祖 # print(it.__next__()) # 清高祖 # print(it.__next__()) # 明高祖 # print(it.__next__()) # 明高祖 # print(it.__next__()) # 明高祖 # print(it.__next__()) # StopIteration 迭代器中没有元素了. # for循环内部的代码 # it = lst.__iter__() # 获取新的迭代器 # while 1: # try: # el = it.__next__() # print(el) # except StopIteration: # print("结束了") # break # 三个特点: # 1. 节省内存 (生成器) # 2. 惰性机制, 必须用__next__()来获取数据 # 3. 只能往前. 不能后退 # it = lst.__iter__() # print(it.__next__()) # print(it.__next__()) # print(it.__next__()) # print("回去") # it = lst.__iter__() # 重新获取迭代器 # print(it.__next__()) # list(内部有for循环) # for内部 迭代器 # lst = [1,55,5,55,5,5,5,555,55,555] # ll = list(set(lst)) # print(ll) # # # list(1) # 'int' object is not iterable # 如何判断一个数据是否是可迭代对象 # 1. dir() -> __iter__ 可迭代的 # dir() -> __next__ 迭代器 # lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"] # print("__iter__" in dir(lst)) # True 可迭代的 # print("__next__" in dir(lst)) # False 不是迭代器 # # print("__iter__" in dir(int)) # print("__next__" in dir(int)) # # it = lst.__iter__() # 迭代器 # print("__iter__" in dir(it)) # True 迭代器本身就是可迭代的 # print("__next__" in dir(it)) # True lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"] # collections 关于集合类的相关操作 # Iterable : 可迭代的 # Iterator : 迭代器 from collections import Iterable, Iterator print(isinstance(lst, Iterable)) # True print(isinstance(lst, Iterator)) # False print(isinstance({1,2,3}, Iterable)) # True, 可以使用for循环