一、函数对象

函数是第一类对象:值的内存地址可以像变量一样去使用
def foo():#foo=函数的内存地址,可以当做一种变量值去使用
1、函数可以被引用

def foo():
  print('hello')
f=foo
print(f)
f()

2、可以当作参数传递

def foo():
  print('hello')
f=foo
print(f)
f()

3.可以当做函数的返回值

def foo():
  print('hello')
def func(x):
  return(x)
f=func(foo)
print(f)

4.可以当做容器类的元素


def foo():
  print('hello')
dic={'1':foo}
print(dic)
dic['1'](https://www.cnblogs.com/zhuyuanying123--/p/10952117.html)

def register():
  print('注册')
def login():
  print('登录')
def pay():
  print('支付')
def transfer():
  print('转账')
dic_choice={'1':register,'2':login,'3':pay,'4':transfer}
while True:
  print('''
  0 退出
  1 注册
  2 登录
  3 支付
  4 转账
  ''')
  choice=input('请输入你的操作:').strip()
  if choice == '0':break
  if choice not in dic_choice:
    print('输入有误,请重新输入')
    continue
  dic_choice[choice](

二.函数嵌套

函数的嵌套调用:在一个函数内部调用其他函数

def max2(x,y):
  if x > y:
  return x
else:
  return y

def max4(a,b,c,d):
  res1=max2(a,b)
  res2=max2(res1,c)
  res3=max2(res2,d)
  return res3
函数的嵌套定义:在函数内又定义了其他函数

from math import pi

def circle(radius,mode=0):
  def perimiter(radius):
    return 2 * pi * radius

  def area(radius):
    return pi * (radius ** 2)

  if mode == 0:
    return perimiter(radius)
  elif mode == 1:
    return area(radius)

circle(10,0)

三.名称空间和作用域

存放名字与值内存地址绑定关系的空间 

def outter():
    x=1111
    def inner():
    print(x)
    return inner

  f=outter()

  def foo():
    x=2222
    f()

  foo()
输出的是1111
1. len()是python的内置方法,python启动的时候,就会定义len()函数,并且把len()丢入内存空间,这个
内存空间叫做内置名称空间
生命周期: python启动的时候就活了,python关闭了就死了

2. 全局名称空间: 除了内置和局部,就是全局
生命周期:程序/文件运行的时候才会活,运行完毕就死了
 
 3. 局部名称空间: 函数内部的都叫局部,也就是说函数内部定义的名字都放入了局部名称空间中了
生命周期: 函数运行的时候会活,运行完就死了
 python解释器打开的时候,执行顺序: 内置名称空间---> 全局名称空间 ---> 局部名称空间
 查找顺序: 从当前名称空间开始查找,然后逐步往上,如果当前为局部,则顺序为局部-->全局-->内置
  • 作用域(作用范围)
    域 指的是区域 范围的的意思
      全局的名称空间和内置的名称空间 在使用上没什么区别
      局部的 和 全局的内置的 就有区别了 局部定义的只能在局部使用

  给三个空间划分范围:
  全局的和内置可以划分为同一个范围
  global 全局作用域

  局部的单独划分为一个范围
  local 局部作用域

  globals()
  locals()

  查看全局作用域中的内容
  print(dir(globals()['builtins']))
  查看局部作用域中的内容 注意:在全局中使用locals 看到的就是全局的内容与globals没有区别

  print(globals())
  print(locals())

  age=18
  def func():
    age=19
    print(age) #19
  func()
  print(age) #18

  age=18
  def func():
    global age #明确声明要使用全局中的age
    age=19
    print(age) #19
  func()
  print(age) #19

  a=1
  def func():
    a=10
    def inner():
      a=100
      print(a) #100
    inner()
    print('这是func中a',a) #这是func中a 10
  func()
  print(a) #1

  a=1
  def func():
    a=10
    def inner():
      nonlocal a #明确声明要使用上一层中的a,如果上一层没有则找上上层,但是注意不能找到全局中
      a=100
      print(a) #100
    inner()
    print('这是func中的a',a) #这是func中的a 100
  func()
  print(a) #1
posted on 2019-05-31 14:54  gong^_^  阅读(126)  评论(0)    收藏  举报