1.函数类型

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

def test():print('我是测试函数')
​
print(test)  #函数名是变量,指向了函数对象
pf = test    #pf变量也指向了函数对象,所以也可以通过pf调用test函数
pf()

2. 匿名函数

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

特点:

  • lambda只是一个表达式,函数体比def定义的函数简单的多

  • lambda的函数体不再是代码块,而是一个表达式

  • lambda只有一行,运行效率很高

语法:

lambda [arg1,arg2....argn]:表达式(只能是一个表达式)
add = lambda a,b:a + b
print(add(3,5))

3.传入函数(理解)

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

#传入函数,高阶函数
#能被2整除数的和
def sum_even(n):sum = 0for i in range(1,n+1):if i % 2 == 0:sum += ireturn sum
​
#能被7整除的数的和
def sum_seven(n):sum = 0for i in range(1,n+1):if i % 7 == 0:sum += ireturn sum
#能被3和5整除,但不能7整除的数的和
def sum_fifteen(n):sum = 0for i in range(1,n+1):if i % 15 == 0 and i % 7 != 0:sum += ireturn sum
#通用求和函数
def sum1(n,callback):'''功能:求满足callback规定条件的数的和:param n: 大于0的整数:param callback: 用于判断一个数是否满足指定条件,由调用者传入,有一个参数,形如:def callback(n):return: 求和的结果'''sum = 0for i in range(1,n+1):if callback(i):sum += ireturn sum
print(sum1(100,lambda x:x%2==0))
print(sum1(100,lambda x:x%7==0))
print(sum1(100,lambda x:x%15==0 and x % 7 != 0))

4.闭包

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

def outter(a): #外部函数x = 10def inner(y):  #内部函数print(x + y)inner(a)outter(20)
  • 内部函数只能在外部函数里调用,外界无法直接调用内部函数

在一个外部函数中定义了一个内部函数,内部函数里引用了外部函数的变量,并且外部函数的返回值是内函数的引用。这样内部函数和其执行所需的环境变量就构成了一个闭包

一般情况下,如果一个函数结束,函数的内部所有东西都会释放掉,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的局部变量将来会在内部函数中用到,就把这个局部变量绑定给了内部函数,然后自己再结束。

def outter(a): #外部函数x = adef inner(y):  #内部函数return x + y  #引用外部变量return inner  #返回内部函数(闭包)
pf = outter(20)
print(pf(10))  #30
print(pf(20))  #40

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

def outter(a): #外部函数x = adef inner(y):  #内部函数# x += 10   #UnboundLocalError: local variable 'x' referenced before assignmentreturn x + yreturn inner

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

def outter(a): #外部函数x = adef inner(y):  #内部函数nonlocal xx += 10return x + yreturn inner

5.偏函数

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

import functools
def test(a,b,c,d):print(a, b, c, d)
#从前面固定参数,使用位置参数就行,1=>a,2=>b
test1 = functools.partial(test,1,2)
test1(3,4)  #3=>c  4=>d
​
#从后面固定参数,需要使用关键字参数
test2 = functools.partial(test,c=3,d=4)
test2(1,2)  #1=>a 2=>b
​
#如果固定的参数不连续,则需使用关键字参数固定
test3 = functools.partial(test,b=2,d=4)
test3(a=1,c=3) #需要使用关键字参数,否则会报错

6.变量的作用域

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

#if语句不引入新作用域,msg在外面可以使用
if True:msg = "message"
​
print(msg)

6.1 变量作用域的分类

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

  • L:Local,局部作用域

  • E:Enclosing,闭包作用域【闭包的外部函数中定义的变量】

  • G:Global,全局作用域 在所有函数外定义的变量

  • B:Built-in,內建作用域【内置作用域】

#1 局部作用域
#局部变量只能在函数内部使用,外部无法引用
#局部变量的作用域从定义开始到函数体结束
def demo():num = 20  #局部变量  print(num)
demo()
#print(num) 错误
​
#闭包作用域
def outter():x = 10   #函数作用域,从定义开始到本函数结束def inner():y = x  #在闭包中可以引用print(y)return inner
pf = outter()
pf()  #执行闭包
print(pf.__closure__)
​
#全局作用域
x = 100    #全局作用域  从定义开始到本文件结束
def demo():print(x)
print(x)
​
#内建作用域,是指系统内建的函数或常量,在系统载入时加载,在所有模块中都可以直接引用
#比如说系统函数
print(max(1,2,3))  #max函数就是内建作用域  哪里都可以引用
def  demo():x = 30y = 50print(max(x, y))

6.2 变量作用域查找规则

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

6.3 全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,被称为局部变量

定义在函数外面的变量拥有一个全局作用域,被称为全局变量

局部变量和全局变量同名,局部优先

total = 0   #全局变量
def sum(arg1,arg2):total = arg1 + arg2   #局部变量print("函数内部:",total)return totalsum(10,20)
#print(total1)
print("函数外部:",total)
​
num = 1
def fun1():print(num) #UnboundLocalError: local variable 'num' referenced before assignmentnum = 123print(num)
​
fun1()

6.4 global和nonlocal

