python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域
一 、函数对象
一 、函数是第一类对象,即函数可以当作数据传递
可以被引用
可以当作参数传递
返回值可以是函数
可以当作容器类型的元素
二、 利用该特性,优雅的取代多分支的if
def foo():
print('foo') def bar():
print('bar') dic={
'foo':foo, #foo是内存地址
'bar':bar, #bar是内存地址
}
while True:
choice=input('>>: ').strip()
if choice in dic:
dic[choice]()
二 、函数嵌套
一 、函数的嵌套调用
在函数内又调用了其他函数
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():
def f2():
def f3():
print('from f3')
f3()
f2() f1()
f3() #报错,外部无法调用,可以考虑如何在外面使用函数里面的功能
三 、名称空间与作用域
一 、什么是名称空间?
名称空间:存放名字的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)
二、名称空间的分类
#1、内置名称空间:
#存放python解释器自带的名字,在解释器启动时就生效,解释器关闭就失效. #2、全局名称空间:
#文件级别的名字,在执行文件的时候生效,在文件结束或者文件执行期间被删除则失效 #3、局部名称空间:
#在函数内定义的名字,(函数的参数以及函数内的名字都存放与局部名称空间),在函数调用时临时生效,函数结束则失效
三 、名称空间的加载顺序(内置>全局>局部)
python test.py
#1、python解释器先启动,因而首先加载的是:内置名称空间
#2、执行test.py文件,然后以文件为基础,加载全局名称空间
#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
四 、名字的查找顺序 (局部>全局>内置)
#局部名称空间--->全局名称空间--->内置名称空间 #需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例 # max=1
def f1():
# max=2
def f2():
# max=3
print(max)
f2()
f1()
print(max)
五 、作用域
#1、作用域
#全局作用域(包含的是内置名称空间与全局名称空间的名字):
#特点:
#1、在任何位置都能够访问的到
#2、该范围内的名字会伴随程序整个生命周期
#(全局存活,全局有效)
# 局部作用域(局部名称空间的名字):
#特点:
#1、只能在函数内使用
#2、调用函数时生效,调用结束失效
#(临时存活,局部有效) #2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
x=1
def f1():
def f2():
print(x)
return f2
x=100
def f3(func):
x=2
func()
x=10000
f3(f1()) #3、查看作用域:globals(),locals() LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间
builtins 内置模块的名字空间
四、 闭包函数
一、 什么是闭包?
#定义在函数内部的函数,并且该函数包含对外部函数作用域中名字的引用
该函数就是闭包函数 #提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇 def outter():
x=2
def inner():
# x=1
print("from inner",x) return inner f =outter()
f() #x值为2
二 、闭包的意义与应用
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:“爬虫“(原来我们是传参,现在我们是包起来) import requests def outter(url): #url='https://www.baidu.com'
def get():
response=requests.get(url)
if response.status_code == 200:
print(response.text) return get baidu=outter('https://www.baidu.com')
python=outter('https://www.python.org')
baidu()
python()
python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域的更多相关文章
- 巨蟒python全栈开发-第10天 函数进阶
一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...
- python全栈开发-前方高能-内置函数2
python_day_15 一.今日主要内容 1. lambda 匿名函数 语法: lambda 参数:返回值 不能完成复杂的操作 2. sorted() 函数 排序. 1. 可迭代对象 2. key ...
- python 全栈开发,Day18(对象之间的交互,类命名空间与对象,实例的命名空间,类的组合用法)
一.对象之间的交互 现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人.现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法.有了狗类,我们还 ...
- python全栈开发day23-面向对象高级:反射(getattr、hasattr、setattr、delattr)、__call__、__len__、__str__、__repr__、__hash__、__eq__、isinstance、issubclass
一.今日内容总结 1.反射 使用字符串数据类型的变量名来操作一个变量的值. #使用反射获取某个命名空间中的值, #需要 #有一个变量指向这个命名空间 #字符串数据类型的名字 #再使用getattr获取 ...
- python全栈开发-Day13 内置函数
一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...
- Python全栈开发-Day6-面向对象编程
本节内容: 面向过程VS面向对象 面向对象编程介绍 类的语法 构造函数.析构函数 私有方法.私有属性 面向对象的特性:封装.继承.多态 1.面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法 ...
- python全栈开发day19-面向对象初识
1.昨日内容回顾 模块: 1.什么是模块,什么是包 py文件就是模块,包是包含一系列py文件(__init__.py)的文件夹. 2.模块的导入相当于相当于执行了导入的模块,首次 ...
- Python全栈开发day9
一.面向对象进阶 1.利用python反射查看面向对象成员 对于对象:反射既可以找对象,类的成员 对于类:反射只能找类中的成员 2.利用反射操作模块(查找类,创建对象,查找对象中字段) 1 2 3 4 ...
- Python全栈开发-Day7-面向对象编程2
本节内容: 1.面向对象高级语法部分 1)静态方法.类方法.属性方法 3)类的特殊方法 4)反射 2.异常处理 3.动态导入模块 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一 ...
随机推荐
- FusionCharts Marimekko图
1.Marimekko静态页面 Marimekko.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//E ...
- Flex和Java通信报错
1.错误描述 11-30 18:15:52 ERROR [localhost-startStop-1] org.springframework.web.servlet.FrameworkServlet ...
- 泛型集合、datatable常用数据类型转换Json帮助类
泛型集合.datatable常用数据类型转换Json帮助类 using System; using System.Data; using System.Configuration; using Sys ...
- C# Split 根据组合字符进行拆分数组用法
C# Split 根据组合字符进行拆分数组用法,如下代码: string sql = "aaaaaaaaaa{@}bbbbbbbbbb{@}ccccccc#cccccc"; //1 ...
- 芝麻HTTP:在无GUI的CentOS上使用Selenium+Chrome
各位小伙伴儿的采集日常是不是被JavaScript的各种点击事件折腾的欲仙欲死啊?好不容易找到个Selenium+Chrome可以解决问题! 但是另一个▄█▀█●的事实摆在面前,服务器都特么没有GUI ...
- 远程块存储iSCSI
/* Border styles */ #table-2 thead, #table-2 tr { border-top-width: 1px; border-top-style: solid; bo ...
- 最小生成树 TOJ 4117 Happy tree friends
链接http://acm.tju.edu.cn/toj/showp4117.html 4117. Happy tree friends Time Limit: 1.0 Seconds Memo ...
- MvcHtmlString解决MVC中从后台返回HTML代码被编码问题
(1) 要得到的效果 <a class="easyui-linkbutton" data-options="iconCls:'icon-add'" id= ...
- Linux之权限管理
一.文件基本权限 1) 基本权限的修改 第一位"-"为文件类型(-代表文件:d代表目录:l代表软链接文件即快捷方式),后面每3位一组. -rw-r--r-- rw- u所有者 ...
- HttpServletResponse,HttpServletRequest详解
1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletReq ...