day11-函数对象、名称空间和作用域
函数对象
在Python中,一切皆对象,函数也是一类对象。即函数也具有以下特性
1.可以被引用,赋值:将函数赋值给a
# 定义一个self_max函数
def self_max(x, y):
if x > y:
return x
return y
a = self_max
2.可以当做函数的返回值:将函数f2当做函数f1的返回值
def f2():
print('from f2')
def f1():
return f2
f = f1()
print(f) # 打印结果<function f2 at 0x00000176C99FF1E0>
print(f2) # 打印结果<function f2 at 0x00000176C99FF1E0>
3.可以当作函数参数传递
def f1():
print('from f1')
def f2(m):
return m
f = f2(f1)
f() # 执行了f1(),打印出'from f1'
4.可以当作容器类型的元素
def f1():
print('from f1')
s_list = ['str',1,f1]
s_list[2]() # 执行了f1(),打印出'from f1'
函数的嵌套
函数的嵌套就是在函数体中再定义函数
def f1():
def f2():
print('from f1')
f2()
f1()
举个例子:根据输入的指令求圆的周长和面积
from math import pi
def circle(r, action):
if action == 'a':
# 在函数里定义求圆面积的函数
def area():
return pi * r **2
res = area()
return res
elif action == 'p':
# 在函数里定义求圆周长的函数
def perimeter():
return pi * r *2
res = perimeter()
return res
else:
return "error"
r = int(input('请输入半径》》》').strip())
action_choice = input("请输入选择的功能,a表示求面积,p表示求周长》》》").strip()
res = circle(r, action=action_choice)
print(res)
名称空间和作用域
就是用来存放名字的地方。分成内置名称空间、局部名称空间和全局名称空间
内置名称空间
我们所学的内置方法如len(),其实就是一个个函数。python在启动的时候就会定义这些函数,并把这些函数丢入到内存空间,这个内存空间就叫做内置名称空间。
生命周期:从python启动的时候就生效,直到python关闭
全局名称空间
除了内置名称空间和局部名称空间就是全局名称空间
生命周期:程序文件运行的时候生效,直到程序运行结束
局部名称空间
函数内部的都叫局部名称空间,也就是函数内部定义的名字都放入了局部名称空间中了
生命周期:函数运行的时候生效,直到函数运行结束
小结:
名称空间的执行顺序:内置名称空间 ---> 全局名称空间 ---> 局部名称空间
名称空间的查找顺序:局部名称空间 ---> 全局名称空间 ---> 内置名称空间。从当前名称空间开始查找,然后逐步往上
作用域
作用域就是作用的区域,分为全局作用域和局部作用域
全局作用域
全局有效,全局存活,包含内置名称空间和全局名称空间。即全局可以修改内置的,内置可以修改全局的
x = 1
def f1():
def f2():
print(x)
return f2()
f1() # 打印出 1
局部作用域
只能使用于局部范围,在局部定义的名字只能在局部获取
def f1():
def f2():
print(x)
x = 2
return f2()
f1() # 打印出2
注意点:1. 作用域关系在函数的定义阶段就固定死了,与函数的调用无关
2. 函数与函数之间可能会有相同名字的变量,但是这两个变量毫无关系,作用域不同
x= 1000
def f1():
x = 1
def f2():
print(x) # 打印 1,在定义阶段 x=1,与函数调用无关
return f2
f2 = f1()
x = 10
def f3():
x = 15
f2()
f3()
global和nonlocal
global:在局部修改全局变量,声明是全局变量
x = 1
def f1():
global x # 声明x是全局变量
x = 2
f1()
print(x) # 运行函数后,修改了x的值,打印结果为2
nonlocal:把局部改成外部
def f1():
x= 1
def f2():
nonlocal x # 声明x是外部,嵌套函数的内部的外部,不能修改全局的
x = 3
f2()
print(x)
f1()
day11-函数对象、名称空间和作用域的更多相关文章
- day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义
复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...
- Python 函数对象-函数嵌套-名称空间与作用域-闭包函数
今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...
- python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套
复习 1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用: # 字符串的比较# -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...
- python 函数的名称空间及作用域
一:名称空间 1:什么是名称空间: 名称空间即:储存名字与值的内存地址关联关系的空间 2.名称空间的分类: 内置名称空间:存储器自带的一些名称与值的对应关系,如:print,len,max等; 生命周 ...
- day12 函数对象,名称空间与作用域
""" 今日内容: 1.函数参数传值细节 2.三元表达式 3.列表及字典推导式 4.函数对象 5.名称空间与作用域 6.函数的嵌套定义初识 ""&qu ...
- PYTHON-函数对象,嵌套,名称空间与作用域,闭包函数
一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 def foo(): return len f = foo pri ...
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域
一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...
- Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)
今日主要内容 1. 函数默认值细节(*) 2. 数据类型补充:三元表达式.列表推导式.字典推导式 (***) 3. 函数对象:函数名的各种应用场景 (*****) 4. 名称空间与作用域:解释 ...
- python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义
复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...
- 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数
一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...
随机推荐
- DATASNAP压缩过滤器的使用
ZLIBCOMPRESSION FILTER 作为范例,我们使用已随D2010提供的DataSnap过滤器.可用于在客户端和服务端压缩数据流.这里说的ZlibCompression过滤器可以在DbxC ...
- Codeforces Round #245 (Div. 1)——Guess the Tree
题目链接 题意: n个节点,给定每一个节点的子树(包含自己)的节点个数.每一个节点假设有子节点必定大于等于2.求这种数是否存在 n (1 ≤ n ≤ 24). 分析: 用类似DP的思路,从已知開始.这 ...
- 推断client手机类型,并跳转到对应的app下载页面
实现的原理,是检測浏览器的 USER-AGENT 这个header,然后依据正則表達式来确定client类型. 假设都不匹配,Fallback回退策略是显示相应的页面.让用户自己选择. 适合採用二维码 ...
- 【bzoj3105】【cqoi2013】【新Nim游戏】【线性基+贪心】
Description 传统的Nim游戏是这种:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量能够不同).两个游戏者轮流操作,每次能够选一个火柴堆拿走若干根火柴.能够仅仅拿一根,也能够拿走整堆火柴 ...
- Android开发之利用SQLite进行数据存储
Android开发之利用SQLite进行数据存储 Android开发之利用SQLite进行数据存储 SQLite数据库简单介绍 Android中怎样使用SQLite 1 创建SQLiteOpenHel ...
- 已知目标qps跟并发用户数20,压测平均响应时间实例
Jmeter性能测试案例(一) 转:https://blog.csdn.net/lovesoo/article/details/78579547 测试需求:测试20个用户访问网站在负载达到30QPS时 ...
- HTTPS那些事 用java实现HTTPS工作原理
HTTPS那些事 用java实现HTTPS工作原理 博客分类: java历险 今天被问到关于https原理的问题,结果由于知识掌握不牢靠,停留于表面,很多细节都无法回答清楚,于是决定把https的 ...
- 2017iOS开发最新的打包测试步骤(亲测)
最近也是忙着修改项目,今天把最近遇到的问题和知识给大家分享一下. 有时候我们需要将我们的项目发给测试组进行bug测试,这时候我们就需要把自己的项目打包,生成一个二维码或者链接的形式,给测试组,接下来就 ...
- 详细解析Linux scp命令的应用(转载)
转自:http://os.51cto.com/art/201003/187301.htm Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程 ...
- nginx初相识
在本机上下载了一个nginx,版本为1.14.0. 安装: 对于安装比较简单,下载后解压到指定目录,目录结构如下 启动: 最简单的直接双击nginx.exe,有黑窗一闪而过,不要怀疑,看一下logs的 ...