#1.在Python中,当内部作用域想修改全局变量的时候,则就要使用global关键字进行声明
num = 1
def fun1():global num   #告诉编译器,此处的num是全局变量print(num)   #1num = 123print(num)  #123fun1()
​
a = 10
def test():global  aa = a + 1print(a)
test()
​
#2.如果要修改函数作用域中的变量,则使用nonlocal
#需要明确的是,nonlocal关键字定义在闭包里面
x = 0  #全局作用域
​
def outer():x = 1   #闭包作用域
​def inner():nonlocal xx = 2   #局部作用域print("inner:",x)  #2
​inner()print("outer:",x)  #1---->2
​
outer()
print("全局:",x)  #0
​
#nonlocal关键字:声明了该变量不只是在outer函数中有效,在inner函数内部也有效

Day07-函数(2)相关推荐

  1. Day07:常用模块,面向对象编程(对象类)及内置函数

    今日内容: 1.常用模块 2.面向对象编程(*****)     介绍面向对象编程     类     对象 3.内置函数 ------------------------------ 1.面向过程编 ...

  2. 打卡day07 python基础—函数

    def 和 return 是关键字(keyword)python 就是靠识别这些特定的关键字来明白用户的意图 # 1.创建和调用函数 """ 我们创建了一个函数,但是从来 ...

  3. 【168天】黑马程序员27天视频学习笔记【Day07】

    [168天]黑马程序员27天视频学习笔记[Day07] 叨逼叨两句 决定了,我会记住这一天! 07-01:构造方法Constructor概述和格式 构造方法概述和作用 给对象的数据(属性)进行初始化. ...

  4. Python菜鸟入门:day08函数概念

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  5. Python菜鸟入门:day07条件循环

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  6. PYTHON1.day07

    day06回顾    列表      可变的序列容器    创建列表的方法:      字面值 [], [1, 2, 3]      构造函数 list() , list(range(10))     ...

  7. JS的组成-JS数组方法-JS函数-系统化学习

    JS Day01 什么是js的组成? ECMAScript(es) 其实就是js的规范(规则) DOM 文档对象模型 div span BOM 浏览器对象模型 JS的使用方式 行内样式的书写(不经常使 ...

  8. day07 c++复习 核心编程02 核心内容(1、友元 2、3、继承 )

    目录 全局函数做友元 类做友元 成员函数做友元 下一章是运算符重载,这章太难了,而且重要,单独出一版 继承 继承的基本语法 派生类中的成员,包含两大部分: 继承方式 继承中的对象模型 继承中构造和析构 ...

  9. day07面向对象复习+课后练习

    day07面向对象复习+课后练习 第一部分:面向对象上 两个要素:类和对象 类是对一类事物的描述,是抽象的.概念上的定义 对象是实际存在的该类事物的每个个体,因而也称为实例(instance). 创建 ...

  10. python 信号.同步 day07

    2018.8.14 目录 信号 信号量 同步互斥机制 多线程 day07 信号 一个进程向另一个进程通过信号的方式传递某种讯息,接受方在接受到信号作出相应的处理. 示例: import os from ...

最新文章

  1. LeetCode 438. Find All Anagrams in a String--字符串-滑动窗口--C++,Python解法
  2. im4java转换图片格式_ImageMagick和im4java处理图片[转]
  3. Android 编译命令
  4. JS的for循环小例子
  5. SharePoint上传循环添加label并获取上传文件名字的扩展名和文件大小(Session[demo] = new ListLabel();方法实现)...
  6. java表单重复提交_JavaWeb防止表单重复提交(转载)
  7. 电子计算机工程学,电子计算机工程学荣誉工学士资料.ppt
  8. uart串口通信_听说UART与STM32的HAL库更配哦
  9. WebService应用:音乐站图片上传
  10. x390拆机_用了七八年的笔记本电脑依然流畅如初,从X230i换到X390
  11. Angular项目构建指南 - 不再为angular构建而犹豫不决
  12. [重要] Cocos2dx 3.0 PageView ListView 在Android设备下背景显示为绿色的问题的解决方案
  13. Steam[ASF]挂卡(挂游戏时间)纯新手教学
  14. 不学c语言能学mysql吗_学C语言难不难?以及简说数据库
  15. 泰克示波器TBS2000B 在大学基础实验室的应用
  16. python爬取斗鱼图片
  17. oracle 数据库中 connect by 和level 的用法
  18. 你知道Kafka和Redis的各自优缺点吗?一文带你优化选择,不走弯路
  19. 视觉3D感知(二):单目3D物体检测
  20. 在当当和亚马逊中搜书并输出最低价格

热门文章

  1. 职场新人的入门法则:少想、多做、立即执行!
  2. FFMpeg的output_example.c例子分析
  3. JavaScript将字符串中的每一个单词的第一个字母变为大写其余均为小写
  4. ruby 数据sql操作
  5. 搜集的一些有意思的牛人博客地址
  6. 第五节 CImage和CBmp(二)
  7. 如何在android studio中设置sdk path?
  8. 面向对象-多态,反射
  9. 常用宏定义 - 系统相关
  10. 李开复评价马斯克:他真正的目的是把人变成半机械人