迭代器

 

# 一.函数的运用

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

# 1.函数名的内存地址

# def func():

#     print('呵呵')

# print(func)

# 执行结果:

# <function func at 0x0000014BD10398C8>

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

# def func():

#     print("呵呵")

# print(func)

# a = func    # 把函数当成⼀一个变量量赋值给另⼀一个变量量

# a()     # 函数调⽤用 func()

# 3.函数名可以单座容器类元素

# def func1():

#     print("呵呵")

# def func2():

#     print("呵呵")

# def func3():

#     print("呵呵")

# def func4():

#     print("呵呵")

# lst = [func1, func2, func3]

# for i in lst:

#     i()

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

# def func_1():

#     print("这⾥里里是函数1")

#     def func_2():

#         print("这⾥里里是函数2")

#     print("这⾥里里是函数1")

#     return func_2

# fn = func_1()    # 执行函数1.  函数1返回的是函数2, 这时fn指向的就是上面函数2

# fn()             # 执行上面返回的函数

# 5.函数名可以当做函数的参数

# def func():

#     print("吃了了么")

# def func2(fn):

#     print('我是func2')

#     fn           #执行传递过来的fn

#     print('我是func2')

# func2(func())    #把函数func当成参数传递给func2的参数fn

 

 

# 二.什么是闭包?闭包就是内层函数对外层函数(非全局)的变量的引用.

# def func1():

#     name = 'aaa'

#     def func2():

#         print(name)

#     func2()

# func1()

#

# 执行结果:

# aaa

 

# 我们可以使用__closure__来检测函数是否是闭包,使用函数名:__closure__返回cell就是闭包,如果返回的是None就不是闭包.

# def func1():

#     name = "alex"

#     def func2():

#         print(name)     # 闭包

#     func2()

#     print(func2.__closure__)    # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)

# func1()

 

# 问题, 如何在函数外边调⽤用内部函数呢?

 

# def outer():

#     name = "alex"  # 内部函数

#     def inner():

#         print(name)

#     return inner

# fn = outer()   # 访问外部函数, 获取到内部函数的函数地址

# fn()    # 访问内部函数

 

# 那如果是多层嵌套,只需要一层一层的往外返回就行了

# def func1():

#     def func2():

#         def func3():

#             print("嘿嘿")

#         return func3

#     return func2

# func1()()()

# 由于我们在外界可以访问内部函数,那这个时候内部函数访问的时间和时机就不一定了,因为在外部,

# 我可以选择在任意的时间去访问内部函数:

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

# 也就是说使用闭包,可以保证在外层函数中的变量在内存中常驻

# 闭包的好处就是让一个变量能够常驻内存,供后面的程序使用

 

# 三.迭代器

# str, list, tuple, dict, set都是可迭代对象

# iterable表示可迭代的.表示可迭代协议.那么如何进行验证你的数据类型是否

# 符合可迭代协议.我们可以通过dir函数来查看类中定义好的所有方法.

# s = "我的哈哈哈"

# print(dir(s))       # 可以打印对象中的⽅方法和函数

# print(dir(str))     # 也可以打印类中声明的⽅方法和函数

# 在打印结果中. 寻找__iter__ 如果能找到. 那么这个类的对象就是⼀个可迭代对象.

# 我们发现在字符串中可以找到__iter__. 继续看一下list, tuple, dict, set

# print(dir(tuple))

# print(dir(list))

# print(dir(open("小说.txt")))  # ⽂文件对象

# print(dir(set))

# print(dir(dict))

# 我们发现这几个可以进行for循环的东西都有__iter__函数, 包括range也有.

# 这是查看一个对象是否是可迭代对象的第⼀种办法.

# 我们还可以通过isinstence()函数来查看⼀个对象是什么类型的

# l = [1,2,3]

# l_iter = l.__iter__()

# from collections import Iterable

# from collections import Iterator

# print(isinstance(l,Iterable))    #True

# print(isinstance(l,Iterator))    #False

# print(isinstance(l_iter,Iterator))    #True

# print(isinstance(l_iter,Iterable))    #True

# 综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.

# 就可以获取到相应的迭代器. 这里的__iter__是帮助我们获取到对象的迭代器.

# 我们使用迭代器中的__next__()来获取到一个迭代器中的元素.

# 那么之前的for的工作原理到底是什么? 继续看代码

 

# s = "我爱北京天安门"

# c = s.__iter__()    # 获取迭代器

# print(c.__next__())     # 使⽤用迭代器进⾏迭代. 获取一个元素   我

# print(c.__next__())     # 爱

# print(c.__next__())     # 北

# print(c.__next__())     # 京

# print(c.__next__())     # 天

# print(c.__next__())     # 安

# print(c.__next__())     # ⻔

# print(c.__next__())     # StopIteration

 

# for循环的机制:

# for i in [1, 2, 3]:

#     print(i)

# 使用while循环 + 迭代器来模拟for循环

#

# lst = [1,2,3]

# lst1 = lst.__iter__()

# while 1:

#     try:

#         i = lst1.__next__()

#         print(i)

#     except StopIteration:

#         break

 

posted @ 2018-07-18 16:36  恐惧背后  阅读(74)  评论(0编辑  收藏  举报