函数初接触2

第十天


 

函数对象

函数是第一类对象

函数名是可以被引用的

def foo():
   print('hello wanglu')
a = foo
a()

函数名可以当做参数传递


def foo(a, b, doo):
   print(a, b, doo)
   doo()

def coo():
   print('hello wanglu')
foo(1,2,coo)

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

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

def foo():
   print('hello wanglu')
def doo(a):
   return a
a = doo(foo)
print(a)
a()

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

# 例题1
def foo():
   print('hello wanglu')
l1 = [1, '2', foo, foo()]
f = l1[2]
print(f)
f()
# 例题2
def register():
   print('register')
def login():
   print('login')
def shopping():
   print('shopping')
def pay():
   print('pay')
doo = {
   '1':register,
   '2':login,
   '3':shopping,
   '4':pay
}
def moo():
   while True:
       print('''
      1、注册
      2、登录
      3、购物
      4、付款
      5、退出
      ''')
       l1 = input('输入对应的编号:').strip()
       if l1 == '5':
           break
       elif l1 not in doo:
           continue
       else:
           doo[l1]()
moo()

函数的嵌套

在函数内调用函数

# 例题1
def foo():
   print('hello wanglu')
def coo():
   foo()
   print('ko ko da yo')
coo()
# 例题2
def foo(x,y):
   if x > y:
       return x
   else:
       return y
# print(foo(1,2))

def foot(x,y,z,w):
   roo = foo(x,y)
   roo = foo(roo,z)
   roo = foo(roo,w)
   return roo
print(foot(1,20,50,4444))

函数嵌套的定义

def foo():
   def coo():
       print('hello wanglu')
   coo()
foo()

名称空间


什么是名称空间

存放名字(变量名,函数名等)的空间


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


名称空间的分类

1、内置名称的空间

就是存储python提前给你定义好的名字,的空间

2、全局名称空间

存放于文件级别的名字,就是全局名称空间

如if、while、for内部定义的名字执行之后都存放于全局名称空间

3、局部名称空间

函数内部定义的所有名称都存放在当前函数的内置名称空间里


生命周期

1、内置名称空间

在python解释器启动的时候生效,关闭解释器的时候失效

2、全局名称空间

当你启动当前py文件时生效,当页面代码执行完毕时失效

3、局部名称空间

当你调用当前函数时生效,函数体最后一行代码执行结束就失效


 

名称空间的查找顺序:

局部:局部>全局>内置

全局:全局>内置 内置再找不到就报错

函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关

x = 111
def foo():
   x = 222
   def foo2():
       x = 333
       def foo3():
           x = 444
           def foo4():
               x = 555
               # print(x)
               print('hello wanglu')
           foo4()
       foo3()
   foo2()
foo()


# 例题2

x = 111
def foo():
   print(x)
   def foo2():
       print(x)
   return foo2
foo()

f = foo()
f()  # 打印三遍

作用域


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

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

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

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


# x = 1
#
# def index():
#     global x
#     x = 2
# index()
#
# print(x)


# 在局部修改外部函数的变量
# x = 1111
#
#
# def index():
#     x = 1
#
#     def func2():
#         x = 2
#
#         def func():
#             nonlocal x
#             x = 3
#
#         func()
#         print(x)
#
#     func2()
#     print(x)
#
#
# index()
# print(x)

# l1 = []
# def index(a):
#     l1.append(a)
#     # print(l1)
# index(1)
#
# print(l1)

# 局部变量的修改无法影响上层,上上层

def index():
   x = 1

   def index2():
       nonlocal x
       x = 2

   index2()
   print(x)


index()

 

原文地址:https://www.cnblogs.com/zhangjinyi97/p/11837904.html