Python_面向过程_对象与闭包
Posted bling-bling-star
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
以上是关于Python_面向过程_对象与闭包的主要内容,如果未能解决你的问题,请参考以下文章
面向对象和面向过程,python中的类class,python中程序的入口——main方法,