函数进阶_月隐学python第11课

目录

 

1.函数类型

2. 匿名函数

3.传入函数(理解)

4.闭包

5.偏函数

6.变量的作用域

6.1 变量作用域的分类

6.2 变量作⽤域查找规则

6.3 全局变量和局部变量

6.4 global和nonlocal

函数填空题


1.函数类型


函数也是一种类型,我们自定义的函数就是函数对象,函数名保存了函数对象的引用(地址)

2. 匿名函数


不再使用def 函数名()这种形式定义函数,而是使⽤lambda来创建匿名函数
特点:

  • lambda只是一个表达式,函数体⽐def定义的函数简单的多
  • lambda的函数体不再是代码块,⽽是⼀个表达式
  • lambda只有⼀行,运行效率很高

语法:

3.传入函数(理解)


一个函数就可以接收另⼀个函数作为参数,这种函数就称之为高阶函数,也可以称之为传⼊函数。可以实现通用编程,排序等复杂功能

4.闭包

我们可以在⼀个函数中再定义一个函数,在函数内部定义的函数称之为内部函数,内部函数只能在函数内使用,不会污染外部空间。定义内部函数的函数称之为外部函数,这样的定义构成函数的嵌套

  • 内部函数只能在外部函数⾥调用,外界⽆法直接调⽤内部函数

在一个外部函数中定义了一个内部函数,内部函数⾥引⽤了外部函数的变量,并且外部函数的返回值是内函数的引用。这样内部函数和其执⾏所需的环境变量就构成了一个闭包。
一般情况下,如果⼀个函数结束,函数的内部所有东西都会释放掉,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有⾃己的局部变量将来会在内部函数中⽤到,就把这个局部变量绑定给了内部函数,然后⾃己再结束。

 

在闭包中⽆法直接修改外部变量x的值

在python3中可以通过nonlocal关键字声明⼀下x,表示这个变量不是局部变量,需要向上一层变量空间找这个变量

5.偏函数


当⼀个函数有⼤量参数,调⽤的时候非常不方便,可以使⽤偏函数技术,将⼀些参数固定(给默认值),达到简化函数调用的⽬的。

6.变量的作用域


程序中的变量并不是在任意的位置都可以随意访问,在哪里可以访问取决于这个变量的作⽤域,变量的作用域指的是变量在那段代码中可以使⽤,可以使用变量的那段代码就是变量的作用域。在python中,只有函数/类/模块才引⼊作⽤域,if/elif/else , while/for,try/except等并不会引⼊新的作用域


6.1 变量作用域的分类


按照作用域划分,可以分为:

  • L: Local,局部作用域
  • E: Enclosing,闭包作用域【闭包的外部函数中定义的变量】
  • G: Global,全局作用域 在所有函数外定义的变量
  • B: Built-in,内建作用域【内置作用域】
     

6.2 变量作⽤域查找规则


以 L --> E --> G -->B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后到内建作用域中找。


6.3 全局变量和局部变量


定义在函数内部的变量拥有⼀个局部作用域,被称为局部变量
定义在函数外面的变量拥有⼀个全局作⽤域,被称为全局变量
局部变量和全局变量同名,局部优先

6.4 global和nonlocal

函数填空题
 

1. 函数定义
def test1(a,b):
      return a + b
则test1(3,b=5)的值为___8______; test1(b=10,a=2)的值为
______12___。

2. 函数定义:
def test(a,b=2,*args):
      return a + b + sum(args)
则test(1,2,3,4,5)的值为__15_________; test(1)的值为:
_____3______; test(*[3,2,1,5])的值为: __11______;
test(*{1:2,3:4,5:6}.values())的值为___12____。

3. 函数定义:
def test(*args, **kwargs):
      tmp = list(args) + list(kwargs.values())
return sum([tmp[x] for x in range(len(tmp) )if not(x % 2) )]
则 t e s t ( a = 3 , b = 4 , c = 5 ) 的 值 : _ _8 _ _ _ _ ;
test(**{1:2,3:4,5:6,7:8})的值为: ___无法赋值______;
test(1,3,5,7,a=10,b=3)的值为: ___16______。

 

4. 函数定义:
def link(*args):
     args = [x if isinstance(x,str) else str(x) for x in args]
     return ‘’.join(args)
则lin k (1 ,2 ,3 )的值为: __123______; lin k (‘北京’,’python’,’1902’)的值为__北京python1902________。

5. 函数定义:
def demo(*args):
     return args * 2
则sum(demo(1,2,3))的值为____12____; len(demo())等于___0______。

6. 函数定义为:
def judge(a):
    if a > 0:
        return True
则print(“兔⼦” if judge(-1) else ‘狗’)输出: __狗_____

7. 已知: pf = lambda a,b=2:a + b; 则pf(2) = _4_____;
pf(3,4) = __7____; pf(b=3,a=5) = ___8______;

8. 已知:
def demo(a):
    a = 5
则执⾏a = 10; demo(a);后a = _10____;

9. 已知:
def demo(a):
for key in a:
a[key] += 10
则a = {1:10,2:20,3:30};则执⾏demo(a)后, a =____{1: 20, 2: 30, 3: 40}___________。


 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章