函数对象

Python中一切皆对象

函数名也可以看成是变量名,那么它也同样具有变量名的三大特征

  1. 函数名对应的值
  2. type
  3. id
def self_max(x, y):
if x > y:
return x
return y print(self_max)
print(type(self_max))
print(id(self_max))
<function self_max at 0x000001EF4A953840>
<class 'function'>
2127260104768

函数对象的四大功能

1.引用

def self_max(x, y):
if x > y:
return x
return y a = self_max
num_max = a(10, 20)
print(num_max)
20

2.当作函数的返回值

def f1():
print('from f1') def f2():
return f1 f = f2()
f()
from f1

3.当作函数的参数

def f1():
print('from f1') def f2(m):
return m f = f2(f1)
f()
from f1

4.作为容器元素中的元素

def f1():
print('from f1') l = ['str', 1, f1]
l[2]()
from f1
def trans():
print('from trans') def withdraw():
print('from withaw') while True:
choice_dict = {'1': trans, '2': withdraw} # 这个直接打印tran的话是一大堆字符而不是我们想要的效果
choice_dict_user = {1: 'trans', 2: 'withdraw', 3: 'exit'} print(choice_dict_user)
user_choice = input('请选择你需要的功能')
if user_choice == '3':
break choice_dict[user_choice]()
{1: 'trans', 2: 'withdraw', 3: 'exit'}
请选择你需要的功能2
from withaw
{1: 'trans', 2: 'withdraw', 3: 'exit'}
请选择你需要的功能3

函数的嵌套

定义阶段识别语法,不运行代码

from math import pi

def circle(r, choice):
if choice == 'p':
def perimeter():
res = 2 * r * pi
return res
return perimeter() if choice == 'a':
def area():
res = (r ** 2) * pi
return res
# area()
return area() r = int(input('请输入半径'))
choice = input('求面积输入"a",求周长输入"p"')
print(circle(r, choice))
请输入半径3
求面积输入"a",求周长输入"p"a
28.274333882308138

名称空间和作用域

名称空间

  • 存放函数名的空间

1.内置名称空间

  • 如'str'.strip() # 所学的所有内置方法,其实就是一个个函数,这些函数被封装后用来实现一个个功能
  • 各种数据类型都有各自的内置方法,Python也有Python的内置方法,比如len(),在Python启动的时候,就会定义len()函数,并且把len()丢入内存空间,这个内存空间就叫做内置名称空间
  • 生命周期:Python启动的时候就活了,关闭就死了

2.全局名称空间

  • 除了内置和局部,就是全局
  • 生命周期:程序/文件运行的时候才会活,运行完毕就死了

3.局部名称空间

  • 函数内部的都叫局部, 也就是说函数内部定义的名字都放入了局部名称空间中了.
  • 生命周期:函数运行的时候会活,运行完就死了

考试必考

  • 执行顺序: 内置名称空间--> 全局名称空间--> 局部名称空间
  • 查找顺序: 从当前名称空间开始查找,找到就停下,找不到就往上找.只往上找,不往下找

作用域

  • 全局作用域: 适用于全局+内置,即全局可以修改内置的,内置可以修改全局的
  • 局部作用域: 只能适用于局部范围,在局部定义的名字只能在局部获取
  • 作用域关系在函数定义阶段就已经确定了
x = 100
def f1():
x = 2
def f2():
x = 3
print('f1',x)
return f2 f2 = f1()
x = 1000
def f3():
x = 15
f2() f3()
f1 1000
  • 自我理解:全局只有一个,而局部可以有很多个,如果两个局部间是包含嵌套的关系,那么外部函数的变量可以适用于内部函数,如果两个局部是平行关系,那么没有任何关系.

global

  • 局部修改全局
x = 100
def f1():
global x
x = 1
f1()
print(x)
1

nonlacal

  • 在函数嵌套中把局部改成外部
def f1():
x = 1
def f2():
nonlocal x
x = 3
f2()
print(x) f1()
3

LEGB原则

- L(Local)局部作用域
- E(Enclosing function locale)外部嵌套函数作用域
- G(Global module)函数定义所在模块作用域
- B(Buildin):Python内置模块的作用域
  • 里面可以访问外面的变量,外面无法访问里面的变量,越靠近优先级越高(局部变量注意是包含还是平行)

day15 函数对象以及作用域的更多相关文章

  1. python函数对象-命名空间-作用域-02

    函数对象 函数是第一对象: # 函数名指向的值可以被当做参数传递 函数对象的特性(*****灵活运用,后面讲装饰器会用到) 函数名可以像变量一样被传递 # 变量可以被传递 name = 'jason' ...

  2. lambda函数对象与作用域 (重点)

    Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时 ...

  3. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

  4. python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域

    一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...

  5. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

  6. JS 字符串对象 数组对象 函数对象 函数作用域

    一.内置对象 object对象:ECMAScript 中的所有对象都由这个对象继承而来:Object 对象中的所有属性和方法都会出现在其他对象中 ToString() : 返回对象的原始字符串表示.V ...

  7. Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)

    今日主要内容 1.  函数默认值细节(*) 2.  数据类型补充:三元表达式.列表推导式.字典推导式 (***) 3.  函数对象:函数名的各种应用场景 (*****) 4.  名称空间与作用域:解释 ...

  8. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  9. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

随机推荐

  1. 洛谷P2894 [USACO08FEB]酒店Hotel_区间更新_区间查询

    Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...

  2. vue学习笔记——脚手架安装

    项目启动:npm run build 脚手架 vue cli vue cli --2 安装命令 #全局安装 npm install --global vue-cli #卸载vue-cli  npm u ...

  3. HDU-6217 BBP Formula 脑洞

    题目链接:https://cn.vjudge.net/problem/HDU-6217 题意 已知: \[ \pi = \sum_{k=0}^{\infty }\frac{1}{16^{k}}(\fr ...

  4. k8s的概念

    Kubernetes(简称为 K8s),最初由 Google 的工程师开发和设计.Kubernetes 是用于自动部署.扩展和管理容器化应用程序的开源系统,它旨在提供跨主机集群的自动部署.扩展以及运行 ...

  5. PHP学习总结(3)——PHP入门篇之PHP的echo语句

    Echo语句 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来). 如下代码: <?php echo "Hello world!";?> 注意ech ...

  6. query ajax总是进入error回调函数

    query ajax总是进入error回调函数今天纠结了1小时,ajax总是进入了error函数中.平时使用从来没有出现过这种现象,纠结了半小时. 最后稍微总结出了点: 1.以前使用都是服务器端输出S ...

  7. Mysql 下DELETE操作表别名问题

    在用DELETE删除mysql数据库数据时采取一下两种方式: 方式一:DELETE FROM B_PROSON WHERE ID = 1; 不使用别名 方式二:DELETE BP FROM B_PRO ...

  8. 4种方法让SpringMVC接收多个对象

    问题背景: 我要在一个表单里同一时候一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该怎样处理? 第1种方法:表单提交,以字段数组接收: 第2 ...

  9. 《AndroidStudio每日一贴》3.高速切换代码风格、配色方案和键盘

    <AndroidStudio每日一贴>3.高速切换代码风格.配色方案和键盘 高速切换代码风格.配色方案和键盘,使用快捷键: control + ~ 很多其它有用技巧请查看<Andro ...

  10. 【翻译自mos文章】11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值

    [翻译自mos文章]11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值 来源于: Default and Minimum ME ...