函数二----函数的进阶

一、命名空间(有三种)

  1.内置的命名空间   -----python解释器

    就是python解释器一启动就可以使用的名字存储再内置的命名空间中

    内置的名字在启动解释器的时候被加载进内存里。

  2.全局命名空间    -----我们写的代码,但不是函数中的代码

    是在程序从上到下被执行的过程中依次加载进内存的

    放置了我们设置的所有变量名和函数名

  3.局部命名空间   -----函数

    就是函数内部定义的名字

    当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,这个命名空间就又消失了

 三种命名空间之间的加载顺序:

   内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

#在局部:可以使用全局、内置命名空间中的名字#在全局:可以使用内置命名空间中的名字,但是不能用局部中命名空间中的名字#在内置:不能使用全局、局部命名空间中的名字
def func():
    a = 1
func()
print(a)   #因为全局没有a这个变量,它不可能去找func函数里的这个a变量,所以会报错
#在正常情况下,直接使用内置的名字#当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字#当我自己有的时候,我就不找我的上级要了#如果自己没有,就找上一级要,上一级没有再找上一级,如果内置的名字空间都没有,就报错#多个函数应该拥有多个独立的局部命名空间,不互相共享
def input():
    print(‘in input now‘)

def func():
    # input = 1
    print(input)
func()    # <function input at 0x0000028967220378>  ---函数的内存地址()

#func  ---> 函数的内存地址
#函数名()  --->函数的调用
#函数的内存地址()   --->函数的调用

二、作用域

#全局作用域  ---作用在全局 ---内置和全局名字空间中的名字都属于全局作用域---globals()#局部作用域  --- 作用在局部  --- 函数(局部名字空间中的名字属于局部作用域)---locals可以查看
a = 1
def func():
    return a
print(func())  # 1

a = 1
def func():
    global a
    a += 1
func()
print(a)  #2
func()
print(a)  #3

a = 1
def func(a):
    a = 2
    return a
a = func(a)
print(a)  #2
#对于不可变数据类型,在局部可以查看全局作用域中的变量,但是不能直接修改#如果想要修改,需要在程序的一开始添加global声明#如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局变量有效
a = 1
b = 2
def func():
    x = ‘aaa‘
    y = ‘bbb‘
    print(locals())  # {‘x‘: ‘aaa‘, ‘y‘: ‘bbb‘}
    print(globals())

func()
print(globals())
print(locals())  #本地的,放在全局,全局就是本地;放在局部,局部就是本地
#globals  永远打印全局的名字#locals   输出什么,根据locals所在的位置

原文地址:https://www.cnblogs.com/huangjm263/p/8125773.html

时间: 2024-10-29 01:12:18

函数二----函数的进阶的相关文章

Lua进阶(二)——函数环境、包

函数环境 function foo() print(g or "No g defined!") end foo() setfenv(foo, { g = 100, print = print }) --设置foo的环境为表{ g=100, ...} foo() print(g or "No g defined!") --No g defined! --100 --No g defined! 定义:函数环境就是函数在执行时所见的全局变量的集合,以一个表来承载. 说明:

二.函数进阶

阅读目录 楔子 命名空间和作用域 函数嵌套及作用域链 函数名的本质 闭包 本章小结 返回顶部 楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print(bigger) 之前是不是我告诉你们要把结果return回来你们就照做了?可是你们有没有想过,我们为什么要把结果返回?如果我们不返回m,直接在程序中打印,行不行? 来看结果: >>> def my

通达信财务函数与股票公式进阶篇[转]

http://blog.sina.com.cn/s/blog_676348b301018f6v.html 通达信财务函数与股票公式进阶篇[转] (2012-12-09 17:38:13) 转载▼ 标签: 杂谈   FINANCE(1) 总股本(万股)FINANCE(2) 国家股(万股)FINANCE(3) 发起人法人股(万股)FINANCE(4) 法人股(万股)FINANCE(5) B股(万股)FINANCE(6) H股(万股)FINANCE(7) 流通股本(万股)CAPITAL 流通股本(手)

python基础10(函数二)

一.函数形参和实参的区别 形参全称是形式参数,在用def关键字定义函数时函数名后面括号里的变量称作为形式参数. 实参全称为实际参数,在调用函数时提供的值或者变量称作为实际参数. >>> def add(a,b): #这里的a和b是形参 return a+b >>> add(1,2) # 这里的1和2是实参 3 >>> x=2 # 这里的x和y是实参 >>> y=3 >>> add(x,y) 5 二.参数的传递和改变

JavaScript 闭包系列二 --- 匿名函数及函数的闭包

一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {    return 2*x;} 2)Function构造函数,把参数列表和函数体都作为字符串,不方便,不建议使用 var double = new Function('x', 'return 2*x;'); 3)函数表达式方式 var double = function(x) {    return 2*x;} 该形式中,等号右边是一个匿名函数,创建函数完毕后,将该函数赋给了变量doubl

php深入学习笔记二( 函数内置函数 )

1. call_?user_?func_?array 调用用户自定义函数,第一个参数是函数名, 第二个参数是函数的参数 必须是是一索引数组 function foobar($arg, $arg2) { echo __FUNCTION__, " got $arg and $arg2\n"; } class foo { function bar($arg, $arg2) { echo __METHOD__, " got $arg and $arg2\n"; } } //

二 函数对象、函数嵌套

一 函数对象 一.函数是第一类对象,即函数可以当作数据传递 二.利用该特性,优雅的取代多分支的if 二 函数嵌套 一.函数的嵌套调用 二.函数的嵌套定义 一 函数对象 一.函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二.利用该特性,优雅的取代多分支的if 1 def foo(): 2 print('foo') 3 4 def bar(): 5 print('bar') 6 7 dic={ 8 'foo'

C#中的函数(二) 有参有返回值的函数

接上一篇 C#中的函数(-) 无参无返回值的函数 http://www.cnblogs.com/fzxiaoyi/p/8502613.html 这次研究下C#中的函数(二) 有参有返回值的函数 依然写一个小例子,用来测试 跟上一个例子差不多,区别就是MyFunction有二个参数a,b,返回二个数相加的值 F5调试运行,中断后转到反汇编 这里很明显看到不同了 这里就得讲到参数传递的方式,参数从左向右依次存入寄存器ecx edx 但是不同的编程语言有不同的传递参数的方式,有空再写一篇文章介绍下 要

python学习【第四篇】python函数 (二)

一.装饰器 装饰器:本质就是函数,功能是为其它函数添加附加功能 装饰器的原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方式 装饰器的知识储备: 装饰器 = 高阶函数 + 函数嵌套 + 闭包 二.高阶函数 高阶函数的定义: 函数的接收参数是一个函数名 函数的返回值是一个函数名 满足上述条件任意一个都可以是高阶函数 import time def fun1(): time.sleep(0.5) print("hello") def computing_run_time(fun):