函数基础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()
posted @ 2017-04-08 12:30  柳姑娘  阅读(151)  评论(0编辑  收藏  举报