zoukankan      html  css  js  c++  java
  • day11 函数的返回值、全局变量和全局变量、函数名的使用、函数的嵌套、nonlocal

    # ### return 返回值

    """
    自定义函数的返回值,return 可以把值返回到函数的调用处
    (1) return + 六大标准数据类型 , 还有类和对象,函数
    如果不定义return , 默认返回的是None

    (2) 在执行完return之后,立刻终止函数,后面的代码不执行
    """

    1.return的返回类型

    def func():
    	# return 1
    	# return 3.14
    	# return "abc"
    	# return []
    	# return ()
    	# return {"a":1}
    	pass
    res = func()
    # 如果不定义return , 默认返回的是None
    print(res) # None
    

    2.在执行完return之后,立刻终止函数,后面的代码不执行

    def func():
    	print(1)
    	print(2)
    	return 3
    	print(4)
    	print(5)
    
    res = func()
    print(res)
    
    def func():
    	for i in range(3):
    		if i == 2:
    			return 1
    		print(i)
    res = func()
    print(res)
    

    3.模拟简单的计算器 + - * /

    def func(sign,num1,num2):
    	if sign == "+":
    		res = num1 + num2
    	elif sign =="-":
    		res = num1 - num2
    	elif sign == "*":
    		res = num1 * num2
    	elif sign == "/":
    		if num2 == 0:
    			return "除数不能为0  , 脑弟!"
    		res = num1 / num2
    	else:
    		return "这个本计算器真算不了"
    
    	return res
    
    res = func("+",3,5)
    res = func("-",10,20)
    res = func("*",10,20)
    res = func("/",20,10)
    res = func("/",20,0)
    res = func("&",20,0)
    print(res)
    

    # ### 全局变量 和 局部变量

    """
    局部变量:在函数内部定义的变量(局部命名空间)
    全局变量:在函数外部定义的或者使用global在函数内部定义(全局命名空间0

    作用域:作用的范围
    局部变量作用域:在函数的内部
    全局变量作用域:横跨整个文件

    生命周期:
    内置变量> 全局变量> 局部变量
    """

    1.局部变量

    def func():
    	# 定义局部变量
    	a = 5
    	# 获取局部变量
    	printa(a)
    	# 修改局部变量
    	a =  10
    	print(a)
    	
    func()
    # print(a) error  不能在全局调用局部变量
    

    2. 全局变量

    # 定义全局变量
    b = 10
    # 获取全局变量
    print(b)
    # 修改全局变量
    b = 20
    

    3.使用global在函数内部创建全局变量

    def func():
    	# 可以在函数内部获取全局变量
    	d = 300
    	def func():
    		global c
    		c = 200
    func()
    print(c)
    

    4.使用global在函数内部修改全局变量

    d = 300
    def func():
    	global d
    	d = 400
    func()
    print(d)d = 300
    def func():
    	global d
    	d = 400
    func()
    print(d)
    

    """
    总结:
    也可以使用global关键字在函数内部定义一个全局变量
    也可以使用global关键字在函数内部修改一个全局变量
    """

    # ### 函数名的使用

    1.函数名是个特殊的变量,可以当做变量赋值

    a = "你好"
    print(a)
    a = func 
    a()
    
    # 函数可以像变量一样销毁
    del a
    # a()
    

    2.函数名可以作为容器类型数据的元素

    def func1():
    	print("我是func1函数")
    	
    def func2:
    	print()("我是func2函数")
    	
    def func3():
    print("我是func3函数")
    
    lst = [func1,func2,func3]
    for i in lst:
    	print(i)
    	i() #func1() func2() func3()
    

    3.函数名可以作为函数的参数

    def func4():
    	f()
    func4(func3)
    

    4.函数名可作为函数的返回值

    def func(func2):
    	return f
    res = func(func2) #f <=> func2 <=> res = func2()
    res()
    
    # ###__doc__或者 help 查看文档
    dfe eat_bigchang(something):
    	"""
    	功能:大肠刺身
    	参数:肠子名字
    	返回值:吃的状态
    	"""
    	
    	print("先把肠子洗一洗".format(something))
    	print("找出肠子头发嘴里")
    	print("嘬!!!")
    	return("吃完了,满意的放下肠子,擦擦嘴")
    	
    res = eat_bigchang("猪肠子")
    print(res)
    help(eat_bigchang)
    res = eat_bigchang.__doc__
    print(res)
    

    # ### 函数的嵌套

    """
    函数之间可以互相嵌套
    外层的叫做外函数
    内层的叫做内函数
    """

    def outer():
    	def inner():
    		print("我是inner函数")
    	inner()
    outer()
    

     (1)内部函数可以直接在函数外部调用吗 不行!
     (2)调用外部函数后,内部函数可以在函数外部调用吗 不可行!
     (3)内部函数可以在函数内部调用吗 可以!
     (4)呢不函数在函数内部调用时,是否有先后顺序 有!必须先定义再调用

    # 外层是outer,内层是inner,最里层是smaller,调用smaller里面的所有代码
    
    def outer():
    	def inner():
    		def smaller():
    			print("我是smaller函数",ccid)
    		smaller()
    	inner()
    outer()
    

    LEGB原则(就近找变量原则)

    """
    # 找寻变量的调用顺序采用LEGB原则 (即就近原则)
    B-Builtin(Python);Python内置模块的命名空间 (内建作用域)
    G-Global(module);函数外部所在的命名空间 (全局作用域)
    E-Enclosing function locals;外部嵌套函数的作用域 (嵌套作用域)
    B-Local(function);当前函数内的作用域 (局部作用域)
    依据就近原则,从下往上 从里往外 依次寻找
    """

    # ### nonlocal 修改局部变量

    """
    nonlocal遵循LEGB就近找变量原则
    (1)找当前空间上一层的局部变量进行修改
    (2)如果找不到,会继续向上寻找
    (3)最好什么也没有,直接报错
    """

    (1)找当前空间上一层的局部变量进行修改

    def outer():
    	a=100
    	def inner():
    		nonlocal a
    		a=200
    		print(a)
    		
    	inner()
    	print(a)
    outer()
    

    (2)如果找不到,会继续向上寻找

    def outer():
    	a=100
    	def inner():
    		def smaller():
    			nonlocal a 
    			a = 400
    			print(a)
    		smaller()
    		print(a)
    	inner()
    	print(a)
    outer()
    

    (3)注意点:nonlocal只能修改局部变量

    # 最后什么也没有,直接报错
    """
    a= 100
    def outer():
    	def inner()
    		def smaller():
    			nonlocal a
    			a = 400
    			print(a)
    		smaller()
    		print(a)
    	inner()
    	print(a)
    outer()
    """
    
    # 400 400 400
    # 500 400 400
    # 400 400 500
    

    (4)不能使用nonlocal修改拒局部变量

    def func():
    	lst = [1,2,3,4]
    	def inner():
    		lst[-1]=10
    	inner()
    	print(lst)
    func()
    

      

    # ### locals 和 globals  

    locals 获取当前作用域中所有变量

    """
    locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
    locals 如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域
    """

    # 例子1
    """
    def func():
    	ff = 123
    a=1
    b=2
    res = locals()
    c = 3
    print(res)
    d = 4
    """
    
    # 例子2
    """
    a1 = 10
    def func():
    	a = 1
    	b = 2
    	res = locals()
    	c = 3
    	print(res)
    	d = 4
    a2 = 20
    func()
    a3 = 30
    """
    

    globals 只获取全局空间中所有变量

    """
    globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
    globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域
    """

    # 例子2
    a1 = 10
    def func():
    	a = 1
    	b = 2
    	res = globals()
    	c = 3
    	print(res)
    	d = 4
    a2 = 20
    func()	globals
    a3 = 30
    

      

     

  • 相关阅读:
    懒人模式Singleton模式Meyers版本号
    欢迎CSDN-markdown编辑
    协同编辑多人word一个小技巧文件
    72_leetcode_Construct Binary Tree from Preorder and Inorder Traversal
    2015第44周五Java集群技术(转)
    linux远程管理工具
    2015第44周三提升个人价值意识
    2015第44周二
    2015第44周一
    2015第43周日
  • 原文地址:https://www.cnblogs.com/liya1014/p/13351910.html
Copyright © 2011-2022 走看看