迭代器

一.函数名的应用

  函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数

 1.函数名的内存地址

1
2
3
4
deffunc():
print("呵呵")
print(func)
结果: <function func at0x1101e4ea0>

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

1
2
3
4
deffunc():
print("呵呵")
print(func) a=func# 把函数当成一个变量赋值给另一个变量
a()# 函数调用 func()

  3.函数名可以当做容器类的元素

1
2
3
4
5
6
7
8
9
10
11
deffunc1():
print("呵呵")
deffunc2():
print("呵呵")
deffunc3():
print("呵呵")
deffunc4():
print("呵呵")
lst=[func1, func2, func3]
foriinlst:
i()#调用函数

  4.函数名可以当做函数的参数

1
2
3
4
5
6
7
deffunc():
print("吃了么")
deffunc2(fn):
print("我是func2")
fn()# 执行传递过来的fn
print("我是func2")
func2(func)# 把函数func当成参数传递给func2的参数fn.

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

1
2
3
4
5
6
7
8
9
deffunc_1():
print("这里是函数1")
deffunc_2():
print("这里是函数2")
print("这里是函数1")
returnfunc_2
fn=func_1()# 执行函数1. 函数1返回的是函数2, 这时fn指向的就是上面函数2
fn()# 执行上面返回的函数

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

   好处:  

     1.保护变量不受外界影响

     2.可以让变量常驻内存

1
2
3
4
5
6
7
deffunc1():
name="alex"
deffunc2():
print(name)# 闭包
func2()
func1()
结果: alex

  可以使用__closure__来检测函数是否是闭包.返回cell就是闭包,返回None就不是闭包.

1
2
3
4
5
6
7
deffunc1():
name="alex"
deffunc2():
print(name)# 闭包
func2()
print(func2.__closure__)# (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
func1()

  在函数外部调用内部函数

1
2
3
4
5
6
7
defouter():
name="alex"# 内部函数
definner():
print(name)
returninner
fn=outer()# 访问外部函数, 获取到内部函数的函数地址
fn()# 访问内部函数

  多层嵌套时,一层一层返回即可

1
2
3
4
5
6
7
deffunc1():
deffunc2():
deffunc3():
print("嘿嘿")
returnfunc3
returnfunc2
func1()()()

  Python中规定,如果你在内部函数中访问了外层函数中的变量,那么这个变量将不会消亡,将会常驻内存中.

  三.迭代器

    可迭代对象:Iterable,里面有__iter__()可以获取迭代器,没有__next__()

    迭代器: Iterator,里面有__iter__()可以获取迭代器,还有__next__()

    迭代器的特点:

      1.只能向前

      2.惰性机制

      3.省内存(生成器)

    可以通过dir函数查看类中定义好的方法

1
2
3
4
s="我的哈哈哈"
print(dir(s))# 可以打印对象中的方法和函数
print(dir(str))# 也可以打印类中声明的方法和函数

  可迭代对象可以使用for循环

  打印的结果中能找到__iter__函数,则是可迭代对象

  也可以通过isinstance()函数查看对象是不是可迭代对象

1
2
fromcollectionsimportIterable# 可迭代对象
fromcollectionsimportIterator# 迭代器
lst = ["alex为什么这么帅","我不信","你们信吗?"]
1
print(isinstance(lst, Iterable)) <br>print(isinstance(lst, Iterator))

  可迭代对象可以通过.__iter__()获取迭代器

  for循环的内部机制

    1.首先获取到迭代器.

    2.使用while循环获取数据

    3.it.__next__()获取数据

    4.处理异常 try: xxx  except StopIteration:

1
2
3
4
5
6
7
8
lst=["alex","wusir","taibai","ritian"]
it=lst.__iter__()# 获取迭代器
while1:
try:# 尝试执行
el=it.__next__()# 获取下一个元素
print(el)
exceptStopIteration:# 处理错误
break

  

优质内容筛选与推荐>>
1、第七周
2、MATLAB 音响系统工具箱
3、什么是消息队列
4、HDU1394 Minimum Inversion Number 线段树
5、WINDOWS MOBILE下如何使用SQLLITE


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn