python函数-函数进阶

一、命名空间和作用域

1.命名空间

内置命名空间 —— python解释器
    就是python解释器一启动就可以使用的名字存储在内置命名空间中
    内置的名字在启动解释器的时候被加载进内存里
全局命名空间 —— 我们写的代码但不是函数中的代码
     是在程序从上到下被执行的过程中依次加载进内存的
    放置了我们设置的所有变量名和函数名
局部命名空间 —— 函数
    就是函数内部定义的名字
    当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了 在局部:可以使用全局、内置命名空间中的名字 在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
在内置:不能使用局部和全局的名字的

在正常情况下,直接使用内置的名字
当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
当我自己有的时候 我就不找我的上级要了
如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
多个函数应该拥有多个独立的局部名字空间,不互相共享

2.作用域

全局作用域:内置命名空间、全局命名空间

局部作用域:局部命名空间

3.global关键字

对于不可变的数据类型,在局部可以查看全局作用域中的变量,但是不能修改,如果想在局部作用域中对全局作用域的不可变数据类型变量进行修改,需要在局部开始加上global声明

x = 1 # 全局作用域的不可变数据类型变量x
def func():
global x # 在局部作用域中对其进行声明
x = 2 # 声明后则可以在局部作用域中对其进行修改操作
func()
print(x) # 局部作用域将全局作用域的不可变数据类型变量修改后,在全局作用域中打印,其值被修改

4.locals()、globals()函数

①globals():输出全局作用域的所有变量

②locals():输出当前作用域的所有变量

  

a = 1
def func():
a = 666
print('函数内部的locals:'+str(locals()))
func() print('函数外部的globals:'+str(globals()))
print('函数外部的locals:'+str(locals())) >>> 函数内部的locals:{'a': 666}
>>> 函数外部的globals:{'__doc__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000653EF0>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__spec__': None, '__author__': 'Elijah', '__file__': 'D:/python_fullstack_s9/day10/practice.py', '__date__': '2017/12/27 8:33', 'func': <function func at 0x000000000070E6A8>, 'a': 1, '__package__': None}
>>> 函数外部的locals:{'__doc__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000653EF0>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__spec__': None, '__author__': 'Elijah', '__file__': 'D:/python_fullstack_s9/day10/practice.py', '__date__': '2017/12/27 8:33', 'func': <function func at 0x000000000070E6A8>, 'a': 1, '__package__': None}

③global关键字

a = 1
def func():
global a
a = 666
func() print('此时a的值:' + str(a))
>>> 此时a的值:666

④nonlocal和global 

global---在局部声明一个全局变量

nonlocal--在局部声明最近的上一层局部中的变量

nonlocal

1.对全局无效
2.对局部,也是对最近的一层有影响
3.只能用于局部变量,找上层中离当前函数最近一层的局部变量
4.声明了nonlocal的内部函数的变量,修改会影响到离当前函数最近的一层的局部变量

 

a = 0
def func():
#a = 1
def inner():
a = 2
def inner2():
nonlocal a
inner2()
inner()
func()

5.函数的嵌套

def outer():
print('this is outer!')
def inner():
print('this is inner!')
inner()
outer()

6.作用域链 

小范围用变量的时候,先从自己的命名空间查找,找不到就一层一层向外层找,知道找为止,找不到就报错

a = 1
def outer():
a = 1
def inner():
a = 2
def inner2():
nonlocal a #声明了一个上面第一层局部变量
a += 1 #不可变数据类型的修改
inner2()
print('##a## : ', a)
inner()
print('**a** : ',a) outer()
print('全局 :',a)

7.函数名的本质 

①可以被赋值

②可以被当作容器类型的元素

③可以当作函数的参数和返回值

第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体

8.闭包  

①内部函数调用对外部函数,还是嵌套函数称为闭包函数

def outer():
a = 1
def inner():
print(a)
return inner
inn = outer()
inn()

②判断闭包函数的方法__closure__

  

#输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner f = func()
f() #输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner f2 = func2()
f2()

  



python函数-函数进阶的更多相关文章

  1. python基础 (初识函数&函数进阶)

    函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  2. python基础之 初识函数&函数进阶

    函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  3. 【转】Python之函数进阶

    [转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...

  4. 小学生都能学会的python(函数的进阶)

    小学生都能学会的python(函数的进阶) 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def fun ...

  5. Python之函数进阶

    本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...

  6. day09 python之函数进阶

    楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...

  7. python学习——函数进阶

    首先来看下面这个函数. def func(x,y): bigger = x if x > y else y return bigger ret = func(10,20) print(ret) ...

  8. Python之函数——进阶篇

    嵌套函数 ---函数内部可以再次定义函数 ---函数若想执行,必须被调用 注意,下例中,执行结果为什么? age = 19 def func1(): print(age) def func2(): p ...

  9. 9.Python初窥门径(函数初识)

    Python(函数初识) 一.初识函数 面向过程缺点 : 代码重复,代码描述性不高 函数 : 函数是以功能为导向,一个函数封装一个功能. 函数的优点 : 减少代码重复性,增强了代码的可读性 二.函数的 ...

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 图片:响应式图片

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 2018--Linux面试题

    1.企业场景面试题:buffer与Cache的区别. 2.企业场景面试题:redhat与CentOS的区别. 3.企业场景面试题:  描述RAID 0 1 5 10的特点. 4.企业场景面试题:32位 ...

  3. DEDE后台升级后不显示编辑器

    dede5.7不显示编辑器不能编辑文章的解决办法:进入系统后台系统配置-系统基本参数-核心设置将fck换成ckeditor保存,当然需要fck编辑器也可以到dede官网下载.dede5.7不显示编辑器 ...

  4. Golang gin开源实例——表设计

    UML Model 基本模型定义 type Model struct { ID int `gorm:"primary_key" json:"id"` Creat ...

  5. println 与 print区别

    ------------恢复内容开始------------ println 与 print区别: 1.print输出之后不换行,如下: public class Newstart {    publ ...

  6. 007.Oracle数据库 , 使用%进行模糊查询

    /*Oracle数据库查询日期在两者之间*/ SELECT PKID, OCCUR_DATE, ATA FROM LM_FAULT WHERE ( ( OCCUR_DATE >= to_date ...

  7. maven package跳过测试

    mvn clean package -DskipTests 或者 mvn clean package -Dmaven.test.skip=true 区别 -DskipTests,不执行测试用例,但编译 ...

  8. ACM-最优配餐

    题目描述: 最优配餐  时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问 ...

  9. Eclipse新建Maven中创建src文件夹报The folder is already a source folder错误解决办法

    问题: 解决办法:右击项目->Build Path->Configure Build Path选择(missing)文件夹remove,然后重新New Source Folder

  10. 剑指offer自学系列(五)

    题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...