函数名,函数的闭包和迭代器

#1函数名
def chi():
    print("吃月饼")
print(chi)
fn = chi # 函数名可以进行赋值
a = 10
b = a
chi()
fn()
# 函数名可以像变量名一样进行使用


def func1():
    print("我是一个单纯的函数")

def func2(abc): # abc接收到的是一个函数的内存地址
    abc()  # 执行func1, func1()
    print("我是func2", abc)

# a = "苹果"

func2(func1) # func1是函数的内存地址, 函数名可以像变量一样进行参数的传递


def outer():
    def inner():
        print("我是里面")
    return inner

outer()() # ()表示的是执行
ret = outer() # outer得到的结果是inner
ret() # 执行的是inner函数

a = "周润发"
b = "蓝洁瑛"
c = "春三十娘"
d = "简直了"

lst = [a, b, c, d]
for el in lst:
    print(el)

def chi():
    print("吃饭")
def he():
    print("喝饮料")
def du():
    print("赌是不好的")
def chou():
    print("少抽点烟")

lst = [chi, he, du, chou]
for el in lst:
    el()

a = 10
print(a + 20)

# 错误的
# def a():
#     pass
# print(a + 10)
#
def panpan():
    print("我是潘潘. 我喜欢毒丈夫 ")

def xiaoping():
    print("我是小萍萍. 我喜欢毒丈夫 ")

def xiaohua():
    print("我是小花花. 我喜欢毒丈夫 ")

def daguanren():
    print("大官人喜欢xxxx")

def wangpo(nv, nan): # 核心业务逻辑
    nv()
    nan()

wangpo(xiaohua, daguanren) # 王婆代理了大官人和潘潘


def chi():
    print("我是吃")

a = chi
haha = a
hehe = haha
bilibili= hehe

bilibili()
print(bilibili.__name__) # 函数名

def play(wanjv1, wanjv2, wanjv3):
    '''
        玩儿函数
        :param wanjv1: 玩具1
        :param wanjv2: 玩具2
        :param wanjv3: 玩具3
        :return: 开心
    '''
    print("我要玩儿荡秋千")
    return "开心"


# play("独木桥", "独轮车", "独眼龙")
print(play.__doc__) #  document
print(str.join.__doc__)


#2闭包函数
# 用闭包可以保护我们的变量
# 写法: 在外层函数中声明一个变量. 在内层函数使用或者返回这个变量.
# 这个结构叫闭包
# 1.可以保护我的变量
# 2.可以让一个变量常驻内存

def outer():
    a = 10 # 常驻内存
    def inner():
        print(a) # 在内部使用的外面的变量
    return inner # 返回了内部函数


# ret是inner的地址. ret就是inner
ret = outer()
ret() # 这里执行inner()
print("哈哈")
print("哈哈")
print("哈哈")
ret() # inner的执行时间是不确定的
print("哈哈")
print("哈哈")
print("哈哈")
ret() # inner的执行时间是不确定的

def haha():
    pass
print(ret.__closure__) # 有东西, 就是闭包. None就不是闭包

# 闭包的应用.保护变量, 常驻内存
from urllib.request import urlopen

def func():
    # 闭包. content会常驻内存
    content = urlopen("http://www.xiaohuar.com/").read()
    def inner():
        return content
    return inner

print("加载中...")
g = func() # 网络请求
print("加载完毕")
print(g())
print(g())
print(g())


#3迭代器

for c in 123:
    print(c)


# iterable 可迭代的, str, list. tuple, dict, set, open(), range()
# dir() 可以查看某数据类型中可以执行的方法
s = "alex"
print(dir(s)) # 在字符串中发现了__iter__. 没有__next__
a = 123
print(dir(a)) # 在int中没有__iter__ 没有__next__
lst = [1, 2, 3,]
print(dir(lst)) # 在list中也有__iter__
# 
# 所有包含了__iter__的东西都可以使用for循环. 都可以进行迭代
# 迭代器, 在for循环内部. 调用了__iter__(), 访问__iter__()可以得到迭代器
lst = [1, 2, 3, 4, 5, 6]

it = lst.__iter__()  # iterator 迭代器
while 1:
    try:
        print(it.__next__())
    except StopIteration:
        print("结束了")
        break

for el in lst:
    print(el)
else:
    print("结束了")


# 迭代器给所有的数据类型提供了一种统一的遍历的方式(可迭代协议), Iterable, __iter__()
lst = [1, 2, 3, 4, 5]
# print("__iter__" in dir(lst))
# print("__next__" in dir(lst))

it = lst.__iter__()
# print("__iter__" in dir(it)) #  迭代器里面是有__iter__的.  迭代器一定是可迭代的
# print("__next__" in dir(it))

for el in it: # 迭代器可以使用for循环
    print(el)

# 小总结
# Iterable: 可迭代对象. 里面包含了__iter__(),可以使用for循环
# Iterator: 迭代器. 里面包含了__iter__() 和 __next__(), 也可以使用for循环

from collections import Iterable # 可迭代的
from collections import Iterator # 迭代器

lst = ["周润发","麻花藤","刘伟"]
print(isinstance(lst, Iterable)) # instance  实例, 对象
print(isinstance(lst, Iterator)) # instance  实例, 对象

it = lst.__iter__()
print(isinstance(it, Iterable)) # instance  实例, 对象
print(isinstance(it, Iterator)) # instance  实例, 对象

 # 总结
 # 特点:
 #  1. 节省内存
 #  2. 惰性机制
 #  3. 只能向前. 不能反复

lst = [1,2,3]
it = lst.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())

# 重新拿一个迭代器
it = lst.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())

  

 

posted @ 2018-09-17 23:56  冒蓝火的加特林哒哒哒  阅读(222)  评论(0编辑  收藏  举报