目录:

1、函数对象

2、函数嵌套

3、名称空间

4、作用域

函数是第一类对象

1、函数名是可以被引用:

def index():
print('from index') a = index
a()

2、函数名可以当做参数传递

def foo(x,y,func):
print(x,y)
func()
def bar():
print('from bar') foo(1,2,bar) 结果:
1 2
from bar

3、函数名可以当做返回值使用

传参的时候没有特殊需求,一定不要加括号,加括号当场执行了

def index():
print('from index') def func(a):
return a a=func(index)
print(a) # <function index at 0x0000000000451E18>
a() # from index

4、函数名可以被当做容器类型的元素

def func():
print('from func') l1 = [1, '', func, func()] # 参数里有函数名和括号,直接运行, 输出from func f = l1[2]
print(f) # <function func at 0x0000000001D01E18>
def register():
print('register')
def login():
print('login')
def shopping():
print('shopping')
def pay():
print('pay') func_dic={'':register,'':login,
'':shopping,'':pay
} def main():
while True:
print("""
1.注册
2.登陆
3.购物
4.付款
5.退出
""")
choice = input("请输入对应的编号:").strip()
if choice=='':
break
if choice not in func_dic:
continue
else:
func_dic[choice]()
main()

函数的嵌套调用:在函数内调用函数

def index():
print('from index')
def func():
index()
print('from func')
func()
def func1(x,y):
if x>y:
return x
else:
return y def func2(x,y,z,a):
result=func1(x,y)
result=func1(result,z)
result=func1(result,a)
return result print(func2(1,2,454,7))  #454

函数的嵌套定义:

def index():
def home():
print('from home')
home() index() #from home

名词空间

什么是名称空间?
  存放名字的空间

如果你想访问一个变量值,必须先方向对应的名称空间,拿到名字和对应的内存地址的绑定关系

名称空间的分类:
  1、内置名称空间:
    python提前给你的定义完的名字,就是存在内置名称空间
  2、全局名称空间  
    存放于文件级别的名字,就是全局名称空间
    if while for 内部定义的名字执行之后都存放于全局名称空间
  3、局部名称空间
    函数内部定义的所有名字都是存放于当前函数的内置名称空间

生命周期:
  1、内置名称空间
    在python解释器启动的时候生效,关闭解释器的时候失效
  2、全局名称空间
    当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效
  3、局部名称空间
    当你调用当前函数时生效,函数体最后一行代码执行结束就失效

def index():
x = 1 #
return x
print("index1",index) #全局空间打印全局空间函数 index1 <function index at 0x0000000002061E18>
def foo():
print("index2",index) #局部空间调用全局变量 index1 <function index at 0x0000000002061E18>
foo() print(print) #全局空间打印内置空间函数 <built-in function print> def index():
print(print) #局部空间打印内置空间函数 index() # <built-in function print>
if 1 == 1:
x = 1 #全局空间 print(x) while True:
a = 2
break print(a) #全局空间
for i in range(2):
print(i) print(i) # 1 打印最后一个i值

名称空间的查找顺序:

  局部:局部 > 全局 > 内置
  全局:全局 > 内置    # 内置再找不到就报错
函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关(变量在局部内,函数嵌套关系会寻找上层;如果是函数互相调用,变量与其他函数变量无关)

x = 111
def func1():
x = 222
def func2():
x = 333
def func3():
# x = 444
def func4():
# x = 555
print(x) #调用嵌套最近的x,也就是x=333
print('from func4')
func4()
func3()
func2()
func1() #
x = 1

def wrapper():
x = 2
index() def index():
# x = 3
print(x) #找不到x,去全局变量找 wrapper() # 1
x = 1
def inner():
x = 2
def wrapper():
print(x)
wrapper() inner() #
x = 1

def index(arg = x): # 定义的时候,arg就被赋值了1
print(x)
print(arg) x = 2
index()
'''
2
1
'''
x = 111
def index():
def wrapper():
print(x) return wrapper
# return wrapper index()
x = 222
f = index()
f() #

作用域的分类:
  1、全局作用域
    全局可以调用的名字就存在于全局作用域

    内置名称空间+全局名称空间
  2、局部作用域
    局部可以调用的名字就存放与局部作用域
    局部名称空间

global:声明全局变量(***)
nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量(*)

只有可变类型可以在局部修改外部变量的值 (*****)

错误案例:

