函数对象 函数嵌套 名称空间与作用域

函数对象: 

  函数是第一类对象,即函数可以当做数据传递

    1 可以被引用

    2 可以当做参数传递

    3 返回值可以是函数  (函数名 不带() 就是函数名的内存地址,带括号就是执行函数)

    4 可以当做容器类型的元素

def foo():print('foo')def bar():print('bar')dic={'foo':foo,'bar':bar,
}
while True:choice=input('>>: ').strip()if choice in dic:dic[choice]()

def func(): # func=函数的内地址
print('from func')
age=10
# 1. 可以被引用
# x=age
# print(x,age)

# f=func
# print(f)
# f()

# 2. 可以当作参数传给另外一个函数
# def bar(x):
# print(x)

# bar(age)
# bar(func)

# 3. 可以当作一个函数的返回值
# def bar(x):
# return x

# res=bar(age)
# print(res)

# res=bar(func)
# print(res)

# 4. 可以当作容器类型的元素
# l=[age,func,func()]
# print(l)

 

利用函数的特性取代多分支的if

def foo():print('foo')def bar():print('bar')dic={'foo':foo,'bar':bar,
}
while True:choice=input('>>: ').strip()if choice in dic:dic[choice]()

函数的嵌套

函数的嵌套定义:一个函数内部又定义了另一个函数
def f1():def f2():def f3():print('from f3')f3()f2()f1()
f3() #报错 空间与作用域

函数的嵌套调用 :在调用一个函数过程中,内部代码又调用了其他函数
def max(x,y):return x if x > y  else ydef 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)

名称空间与作用域

  什么是名称空间: 存放名字的地方,三种名称空间(内置 全局 局部)

  名称空间的加载顺序

    python test.py

    1 python解释器先启动,因而首先加载的是:内置空间

    2 执行test.py文件,然后以文件为基础,加载全局名称空间

    3 执行文件的过程中如果调用函数,则临时产生局部名称空间

  名字的查找顺序

    局部名称空间———》全局名称空间——》内置名称空间 (在全局无法查看局部的,在局部可以查看全局的)

# max=1
def f1():# max=2def f2():# max=3print(max)f2()
f1()
print(max)

作用域

#1、作用域即范围- 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效- 局部范围(局部名称空间属于该范围):临时存活,局部有效
#2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
x=1
def f1():def f2():print(x)return f2
x=100
def f3(func):x=2func()
x=10000
f3(f1())#3、查看作用域:globals(),locals()
LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间  将局部变量的作用域提升至全局作用域,可以用来在局部修改全局的不可变类型
builtins 内置模块的名字空间

nonlocal 声明一个名字是来自于当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型将L 与 E 中的名字统一需要提前定义

!!!名字的查找顺序,在函数定义阶段就已经固定死了(及在检测语法是就已经确定了名字的查找顺序),与函数的调用位置无关,也就是说无论在任何地方调用函数,都必须回到当初定义函数的位置去确定名字的查找关系

x=111
def outer():def inner():print('from inner',x) # x访问的时全局名称空间中xreturn innerf=outer()        <function outer.<locals>.inner at 0x00000000021DB6A8>
print(f)           from inner 222x=222
f()                  222  访问时全局的x已经被重新赋值了x=111
def outer():def inner():print('from inner',x) # x访问的时全局名称空间中xreturn innerf=outer()           from inner 444  全局被重新赋值为444# x=222
def func():x=333f()x=444func()    func->f->outer->x 全局变量 444     from inner 444

转载于:https://www.cnblogs.com/lakei/p/10636639.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国信证券学习系列(7)

跨品种套利策略&#xff1a; 本策略根据计算滚动的.过去的30个bar的均值正负0.5个标准差得到布林线 并在最新价差上穿上轨来做空价差,下穿下轨来做多价差 并在回归至上下轨水平内的时候平仓 获取数据&#xff1a; # 获取两个品种的收盘价时间序列closesContextInfo.get_ma…

dubbo-admin管理平台搭建

一、前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 dubbo的使用&#xff0c;其实只需要有注册中心&#xff0c;消费者&#xff0c;提供者这三个就可以使用了&#xff0c;但是并不能…

不朽传奇-云计算技术背后的那些天才程序员:Qemu的作者法布里斯贝拉

作者&#xff1a;Liu Guo Hui&#xff0c;OpenStack中国社区&#xff0c;转载请注明出处 众所周知&#xff0c;虚拟化技术是构建云基础架构不可或缺的关键技术之一&#xff0c;而在众多虚拟化技术实现当中&#xff0c;KVM&#xff08;Kernel Virtual Machine&#xff09;因为L…

C学习笔记-字符串

对于C语言来说&#xff0c;字符串其实就是最后一个元素为’\0’的char数组 字符数组的初始化 字符数组常见的有两种初始化方式 char str[] "hello";或者 char str[] {h, e, l, l, o};当使用sizeof&#xff08;str&#xff09;时&#xff0c;得到的大小为6&#xff…

Shiro安全框架入门篇(登录验证实例详解与源码)

一、Shiro框架简单介绍 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Apache Shiro是Java的一个安全框架&#xff0c;旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用…

国信证券学习系列(8)

