函數基礎2

命名空間與做用域
全局做用域:
內置名稱空間 builtins
全局名稱空間 文件中沒有縮進的定義的名稱 在這個文件的任何位置均可以使用
局部做用域:
局部名稱空間 局部----------》全局-----------》內置

命名空間的查詢:globals()
locals()

函數嵌套: 嵌套調用
嵌套定義 函數定義時僅顯示語法錯誤
函數對象
函數是第一類對象:
能夠被當作變量來傳遞
能夠被當作參數
能夠被當作返回值
能夠被當作容器的一個元素
閉包:內部定義的函數,且包含對外部做用域名字的引用而不是全局做用域名字的引用
做用:閉包包含它的內存地址和自身引用的參數(自帶乾糧)
應用場景:專門爬某一網站的爬蟲
# print(f.__closure__) # 查看閉包f2的內存地址和它引用的外部參數的個數
# print(f.__closure__[0].cell_contents) # 查看f2引用的外部參數的值

#嵌套定義
x = 9999999999
def f1():
#x = 1
print('----------------',x)
def f2():
x = 2
print('------------',x)
def f3():
x= 3
print('------',x)
f3()
f2()
f1()


#嵌套調用
def my_max(x,y):
res = x if x > y else y
return res

def my_max1(a,b,c,d):
res1 = my_max(a,b)
res2 = my_max(res1,c)
res3 = my_max(res2,d)
return res3
print(my_max1(1,20,3,4))

def foo():
print('from foo')
return 'aaa'
print(foo) # 打印函數內存地址

print(foo()) #打印函數運行結果和返回值

#函數能夠被賦值
f = foo
print(f)
f()
#把函數當成參數傳遞
def bar(func):
print('from bar')
func()

bar(foo)
#把函數當成返回值
def bar(func):

return func
bar(foo)
f = (bar(foo))
f()
print(bar)

#把函數當作容器的一個元素
def add():
print('-------------------add')
def search():
print('--------------------search')
cmd_dic={
'add':add,
'search':search
}
def tell_msg():
msg = """
**********
search:查找
add:增長
***********
"""
print(msg)
def main():
tell_msg()
m = input('please input your choice:')
cmd_dic[m]()

main()
#閉包
x =1
def f1(x):
def f2():
print(x)

return f2
f = f1(999999999999)
f()
print(f.__closure__) # 查看閉包f2的內存地址和它引用的外部參數的個數
print(f.__closure__[0].cell_contents) # 查看f2引用的外部參數的值
#閉包的應用
#爬蟲
from urllib.request import urlopen
def get(url):
return urlopen(url).read()

print(get('http://www.baidu.com'))

#專門爬python
from urllib.request import urlopen

def get(url):
def f2():
n = urlopen(url).read()
print(n)
return f2
f = get('http://www.baidu.com')
f()
相關文章
相關標籤/搜索