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装饰器即可把其装饰的方法变为一 ...
随机推荐
- U-Boot启动过程
开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数.看一下board/smdk2410/u-boot.lds这个链接脚本,可以知道目标程序的各部分链接顺序.第一个要链接的是c ...
- Sublime Text [Decode error - output not utf-8]
改Sublime Text的python build的设置.将其编码设置为cp936. 打开Python.sublime-build文件,并添加”encoding”:”cp936″这一行,保存即可 S ...
- bootstrap 幻灯大图结合dedecms的autoindex
<div class="container" id="banner"> <div id="carousel-example-gene ...
- dojo省份地市级联之省份封装类(一)
省份封装类 Province.java /** * 省份封装类 */ package com.you.model; import java.io.Serializable; /** * @author ...
- php 连接mssql
以前用的都是mysql,今天突然想用下mssql,起先用的是sql server200. 第一种方法 打开mssql.dll拓展.然后把mssql.secure_connection = off改为o ...
- Linux显示邮件状态等信息
Linux显示邮件状态等信息 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ finger -l Login: youhaidong Name: youhaid ...
- QOpenGLTexture 两个纹理叠加
如何做纹理混合? 方法是,定义多个QOpenGLTexture,然后在fragment shader中添加相应的变量,然后把texture bind到对应的uniform变量上. 废话不多说 text ...
- 【转载】Spark运行架构
1. Spark运行架构 1.1 术语定义 lApplication:Spark Application的概念和Hadoop MapReduce中的类似,指的是用户编写的Spark应用程序,包含了一个 ...
- Spring AOP介绍
1.介绍 AOP(面向切面编程)对OOP(面向对象编程)是一种补充,它提供了另一种程序结构的思路.OOP的模块单元是class,而AOP的模块单元是aspect.Spring中一个关键的组件是AOP框 ...
- 【BZOJ1969】航线规划(Link-Cut Tree)
[BZOJ1969]航线规划(Link-Cut Tree) 题面 BZOJ 题解 删边操作 套路呀 离线读入倒过来做 变成加边操作 现在考虑怎么确定两点直接的关键路径条数 如果是一棵树,那么每条边都是 ...