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'éx9dx9e常æx8a±æxadx89ï¼x8cæxad¤æ¬¡æ´»åx8a¨é¢x86åx8fx96次æx95°å·²è¾¾æx9cx80大ï¼x8cä¸x8dèx83½é¢x86åx8fx96ï¼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循环
原文地址:https://www.cnblogs.com/VastTry/p/9883138.html