b=2
def bar():
b+=3 # 报错,此处无法修改全局变量,但可以查询,如a=b return b
print(bar())
x=1

def index():
global x # 不可以写 global x =2
x=2
index() print(x) #
x=111
def index():
x=1
def func2():
x = 2
def func():
nonlocal x #局部变量关联上层,修改上层局部变量x
x = 3
func()
print(x) #
func2()
print(x) #
index()
print(x) # 111
# 局部变量的修改无法影响上层,上上层
def index():
x=1
def index2():
nonlocal x
x=2
index2()
print(x) index()

**可变类型可以在局部修改外部变量的值

l1=[]
def index(a):
l1.append(a)
print(l1) #[[...]]
index(l1) print(l1) #[[...]]
def func1():
l1=[1,2,3,4,5]
def func2():
l1.append(6)
return
func2()
print(l1) # [1, 2, 3, 4, 5, 6] func1()
print(l1) # [8, 8, 8]

python基础语法6 名称空间与作用域的更多相关文章

  1. python基础之函数名称空间与作用域

  2. python函数篇:名称空间、作用域和函数的嵌套

    一.名称空间:(有3类) (1)内置名称空间(全局作用域) (2)全局名称空间(全局作用域) (3)局部名称空间(局部作用域) 关于名称空间的查询: x=1 def func(): print('fr ...

  3. python基础知识13---函数对象、函数嵌套、名称空间与作用域、装饰器

    阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 1 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 ...

  4. python基础之函数对象,嵌套,名称空间和作用域

    函数对象: 函数是第一类对象的含义是函数可以被当作数据处理 函数可用于: def func(): print(‘func’) 1.引用  f = func  把内存地址赋值给f 2.当作参数传给一个函 ...

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

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

  6. python之函数对象、函数嵌套、名称空间与作用域、装饰器

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

  7. python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域

    复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参:       -- 形参:在函数定义时()中出现的参数       ...

  8. Python 的名称空间和作用域

    最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...

  9. python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器

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

随机推荐

  1. hive 批量添加,删除分区

    一.批量添加分区:   use bigdata; alter table siebel_member add if not exists partition(dt='20180401') locati ...

  2. centos配置chrome+selenium

    参考资料 https://blog.csdn.net/wkb342814892/article/details/81591394 1. 安装chrome-browser wget https://dl ...

  3. 可靠性、幂等性和事务 Kafka

    Kafka笔记—可靠性.幂等性和事务   分类: 消息队列 标签: kafka 这几天很忙,但是我现在给我的要求是一周至少要出一篇文章,所以先拿这篇笔记来做开胃菜,源码分析估计明后两天应该能写一篇.给 ...

  4. POJ-动态规划-典型问题模板

    动态规划典型问题模板 一.最长上升子序列(Longest increasing subsequence) 状态(最关键):f[N]为动规数组,f[i]表示从第一个字符开始,以a[i]为最后一个字符的序 ...

  5. SQLServer --------- 将sql脚本文件导入数据库

    创建数据库方法有两种 第一种通过图形化的操作界面 第二种通过 sql 语句 sql server 如何执行.sql 文件,的原理就是执行sql语句进行创建 打开数据库后找到   最左侧文件 找到需要执 ...

  6. JavaSE 笔试题: 自增变量

    JavaSE 笔试题 自增变量 public class Test { public static void main(String[] args) { int i = 1; i = i++; int ...

  7. jmeter通过BeanShell,实现对接口参数HmacSHA256加密(转)

    jmeter通过BeanShell,实现对接口参数HmacSHA256加密2019-04-29 05:10 ps. 最近抓包网站的登陆请求,发现就2个参数,用户名和密码,通过工具去请求这个接口,一直返 ...

  8. Java学习:接口(interface)的使用于注意事项

    接口 接口就是一种公共的规范标准.只要符合规范标准,就可以大家通用. 接口就是多个类的公共规范.接口是一种引用数据类型,最重要的内容就是其中的:抽象方法. 如何定义一个接口的格式 如何定义一个接口的格 ...

  9. Java多线程分批发送消息的小例子

    需求: 假设有10万个用户,现在节假日做活动,需要给每个用户发送一条活动短信,为了提高程序的效率,建议使用多线程分批发送. 这里值得注意的是: 每开一个线程都会占用CPU的资源,所以线程根据所需要的条 ...

  10. VS web停止调试后关闭浏览器