主要内容:
1. 函数名的应用,第一类对象
函数名可以像变量一样使用
a . 函数名的内存地址
# 1.函数名的内存地址
def func():
print("呵呵")
print(func)
# 结果: <function func at 0x1101e4ea0>
b. 函数名可以赋值给其他变量
#2函数名可以赋值给其他变量
def func():
print("呵呵")
a = func # 把函数当成⼀个变量赋值给另一个变量
a() # 函数调用 func()
c. 作为list元素
def f1():
print("我是马化腾")
def f2():
print("我是马云")
def f3():
print("我是马赛克")
lst = [f1(),f2(),f3()]
print(lst)
'''我是马化腾 #调用f1的结果
我是马云 #调用f2的结果
我是马赛克 #调用f3的结果
[None, None, None] #因为函数没有返回值,返回none
可以用for循环遍历列表中的元素
def f1():
print("我是马化腾")
def f2():
print("我是马云")
def f3():
print("我是马赛克")
lst = [f1,f2,f3] #循环遍历列表
for c in lst:
c() #调用每一个函数
''' 我是马化腾
我是马云
我是马赛克
'''
函数名可以当作函数的参数.
# 函数名可以当作函数的参数
def func():
print("吃了么")
def func2(fn):
print("我是func2")
fn() # 执⾏行行传递过来的fn #
print("我是func2")
func2(func) # 把函数func当成参数传递给func2的参数fn.
作为返回值
# def func():
# def inner():
# print("火锅不让吃了. 吃了上火")
# return inner
# ret = func() # 这里func()执行之后获取到的是inner函数
# ret() # 这里是让inner函数执行
2. 闭包:内部函数访问外部函数的局部变量
def func():
name = "alex" # 常驻内存 防止其他程序改变这个变量
def inner():
print(name) # 在内层函数中调用了外层函数的变量,叫闭包, 可以让一个局部变量常驻内存
return inner
ret = func()
ret() # 执行的是inner()
使用__closure__来检测函数是不是闭包,使用函数名.__closure__,返回cell是闭包,返回none就不是闭包.
def func1():
name = "alex"
def func2():
print(name) # 闭包
func2()
print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
func1()
# alex
# (<cell at 0x0000019CE3567588: str object at 0x0000019CE35F8148>
好处:
安全
常住内存,提高效率
3. 迭代器
dir()来查看一个对象,数据类型中包含了哪些东西
lst = [1,2,3]
print(dir(lst))
s = '王尼玛'
print('__iter__'in dir(s))
print('__iter__'in dir(lst))
print('__iter__'in dir(123))
isinstance(对象,类型) 判断什么对象是否是什么类型
lst = [1,2,3]
from collections import Iterable #可迭代的
from collections import Iterator #迭代器
print(isinstance(lst,Iterable))
print(isinstance(lst,Iterator))
lst = [1,2,3]
from collections import Iterable #k可迭代的
from collections import Iterator #迭代器
it = lst.__iter__()
print(isinstance(it,Iterable)) #判断是否是可迭代的,迭代器一定是可迭代的
print(isinstance(it,Iterator)) #迭代器里面一定有__next__(),__iter__()
print('__iter__'in dir(lst)) #确定是可迭代的
print('__next__'in dir(lst)) #确定不是一个迭代器
可迭代对象(iterable):内部包含__iter__().
迭代器(iterator):内部含有__iter__和__next__
可迭代对象: str list tuple set dict range
迭代器: f(句柄)
模拟for循环
lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"]
# 模拟for循环
it = lst.__iter__() #获取迭代器
while True:
try:
name = it.__next__() #迭代器往外拿元素
print(name)
except StopIteration: # 拿完了
break
迭代器的特点:
省内存
惰性机制
只能向前