函数(三)

1.函数名的应用(第一类对象)

  函数名的命名规范和变量是一样的

  函数名其实就是变量名

  1.可以作为列表中的元素进行存储

    

1 def func1():
2     pass
3 def func2():
4     pass
5 lst = [func1,func2]
6 for el in lst:
7     el()

  2.可以作为参数传递给函数

 

1 def fun():
2     pass
3 def proxy(fn):
4     fn()
5 proxy(func)

  3.可以作为函数的返回值

1 def fun():
2     def inner():
3         pass
4     return inner
5 fun()()

2.闭包

闭包:在内层函数中访问外层函数的局部变量

好处:

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

  2.可以让变量常驻内存

  3.写法:

    

1 def outer():
2     a =  10
3     def inner():
4         print(a)
5     return inner

3.迭代器

使用dir来查看该数据包含了哪些方法

1 print(dir(str))#有__iter__
2 print(dir(int))#没有__iter__
3 print(dir(list))#有__iter__

4 print(dir(tuple))#有__iter__

用来遍历字符串,列表,元组...等可迭代对象

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

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

所有的带__iter__可以使用for循环,是可迭代对象

可迭代对象可以使用__iter__()来获取迭代器,迭代器里面有__next__()


迭代器的特点:

  1.只能向前

  2.惰性机制

  3.省内存(生成器)

迭代器模拟for循环:

  

 1 lst = [1,2,3,4,5]
 2 for el in lst:
 3     print(el)
 4 
 5 lst = [1,2,3,4,5]
 6 it = lst.__iter__()#获取迭代器
 7 while 1:
 8     try:#尝试执行
 9         el = it.__next__()
10         print(el)
11     except StopIteration:#处理错误
12         break

通过dir来判断数据是否是可迭代的,以及数据是否是迭代器

1 print("__iter__" in dir(it))
2 print("__next__" in dir(it))

通过isinstance()来判断

1 from collections inport Iterable#可迭代对象
2 from collections import Iterator#迭代器
3 
4 
5 print(isstance(lst,Iterable))
6 print(isstance(lst,Iterator))

把参数放在list()里面进行迭代

1 lst = [1,2,3,4,5]
2 it = lst.__iter__()
3 s = list(it)
4 print(s)

结果为[1,2,3,4,5]

for 循环的内部机制:

  1.首先获取到迭代器

  2.使用while循环获取数据

  3.it.__next__()来获取数据

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

  

1 it = xx.__iter__()
2 while 1:
3     try:
4         data = it.__next__()
5         xxx
6     except StopIteration:
7         break
原文地址:https://www.cnblogs.com/s593941/p/9455775.html