標籤:結束 傳回值 exce 判斷 元素 print 返回 als 閉包
# ##函數名的應用
# 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之路——函數名的應用,閉包,迭代器