函數名的應用,閉包,迭代器

函數名的應用

函數名其實就是一個變量,命名規範和變量同樣git

變量能夠作的,函數名也能夠作api

a = 10
b = a # 賦值操做
print(b) # 變量a的值賦給了b,因此b=10

def func():
    print("我是一個小小的函數")
a = func #函數名賦給了a
print(a) # a就是func,因此若是想要調用函數就能夠寫成 a()
a()     #我是一個小小的函數
func() #我是一個小小的函數
#以上 a和func的做用是同樣的

#也能夠拿來作變量能夠作的事,好比for遍歷
def func1():
    print("我是1")
def func2():
    print("我是2")
def func3():
    print("我是3")

lst = [func1, func2, func3]
for el in lst:
    el() >>>#el就是列表中每一個函數名因此結果就是依次調用函數
#結果:
我是1
我是2
我是3

 

閉包

在內層函數中訪問外曾函數的變量安全

做用:

  • 保護內層函數變量不受侵害,更爲安全
  • 變量在執行結束的時候不會被清空,變量常駐內存,能夠隨時取用
#閉包寫法:
def outer():
    a = 10
    def inner():
         print(a)
    return inner
 #這就是一個閉包,變量a只能在局部範圍使用

迭代器

可迭代對象

如今有一數據,咱們能夠用dir來查看該數據包含了哪些處理方法,也就是說該數據支持什麼處理方式閉包

#字符串
print(dir(str))
>>>
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

#列表
print(dir(list))
>>>
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

#int
print(dir(int))
>>>
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

#咱們知道字符串和列表是支持for 循環的,也就是可迭代的,可是int不是可迭代的,大家發現了什麼呢?
#列表和字符串中都有一個相同的東西 __iter__,而int沒有,那咱們能夠認爲,可迭代對象中都有這個__iter__

獲取迭代器

#有了可迭代對象,咱們就能夠用for循環了,那麼在程序內部for循環是怎麼運行的呢?
#可迭代對象可使用__iter__得到迭代器
s = "周杰倫喜歡昆凌"
it = s.__iter__() # 獲取迭代器
print(dir(it)) 
>>>
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']


lst = [1,2,3,4,5,6,7,8]
li = lst.__ister__() #獲取迭代器
print(dir(li))
>>>
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

#生成的迭代器找那個都有個 __next__,相似於喊號,下一個的做用

官方判斷數據是不是可迭代的,以及數據是否能夠生成迭代器的方法

#引入模塊
from collections import Iterable  # 可迭代對象
from collections import Iterator    # 迭代器

print(isinstance(lst, Iterable)) #對象是否可迭代
print(isinstance(lst, Iterator))#能否生成迭代器

print(isinstance(it, Iterable))
print(isinstance(it, Iterator))

小結:

可迭代對象:Iterable, 裏面有__iter__()能夠獲取迭代器, 沒有__next__()app

迭代器:Iterator, 裏面有__iter__()能夠獲取迭代器, 還有__next__()ssh

迭代器特色:

  • 只能向前.
  • 惰性機制.
  • 省內存(生成器)

for循環的內部機制.

  1. 首先獲取到迭代器.
  2. 使用while循環獲取數據
  3. it.__next__()來獲取數據
  4. 處理異常 try:xxx   except StopIteration:
lst = ["周杰倫", "昆凌", "林俊杰", "姚明","潘長江"]
it = lst.__iter__() # 獲取迭代器
while 1:
    try:    # 嘗試執行
        el = it.__next__()  # 獲取下一個元素
        print(el)
    except StopIteration:   # 處理錯誤
        break
>>>
周杰倫
昆凌
林俊杰
姚明
潘長江
#若是不寫 except StopIteration: 雖不影響效果,但會則會報一個StopIteration(中止迭代)的錯誤
相關文章
相關標籤/搜索