我为什么要用国信&#xff0c;就是这个原因&#xff0c;可以做期权&#xff0c;期货&#xff0c;股票&#xff0c;etf&#xff0c;可转债的回测。满足了我所有的需要&#xff0c;我要做指数增强。通常的做法是股票和期货。但实际上&#xff0c;股票和期权做组合&#xff0c;成本…

Socket程序从Windows移植到Linux下的一些注意事项

关于这个话题网上流传的是一个相同的版本&#xff0c;就是那个第一项是头文件的区别&#xff0c;但后面列出的头文件只有#include没有&#xff08;估计是原版的在不断转载的过程中有人不小心忘了把尖括号转义&#xff0c;让浏览器当html标记解析没了&#xff09;的那个。现在整…

边缘控制平面Ambassador全解读

Ambassador是由Datawire开源的一个API网关项目&#xff0c;主要在Kubernetes的容器编排框架中使用。Ambassador本质上是一个通过配置边缘/API来管理Envoy数据面板的控制面板。而Envoy则是一个基于第7层协议的网络代理和通信总线&#xff0c;它是一个由Lyft开源的云原生服务&…

Linux 文件编辑命令 详细整理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、vi编辑器有3种基本工作模式 首先需要知道vi编辑器有3种基本工作模式&#xff0c;分别是&#xff1a;命令模式、文本输入模式、和末…

专访迅雷首席工程师:迅雷的下一代互联网底层技术构想

摘要&#xff1a;互联网合纵连横频频上演&#xff0c;迅雷与小米的联姻也成为了热点&#xff0c;有许多人为迅雷的上市和迅雷的未来担忧&#xff0c;这家像工程师一样的公司&#xff0c;命运会怎样&#xff0c;他们未来会如何走下去&#xff1f;对此CSDN专访了迅雷首席工程师刘…

YASnippet - emacs 的代码片段管理工具

添加 snippet M-x 然后输入 yas-new-snippet 回车 RET&#xff0c;会出现一个新的 buffer # -*- mode: snippet -*-# name: # key: # --在出现的 buffer 中填写相应的数据 # -*- mode: snippet -*-# name: vard# key: vard# --echo <pre>;var_dump($0);die;c-x c…

深入vuex原理(上)

前言 vuex作为vue生态的重要组成部分&#xff0c;是对store进行管理的一柄利剑。简而言之&#xff0c;vuex是vue的状态管理器。使用vuex可用使数据流变得清晰、可追踪、可预测&#xff0c;更可以简单的实现 类似时光穿梭 等高级功能&#xff0c;对于复杂的大型应用来讲&#xf…

Maven入门(含实例教程)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Maven这个个项目管理和构建自动化工具&#xff0c;越来越多的开发人员使用它来管理项目中的jar包。接下来小宝鸽&#xff0c;将从下面几个…

进阶正则表达式

本文同步自我的博客园&#xff1a;http://www.cnblogs.com/hustskyking/ 关于正则表达式&#xff0c;网上可以搜到一大片文章&#xff0c;我之前也搜集了一些资料&#xff0c;并做了排版整理&#xff0c;可以看这篇文章http://www.cnblogs.com/hustskyking/archive/2013/06/04/…

tkinter拦截关闭事件

import tkinter as tk from tkinter import messageboxroot tk.Tk()def on_closing():if messagebox.askokcancel("Quit", "Do you want to quit?"):root.destroy()root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop() 转载于:htt…

阿里云服务器一分价钱一分货,切记!

阿里云为了满足低端市场的需求&#xff0c;会推出一些价格非常便宜的机器&#xff0c;但是这些机器是为新手练手用或者做测试用的&#xff0c;性能不行。你不要指望花每月9.5元&#xff0c;买一台学生机&#xff0c;就可以放置流量大的网站还不卡&#xff0c;那个不现实。阿里云…

请记住:你的付出都会以该有的方式归来(图)

人&#xff0c;这一生就像一个耕种的农民。你不是在付出&#xff0c;就是在收获。当然&#xff0c;有人说&#xff0c;付出并不一定有回报。这是大多数人都认同的&#xff0c;也就是付出与得到不一定成正比&#xff0c;不是付出的越多就得到的越多。但我想告诉你的是&#xff0…

c++primer plus笔记

> 第六版 操作符重载 #include<iostream> using namespace std;class Time { public:Time(){hm0;}Time(int _h,int _m){h _h;m _m;}void show(){printf("%02d:%02d \n",h,m);}Time operator(const Time &t){Time result;result.m t.m m;result.h t…

Luogu P3975 [TJOI2015]弦论

题目链接 \(Click\) \(Here\) 题目大意&#xff1a; 重复子串不算的第\(k\)大子串重复子串计入的第\(k\)大子串写法&#xff1a;后缀自动机。 和\(OI\) \(Wiki\)上介绍的写法不太一样&#xff0c;因为要同时解决两个问题。 把字符串每个前缀所在等价类的\(siz\)记为\(1\)&#…

《 图解 HTTP 》读书笔记

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. TCP/IP 协议族按层次分为&#xff1a;应用层、传输层、网络层、数据链路层。 2. IP 协议的作用是把各种数据包传送给对方。 3. IP …