目录
一、函数名的应用
1、函数名的内存地址
def fun():
print("hello python")
print(fun) # <function fun at 0x01888E80>
2、函数名可以赋值给其它变量
def fun():
print("hello python")
a = fun
a()
3、函数名可以当做容器类的元素
def fun1():
print("呵呵")
def fun2():
print("哈哈")
4、函数名可以当做函数的参数
def fun():
print("吃蛋")
def fun1(fn):
print("我是fun1")
fn()
print("我是fun1")
fun1(fun) # 把fun当做参数传给fun1的参数fn
5、函数名可以作为函数的返回值
def fun1():
print("这里是函数fun1")
def fun2():
print("这里是函数fun2")
print("这里是函数fun1")
return fun2
fn = fun1()
fn()
二、闭包
什么事闭包?闭包就是内层函数对外层函数变量(非全局)的引用,叫闭包
def fun1():
name = 'Tony'
def fun2():
print(name)
fun2()
fun1() # 结果Tony
我们可以使用__closure__来检测函数是否是闭包,使用函数名.__closure__,如果返回cell就是闭包,返回None就不是
def fun1():
name = 'Tony'
def fun2():
print(name)
fun2()
print(fun2.__closure__) # (<cell at 0x01871EC8: str object at 0x01933580>,)
fun1() # 结果Tony
闭包的作⽤就是让⼀个变量能够常驻内存.供后⾯的程序使⽤
三、迭代器
目前我们所熟悉的可迭代对象有:str , list , tuple , dict , set
s = 123456
for i in s:
print(1) # TypeError: 'int' object is not iterable
# 翻译过来就是int是不可迭代的 iterable(可迭代的)
我们可以使用dir函数来查看当前对象是否是可迭代的
s = "大家早上好,吃早饭了没有啊?"
print(dir(s))
在打印结果中.寻找__iter__如果能找到.那么这个类的对象就是⼀个可迭代对象 ,其他的同学们可以自己去尝试打印;
这是查看一个对象是否是可迭代的第一种方法,我们还可以使用isinstence()函数来查看
from collections import Iterable
from collections import Iterator
li = [1,2,3,6,4,8,7,10]
lis = li.__iter__() # 获取迭代器
print(isinstance(li,Iterable)) # True # 是可迭代对象
print(isinstance(li,Iterator)) # False # 不是迭代器
print(isinstance(lis,Iterator)) # True
print(isinstance(lis,Iterator)) # True
for循环的机制
# for循环机制
lis = [1,2]
# for i in lis:
# print(i)
l = lis.__iter__() # 获取迭代去
print(l.__next__()) # 获取下一个
print(l.__next__())
使⽤while循环+迭代器来模拟for循环
lis = [1,2,3]
l = lis.__iter__()
while 1 :
try:
i = l.__next__()
print(i)
except StopIteration:
break
总结:
结:Iterable:可迭代对象.内部包含__iter__()函数
Iterator:迭代器.内部包含__iter__()同时包含__next__()
迭代器的特点:
1.节省内存.
2.惰性机制
3.不能反复,只能向下执⾏