09 匿名函数、函数作用域、闭包、递归

匿名函数(lambda)

语法规则:

lambda 参数:表达式

filter(lambdax: x>10, li)

匿名函数:可以赋给一个变量,重复使用。

fun1 = lambda x: x * 10
print(fun1(10))
打印结果: 100

fun = (lambda x: x * 10)(5)
print(fun)
打印结果: 50

函数作用域

01外部不能访问函数内部变量:

def fun1():    x = 1    print(x)

02函数内部能够访问函数外部变量:

x = 123def fun2():    print(x)

03函数里面不能修改外部变量:

x = 123def fun3():    x = x + 1    print(x)

04函数里面和函数外部变量名相同:

x = 123print(x,id(x))def fun1():    x = 456    return x,id(x)a = fun1()print(a)

函数内部:函数内部的变量,作用域只在函数内部,函数内部不可以直接更改函数外部的变量

global: 函数内部如果需要改变全局变量,就需要使用global修饰变量

实例:

x = 123
def fun1():
    global x
    x +=1
    return x
b = fun1()
print(b)

nonlocal: 在函数嵌套函数的情况下,同样也有函数作用域的问题,但是python3中提供了方便,只需要使用nonlocal就可以在里层函数内部修改外部函数变量。多层函数嵌套,nonlocal只修改上一层函数嵌套的值。

实例:

def fun2():
    x = 123
    def fun3():
        nonlocal x
        x +=1
        return x
    return fun3()
a = fun2()
print(a)

闭包

内嵌函数:

def fun1():
    print(‘fun1()在被调用‘)
?
    def fun2():
        print(‘fun2()在被调用‘)
?
    fun2()
?
?
fun1()
?

闭包:

def func1():
    print(‘外层函数‘)
?
    def func2():
        print(‘内层函数‘)
        return 1 + 1
?
    return func2()
?
?
result = func1()
print(result)
?
打印结果:
外层函数
内层函数
2

闭包是函数里面嵌套函数,外层函数返回里层函数,这种情况称之为闭包

闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用

闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁

递归函数

递归中可以函数自身调用自身,但是使用时类似于条件循环一样,要有递归的终止条件

递归实例:

def fun1():
    print(‘金钱 == 爱情‘)
    return fun1()

fun1()

阶乘:

def func(a):
    if a == 1:
        return a
    else:
        return func(a - 1) * a
        # result func(a - 1) + a    实现累加

result = func(5)
print(result)

打印结果:120

原文地址:https://www.cnblogs.com/zcmq/p/9048957.html

时间: 2024-10-11 11:50:19

09 匿名函数、函数作用域、闭包、递归的相关文章

函数对象和闭包的预习

创建对象: 1.对象直接量. var point = { x:0,y:0 }; //point就是一个对象,跟C#不同,它不需要一定有类才能创建对象. 2.通过new创建对象 var d = new Date(); //创建一个Date对象 3.原型 Object.prototype //用于获取对象原型的引用.所有对象都直接或间接继承自Object.prototype,相当于C#中的System.Object(); 通过new Date()创建的对象同时继承自Date.prototype和Ob

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

JavaScript函数,作用域以及闭包

JavaScript函数,作用域以及闭包 1. 函数 (1). 函数定义:函数使用function关键字定义,它可以用在函数定义表达式或者函数声明定义. a. 函数的两种定义方式: * function functionName() {} * var functionName = function(){} b. 两种函数定义不同之处 1). 声明提前问题 函数声明语句   :声明与函数体一起提前 函数定义表达式 :声明提前,但是函数体不会提前 请看下面图示:绿色线上面实在js初始加载的时候,查看

javascript 闭包与函数变量作用域

浏览器事件循环工作原理 浏览器有一个事件循环用于检查事件队列,处理延时的事件.UI事件(例如:点击,滚动等),ajax回调,以及提供给setTimeout()和setInterval()的回调,都会依次被事件循环处理. 因此,当调用setTimeout()函数时,即使延迟的时间被设置为0,提供的回调也会被排队 回调会呆在队列中,直到指定的时间用完后,引擎开始执行动作(如果它当前不执行其他动作) 因此,即使setTimeout()回调被延迟0ms,它仍然会被排队,并且直到函数中其他非延迟的语句被执

3.关于python函数,以及作用域,递归等知识点

一.使用函数编程的好处. 大大的提高了代码的重用行,重复的逻辑或者操作,可以定义到一个函数里,多次调用. 下面是关于提高代码重用性的例子. 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码. while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 i

函数对象、函数的嵌套、名称空间、函数的作用域、闭包

函数对象 def foo(): print('foo') 函数可以被赋值f=fooprint(f) #结果是一个内存地址f() #内存地址加()内运行函数 把函数当成参数传递def bar(func): print(func) func() bar(foo) 把函数当成返回值def bar(func): print(func) return func f=bar(foo)f()把函数当做容器类型的元素去用 def add(): print('=============>function add'

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

函数嵌套,名称空间,作用域,函数对象,闭包函数

函数嵌套 嵌套调用是在函数内又调用其他函数 def max(x,y): return x if x > y else y def max4(a,b,c,d): res1=max(a,b) res2=max(res1,c) res3=max(res2,d) return res3 print(max4(1,2,3,4)) 嵌套定义是在函数内又定义其他函数 # def f1(): # print('f1') # def f2(): # print('f2') # def f3(): # print(

Python作用域-->闭包函数-->装饰器

1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往外