Python 入门基础10 --函数基础3

今日内容

  • 1.函数对象

  • 2.名称空间与作用域

  • 3.函数的嵌套调用与闭包

一、函数对象

1.1 定义

函数名存放的就是函数地址,所以函数名也就是对象,称之为函数对象

1.2 函数对象的应用

1.可以直接被引用
2.可以当作函数参数传数
3.可以作为函数的返回值
4.可以作为容器类型的元素
def fn():
    num = 10
    print('fn function run')
    
# 直接被引用
func = fn
fn()
func()

案例:四则运算

def add(n1, n2):
    return n1 + n
def sub(n1, n2):  # subtraction 减法
    return n1 - n2
def mul(n1, n2):  # multiplication 乘法
    return n1 * n2
def div(n1, n2):  # division 除法
    return n1 / n2
    
method_map = {
    'add': add,
    'sub': sub,
    'mul': mul,
    'div': div
}

def computed(fn):
    if fn in method_map:
        return method_map[fn]
    else:
        return add
def func():
    cmd = input("方法名:")
    method = computed(cmd)
    result = method(100, 20)
    print(result)
func()

二、名称空间

2.1 三种名称空间

built-in:内置名称空间,系统级,一个,随解释器执行而产生,解释器停止而销毁
global:全局名称空间,文件级,多个,随所属文件加载而产生,文件运行完毕而销毁
local:局部名称空间,函数级,多个,随所属函数执行而产生,函数执行完毕而销毁
    
注:加载顺序:built-in > global > local
num = 10
def fn2():
    num = 20
    print("this is fn2", num)

def fn3():
    num = 30
    print("this is fn3", num)


fn2()  # this is fn2 20
fn3()  # this is fn3 30
print(num)  # 10

三、作用域

3.1 LEGB

不同作用域之间名字不冲突,以达到名字的重用
直接查找顺序: Local -> Enclosing -> global -> built-in

built-in : 内置作用域,所有函数
global:全局作用域,当前文件所有函数
enclosing:嵌套作用域,当前函数
local:局部作用域
len = 10
def outer():
    len = 20
    def inner():
        len = 30
        print('1', len)
    inner()
    print('2', len)

outer()
print('3', len)  # 10 global --> built-in
del len
print('4', len)  # len地址--》built-in

四、函数嵌套

将函数直接定义到另一个函数内部就可以使用外部函数中的名字
def outer():
    num = 20

    def inner():
        print(num)  # inner 可以直接使用outer中的名字
    inner()

outer()

五、闭包

函数嵌套(格式稍作改良)
inner : 可以使用outer的局部变量
def outer():
    num = 10
    def inner:
        print(num)
    return inner
fn = outer()
fn()
# 案例一:外部函数可以为闭包传递参数 
import time
def download():
    print('开始下载...')
    time.sleep(2)
    print('完成下载...')
    data = ""
    outer(data)
# 传参
def outer(data):
    def inner():
        # 保存,播放,删除等操作
        print("闭包打印:", data)
    inner()
download()
# 案例二:延迟执行
import requests
def outer(url):
    def get_html():
        html = requests.get(url)
        print(html.text)
    return get_html
# 先预定义多个爬虫方法,爬页面操作并未执行
baidu = outer('https://www.baidu.com')
python = outer('https://www.python.org')
sina = outer('https://www.sina.com.cn')
# 什么时候想爬什么页面就调用指定页面的爬虫方法
baidu()
sina()

猜你喜欢

转载自www.cnblogs.com/xt12321/p/10640323.html