1. 程式人生 > >python之路——函數名的應用,閉包,叠代器

python之路——函數名的應用,閉包,叠代器

glob 協議 字符串 () closure nco 異常處理 類類型 單向

# ##函數名的應用
# def func():
# print(666)
# func()
#
# 1.函數名就是函數的內存地址
# print(func) #結果<function func at 0x000002AC2188C1E0>

# 2.函數名可以作為變量
# a = 2
# b = a
# c = b
# print(c)

# def func1():
# print(666)
# f1 = func1()
# f2 = f1
# f2()

# 3.函數名可以作為函數的參數
# def func1():
# print(666)
# def func2(x):
# print(x) #<function func1 at 0x0000026C3D983BF8>
# x()
# func1()

# def func():
# print(666)
# def func1():
# print(123) # 疑問
# func()
# def func2(x):
# x()
# func2(func1)

# 4.函數名可以當作函數的返回值
# def wraaper():
# def inner():
# print(‘inner ‘)
# return inner
# ret = wraaper() # inner
# ret() # inner()

# def func2():
# print(‘in func‘)
#
# def func3(x):
# print(‘in func3‘)
# return x
# f1 = func3((func2()))

# f1()
# 5.函數名可以作為容器類類型的元素
# a = 6
# b = 4
# c = 5
# l1 = [a,b,c]
# print(l1)

# def func1():
# print(‘in func1‘)
# def func2():
# print(‘in func2‘)
# def func3():
# print(‘in func2‘)
# def func4():
# print(‘in func4‘)
# l1 = [func1,func2,func3,func4]
# for i in l1:
# i()

# 向上面的函數名這種,第一類對象

# #返回當前位置的局部變量的字典globals() locals()
# # globals() #返回全局變量的一個字典
# # locals()

# def func1():
# a= 2
# b = 3
# print(globals()) #返回全局變量的一個字典
# func1()

# def func1(): #返回當前位置局部變量的一個字典
# a = 2 # {‘a‘: 2, ‘b‘: 3}
# b = 3
# print(locals())
# func1()

# 閉包
# 內層函數對外層函數的變量(非全局變量)的引用
# 並返回,這樣就形成了閉包

# def wraaper():
# name = ‘alex‘ #最裏層函數調用了上一級的局部變量
# def inner(): #內存種不會立刻消失,再在函數裏面
# print(name) #調用的話可以調用成功
# print(inner.__closure__)
# inner()
# def qwe():
# print(name)
# qwe()
# return inner
#
# wraaper()
# print(name)

‘‘‘閉包的作用
當程序執行時,遇到了函數執行,他會在內存開辟一個空間,
局部名稱空間,如果這個函數內部形成了閉包
那麽他就不會隨著函數的結束而消失。
‘‘‘
#可叠代對象

#對象內部含有_iter_方法就是可叠代對象。
# 可叠代對象滿足可叠代協議
# 可叠代對象
#str list dict tuple set ranger()

# s1 = ‘strs‘
# print(dir(s1)) #可以查字符串的所有方法

# 判斷一個對象是否是可叠代對象
# 第一個方法
# dic = {‘name‘:‘alex‘,‘age‘:‘18‘}
# print(‘__iter__‘ in dir(dic))
# print(dir(dic))

# s1 = [1,2,3]
# print(dir(s1))
# 第二種方法
# from collections import Iterable
# from collections import Iterator
#
# print(isinstance(‘alex‘,Iterable))
# print(isinstance(‘alex‘,Iterator)) # True

# print(isinstance(‘alex‘,str))

# 叠代器
# 對象內部含有__iter__方法且含有__next_方法就是叠代器
# 一個文件句柄就是一個叠代器
# f = open(‘t1.txt‘,encoding=‘utf-8‘,mode=‘r‘)
# print(‘__iter__‘ in dir(f)) #True
# print(‘__next__‘ in dir(f)) #True
# print(‘__iter__‘ in dir(dict)) #False
# print(‘__next__‘in dir(dict)) #False

# dic = {‘name‘:‘alex‘}
# print(‘__iter__‘ in dir(dic)) #True

# 可叠代對象和叠代器的區別
# 可叠代對象不能取值,叠代器是可以取值的
# 可叠代對象可以轉化為叠代器

# lis = [1,2,3,4,5,6]
# ite1 = lis.__iter__() #叠代器
# ite1 = iter(lis)
# print(ite1) #itel的內存地址
# print(ite1.__next__()) #取叠代器第一個值

# l1 = {‘name‘:‘alex‘}
# l2 = l1.__iter__()
# # l3 = iter(l2)
# print(l2.__next__())

# l1 = [1,2,3,4,5,6,7,8,9,10]
# l2 = l1.__iter__()
# print(l2.__next__())

# 將可叠代對象轉化為叠代器
# 叠代器 = 可叠代對象.__iter__()

# 叠代器如何取值? next一次,去一個值
# print(ite1.__next__())
# print(ite1.__next__())
# print(ite1.__next__())
# print(ite1.__next__())
#調用__next__取值

# 1.可叠代對象不能取值,叠代器是可以取值的
# 2.叠代器非常節省內存
# 3.叠代器每次只能取一個值
# 4.叠代器是單向的,一條路走到頭

# 利用異常處理停止報錯
# try

# s1 = ‘1233456‘
# s = s1.__iter__()
# while 1:
# try:
# print(s.__next__())
# except StopIteration:
# break

python之路——函數名的應用,閉包,叠代器