python之路-day11-迭代器闭包

 

一 、 函数名的运用

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

  1、函数名的内存地址

  

  def func():

    print("呵呵")

  print(func)

  结果:

  <function func at 0x1101e4ea0>

  

  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、函数名可以当做函数的参数

  

  

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

  

       

二、闭包

 1、 什么是闭包?闭包就是内层函数,对外层函数(非全局)的变量的引用。叫闭包

  def func1():

    name = "alex"

    def func2():

      print(name)    # 闭包

    func2()

  func1()

  结果:

  alex

    

2、我们可以使用__closure__来检测函数是否是闭包.使用函数名.__closure__
返回cell就是闭包。返回None就不是闭包
def func1():
name = 'alex'
def func2():
print(name)
func2()
print(func2.__closure__)
func1()
结果:(<cell at 0x00000248D5C77618: str object at 0x00000248D5D07068>,)

 3、如何在函数外边调用内部函数

def outer():

  name = 'alex'

  # 内部函数

  def inner()

    print(name)

  return inner

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

fn()         # 访问内部函数

 

4、总结

  闭包:在内层函数中引入外层函数的变量

  作用:

    1、保护变量不收侵害

    2、让一个变量常驻内存

三、迭代器

   dir() 查看变量能够执行的方法(函数)

   Iterator : 迭代器,   __iter__(), __next__()

   Iterable:可迭代的  __iter__()

   for循环的流程:

   it = lst.__iter__()

   while 1:

     try:

       el = it.__next__()

             for循环的循环体

      except StopIteration:

         break

   # 从迭代器中获取数据的唯一方法: __next__()

   三个特征:

    1、省内存

    2、惰性机制

    3、只能往前。不能退后

#  如何判断一个数据是否是可迭代对象
# 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循环

猜你喜欢

转载自www.cnblogs.com/alvin-jie/p/9885182.html
今日推荐