码迷,mamicode.com
首页 > 其他好文 > 详细

函数名 闭包 迭代器

时间:2018-08-10 21:32:25      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:ret   xiaohua   top   except   turn   lex   next   div   html   

函数名

函数名就是变量;  函数名可以作为参数进行传递

1. 函数名的内存地址

def func():
    print("哈哈")
print(func) #<function func at 0x01CDD4B0>

2. 函数名可以赋值给其他变量

def func():
    print("呵呵")
print(func)

a = func #把函数当成变量 赋值给另一个变量
a() # 函数调用 func()

3. 函数名可以作为列表中的元素进行存储

def func1():
    print("呵呵")
def func2():
    print("哈哈")
lst = [func1,func2]
for el in lst:
    el()#相当于func1()  和func2()

4.函数名可以当做参数

def func():
    print("吃了么")
def func2(fn):
    print("我是func2")
    fn() #执行传递过来的fn
    print("我是func2")
func2(func) #把函数func当做参数传递给func2的参数fn


运行结果: 我是func2 吃了么 我是func2

5.函数名可以作为函数的返回值

def func1():
    print("这里是函数1")
    def func2():
        print("这里是函数2")
    print("这里是函数1")
    return func2
fn = func1() #执行完函数1 返回的是函数2 所以fn 就是func2
fn() #func2()

执行结果:
这里是函数1
这里是函数1
这里是函数2

闭包

1. 闭包就是内层函数对外层函数(非全局)的变量的引用

def func1():
    name = "alex"
    def func2():
        print(name)
    func2()
func1()

结果是 alex

怎么检测函数是不是闭包?
使用函数名 .__closure__返回cell就是闭包, 返回None就不是闭包

def func1():
    name = "alex"
    def func2():
        print(name) # 闭包   alex
    func2()
    print(func2.__closure__) #(<cell at 0x013F55D0: str object at 0x01307420>,)
func1()

2. 如何在函数外调用函数内部的函数呢?

def outer():
    name = "alex"
    def inner():
        print(name)
    return inner
fn = outer() #访问外部函数,获取到内部函数的函数地址
fn()  #访问内部函数
3. 如果是多层嵌套,只需要一层一层的往外层返回就行了
闭包嵌套
def wrapper():
    money = 1000
    def func():
        name = eva
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper() #func
i = f() #func()  i=inner
i() #inner()

4. 闭包函数获取网络应用

from urllib.request import urlopen

def but():
    content = urlopen("http://www.xiaohua100.cn/index.html").read()
    def get_content():
        return content
    return get_content
fn = but() #get_content 返回给but() 所以fn = get_content
content = fn()  #fn()就是get_content(),执行函数得到 content
print(content)

content2 = fn() #重新获取内容
print(content2)

迭代器

lst = ["赵四","花生哥", "天台见"]
it = lst.__iter__()  #获取到迭代器
print(it.__next__()) #取值
print(it.__next__())
print(it.__next__())
print(it.__next__()) #这一行就超过迭代的元素的个数了 所以会报错StopIeration
这里的__iter__是帮助我们获取到对象的迭代器
迭代器中的__next__()用来获取一个迭代器中的元素
可以把要迭代的内容当成子弹,
迭代器__iter__()就是把子弹都装进弹夹中,
发射就是用__next__()把每一个子弹(元素)打出来
也就是说,for循环的时候,一开始是__iter__()来获取迭代器,
后面每次获取元素都是通过__next__()来完成的
迭代器模拟for循环
lst = ["张一宁","石可欣","姚明"] it = lst.__iter__() #获取迭代器 while 1: try: #尝试执行 el = it.__next__() #获取下一个元素 print(el) except StopIteration: #错误处理 break

查看一个对象是否是可迭代对象的方法

from collections import Iterable  #可迭代对象
from collections import Iterator  #迭代器
print(isinstance(A,B))  #判断某个对象 A 是不是 B 类型中的实例

函数名 闭包 迭代器

标签:ret   xiaohua   top   except   turn   lex   next   div   html   

原文地址:https://www.cnblogs.com/kenD/p/9457124.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!