函数名的应用 第一类对象
函数名可以像变量一样进行使用
1. 将函数名赋给 a, a( ) 就相当于函数调用
2. 可以将函数名放到列表中 ,作为列表的 元素
3. 可以把函数作为参数,传递给另一个函数
4. 可以把函数名作为返回值
e.g # 将函数名赋值给a
def func()
print("你好")
print( func )=====>得到的是 func 函数的内存地址
a=func
print( a )========> 和上边一样, 得到的是 func 的函数的内存地址
func()====> 你好 # 调用函数
a () ====> 你好 a=func #调用函数func
e.g # 将函数名放到列表中作为列表的元素
def f1():
print("你好")
def f2():
print("大雄")
def f3():
print("哆啦A梦")
lis=[ f1 , f2 , f3 ]
for el in lis:
el()====> 每个el 都是一个函数名, 加个括号,表示调用函数
e.g # 将函数作为参数
def func():
def gn():
print("火锅")
func(gn)=====> 火锅
e.g # 将函数作为返回值
def func():
def inner():
print("不吃")
return inner
ret = func () # func() 执行后获得返回值 inner
ret() # ret = inner ====> inner() 调用函数inner
闭包 : 在内层函数中,,调用外层函数的变量
作用: 可以让一个局部变量 常驻内存 让变量更加安全
打印 函数名._ _ closure_ _() 可以查看函数 是不是闭包 None ===> 不是闭包 否则是闭包
e.g
def func():
name="alex" # 常驻内存 ,防止其他程序改变这个变量
变量写在全局中是不安全的, 我们可以加 global 改变它
def inner():
print(name)
return inner
ret =func() # 函数 func 执行过一次之后 ,函数内部 name = "alex" ,正常情况下会消失
但是, 由于有 name=alex def inner(): print(name) 自动检测到要使用
name 而且还有 ret() 因此 name=alex 会常驻内存 ,每次执行inner 的时候 name=alex 都会存在
ret()
可迭代的 : Iterable ( str list tuple set dict range f 句柄 )
只要内部包含 _ _ iter_ _() 就是可以迭代 **** 可以迭代不一定就是迭代器
迭代器 比可迭代对象 多了一个 _ _next_ _()
迭代器 : Iterator ( f 句柄 )
内部包含 _ _ iter _ _(), 和 _ _ next _ _() 就是迭代器
迭代器一定可以迭代
迭代器拿出来的还是迭代器 f._ _iter_ _()._ _iter_ _() =====> 结果还是迭代器
迭代器特点: 节省内存 惰性机制 不能反复,只能向下执行
我们可以通过 dir() 来查看一个对象的数据类型中包含了 哪些东西
e.g
lst=[1,2,3]
print(dir(lst)) ====> _ _ iter _ _ in dir(s) 可以判断其中有 _ _ iter _ _ () ===> 可以迭代
_ _iter _ _() 它的工作是返回一个迭代器
e.g
lst=[ "皇" , "容" , "紫" , "额" ]
it = lst._ _iter_ _() # lst是可以迭代的 , it 就是获取迭代器
有了迭代器就可以 _ _next_ _()向外拿元素 # 点一个出来一个
print( it._ _ next_ _() )=====>皇 # 拿一次 出来一个
print( it._ _ next_ _() )=====> 容
print( it._ _ next_ _() )=====>紫
print( it._ _ next_ _() )=====>额
print( it._ _ next_ _() )=====> 报错 StopIteration # 最后一个元素拿完了, 后边再迭代拿元素就会 报错
模拟 for 循环
e.g
lst =[ "何炅" ," 谢娜 " , " 张杰 " ]
it=lst . _ _iter_ _() # 迭代器 相当于 一个班长
while True:
try:
name = it . _ _next _ _() # 开始点名
print( name )
except StopIteration: # 当迭代停止时 , 停止循环 当点到没有人的时候
break
======> 结果就是 何炅 谢娜 张杰
还可以通过一下两种方法检测其 是不是可迭代的 和 是不是迭代器
print( "_ _iter_ _" in dir( lst ) ) ====>判断是否 可迭代
print( " _ _next_ _ " in dir(lst) ) ====> 判断是否 是迭代器
from collections import Iterable # 判断 可迭代的
from collections import Iterator # 判断 迭代器
isinstance ( 对象 , 类型 ) 判断 ** 是否是 ** 类型的
print( isinstance ( lst , Iterable ) ) # 判断 可迭代的
print( isinstance ( lst , Iterator ) ) # 判断 迭代器
迭代器,只能向下执行
e.g
lst=[ " 哈哈" , " 呵呵 "]
it=lst. _ _iter_ _()
it._ _next_ _() # 不打印出来,但是拿 , 相当于 跳过
print( it._ _next_ _() )====> 结果只剩 呵呵