Python_面向过程_对象与闭包

-- 查看和自定义文档的方法.

# 查看和自定义文档
# help(print)
# __doc__ 魔术属性
# print(print.__doc__)

-- 全局变量,局部变量及global关键字的使用

# python 允许在函数内部定义全局变量;
def ceshi004():
  global b
  b = 5
ceshi004()
print(b)

"""
--global a
  如果函数外部有这个a变量,那么它允许在函数里面进行修改全局变量
  如果函数外部没有这个a变量,那么它允许在函数里面定义一个全局变量
"""


作用域:有效的作用区间

-- 内部函数
(1)内部函数可以直接在函数外部调用么
(2)调用外部函数后,内部函数可以在函数外部调用吗
(3)内部函数可以在函数内部调用吗
(4)内部函数在函数内部调用时,是否有先后顺序

#内部函数:在函数里面 又包含了一个函数 这个被包含的函数即是内部函数

def outer():
  a = 90
  def inner():
    print(a)
    print("我叫内部函数")
  inner()
res = outer()
# print(res) 默认返回None None这个关键字的含义是空

# (1)内部函数可以直接在函数外部调用么              不行
# inner() 

# (2)调用外部函数后,内部函数可以在函数外部调用吗   不行
# inner()

#(3)内部函数可以在函数内部调用吗                   可以

#(4)内部函数在函数内部调用时,是否有先后顺序         有


-- nonlocal关键字:声明函数内部的局部变量,作用在于寻找上一层的局部变量来使用

# nonlocal 用来修饰局部变量
"""
  nonlocal 用来修饰局部变量 找上一层作用域中的变量
  如果上一层没有找到,则继续向上寻找这个作用域中的变量
  *注意点 向上寻找 找的是局部变量。如果再也找不到了则报错;
"""

# 案例三
def ceshi01():
  var1 = 444
  def ceshi02():
    def ceshi03():
      nonlocal var1
      print(var1)
    ceshi03()
  ceshi02()
ceshi01()

# 案例四 把数据类型改成列表 通过列表也可以修改值
def ceshi03():
  listvar = [1,2,3]
  def ceshi04():
    listvar[0] += 100
    print(listvar[0])
  ceshi04()
ceshi03()


-- 闭包
闭包的定义:
内函数使用外函数的局部变量,并且外函数将内函数返回出来的方法叫闭包,
返回的内函数叫 闭包函数.

闭包的特点:
外函数的临时变量会在将来的内部函数中用到,
自己调用结束后会把外函数的临时变量与内函数绑定,
将来调用内函数的时候仍可使用外函数变量.

闭包的意义:
闭包可以优先使用外层包裹的作用域,并对闭包中的值起到了封装保护的作用.外部无法访问.

# 案例一: 典型的基本的闭包写法
def star_family():
  money = 1024
  kuang = "金矿"
  baba = "马云爸爸"

  def star_mayunbaba():
    print("我不在乎别人有没有钱,反正都没有我有钱,这是我的%s说的"%(baba))


  return star_mayunbaba


res = star_family() # res = weizhiyuan_mayunbaba #调用 weizhiyuan_mayunbaba() #res()

# 案例二:
def li_family():
  money = 512
  kuang = "坑"
  meimei = "小井玛利亚"
  didi = "奥腾鹰"

  def meimei_family():
  techang="爱花钱"
    nonlocal money
    money = 512 -499
    print("我家的钱都被我花了 还剩下%d"%(money))

  def didi_family():
    techang = "爱打疫苗"
    nonlocal kuang
    kuang = "煤矿"
    return "我家因为我有%s而变得有钱啦"%(kuang)

  # return (meimei_family,didi_family)

  def daguanjia():
    return (meimei_family,didi_family)

  return daguanjia()

res = li_family()
print(res)
print(type(res))

"""
简写
res[0]()
res[1]()
"""

# 调用妹妹
res1 = res[0]
res1()

# 调用弟弟
res2 = res[1]
fanhuizhi = res2()
print(fanhuizhi)

#闭包的特点
# 内函数使用外函数的局部变量,并且外函数将内函数
# 返回出来的方法叫闭包,返回的内函数叫 闭包函数.
"""
b = 300
def ceshi01():
  a = 20
ceshi01()
print(1)
print(2)
"""

def ceshi01(num):
  def ceshi02(val):
    return val+num
  return ceshi02

a = ceshi01(5)
b = a(6)
print(b)


#闭包的意义
"""
# a是全局变量,作用域很大,容易别其他代码修改 导致程序错误
a = 1
def ceshi03():
  global a
  a+=1
  print(a)
ceshi03() # 2
ceshi03() # 3
a = 900
ceshi03() # 4

# 目的:把a包起来 不让其他用户修改或者访问 实现真正的保护和封装
"""

def func1():
  x = 2
  def func2():
    nonlocal x
    x += 1
    print(x)
  return func2
func3 = func1()
func3()
func3()
func3()
# 无法调用 无法修改 初始化一次 终身受益
# x+=1
# print(x)

猜你喜欢

转载自www.cnblogs.com/bling-bling-star/p/9382610.html