返回函数,global,nonlocal,闭包函数以及迭代器

函数分类:执行过程函数(没有return)

     具有返回值的函数(有return)

执行过程函数:

def func():
print('hello')
return True
res=func()
print(res)
任何函数具有返回值函数如果没写return语句,那么默认的返回值是None
def func():
print('hello')
res=func()
print(res)

return具有结束程序的作用
def func():
print('hello')
return '大傻'
print('123') ---》输出不了123
res=func()
print(res)

一个函数允许出现多个return语句
def func(name):
if name=='孙':
return '男'
elif name=='朱':
return '女'
else:
return '不男不女'
res=func('孙')
print(res)

局部变量;(仅仅在当前函数内部有效)
def func():
num=1
print(num)
func()

全部变量:(函数内外部都有效的变量)--》伪全局变量
num=1
def func():
print(num)
func()
print(num)

真正的全局变量:
def func():
global name
name='sun'
print(name)
func()
print(name)

locals()获取当前作用域的全部变量(要在声明变量之后才会执行)
globals()获取当前位置的全部变量

变量作用域链:
1.变量的有效范围可以向函数内部层层传递
2.如果其他的函数没有使用global,可以访问变量但是不能进行任何操作
3。如果其它函数中使用global,可以进行任何操作

global注意事项:
1,函数内部的变量和函数外部的变量间没有任何联系,除非使用global
2.同级中一个函数使用了global那么另一个函数也必须使用global来声明变量

nonlocal:(一定要嵌套在内部函数中)
1.适用于在局部函数种的局部函数
2.把内层的局部变量设置成上一个外层局部可用
3.可与global混合使用(中间至少要隔一个函数)

nonlocal基本形式:
def wai():
num=1
def li():
nonlocal num
num=3
print(num)
li()
print(num)
wai()

递归函数:
函数自己调用自己
先进后出
必须要有出口
递归的层数不要超过1000层

闭包函数:内函数使用外函数的局部变量,并且外函数将内函数返回出来的方法叫做闭包,返回的内函数叫做闭包函数
def out():
num=1
def li():
print(num)
return li
res=out()
res()

闭包特点:
1.外函数的临时变量会在将来的内部函数中使用
2.自己调用结束后会把外函数的临时变量与内函数绑定,不释放
3.将来调用内函数的时候仍可使用外函数变量
lambda表达式(匿名函数)
格式:
变量名=lambda 参数,参数:执行过程函数
def func():
print('你好')
func()
#可转换为
res=lambda :print('你好')
res()

格式:
变量名=lambda 参数,参数:函数代码
若是函数代码就会自带return
def add(n,m):
return n+m
res=add(1,2)
print(res)
#可转换为
res=lambda n,m :n+m
res2=res(1,2)
print(res2)

lambda常常用于数据过滤
格式
变量名=lambda 参数:真值 if 条件表达式 else 假植
def func(name):
if name=='孙':
return 'nan'
else:
return 'nv'
res=func('孙')
print(res)
#可转换为
res=lambda name:'nan' if name=='孙' else 'nv'
res2=res('孙')
print(res2)
迭代器(数据量大的情况下会用到)
但凡可以被for遍历的容器都是可迭代容器
Iterable 可迭代的
Iterator 迭代器
迭代器都是可迭代的,但可迭代的数据类型不一定是迭代器
from  collections import Iterator,Iterable
name=('sun','zhu')
#检测是否是迭代器
res=isinstance(name,Iterator)
# print(res)
#将其转换成迭代器
res2=iter(name)
print(res2)
# 查看迭代器值方法一
# print(next(res2))
# print(next(res2))
# 查看迭代器值方法二
# for i in res2:
# print(i)
# 查看迭代器值方法三
res3=list(res2)
print(res3)