一 、 函数名的运用
函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量。
1、函数名的内存地址
def func():
print("呵呵")
print(func)
结果:
<function func at 0x1101e4ea0>
2、函数名可以赋值给其他变量
def func():
print("呵呵")
print(func)
a = func # 把函数当成一个变量赋值给另一个变量
a() # 函数调用 func()
3、函数名可以当做容器类的元素
def func1():
print("呵呵")
def func2():
print("呵呵")
def func3():
print("呵呵")
def func4():
print("呵呵")
lst = [func1, func2, func3]
for i in lst:
i()
4、函数名可以当做函数的参数
5、函数名可以作为函数的返回值
二、闭包
1、 什么是闭包?闭包就是内层函数,对外层函数(非全局)的变量的引用。叫闭包
def func1():
name = "alex"
def func2():
print(name) # 闭包
func2()
func1()
结果:
alex
2、我们可以使用__closure__来检测函数是否是闭包.使用函数名.__closure__
返回cell就是闭包。返回None就不是闭包
def func1():
name = 'alex'
def func2():
print(name)
func2()
print(func2.__closure__)
func1()
结果:(<cell at 0x00000248D5C77618: str object at 0x00000248D5D07068>,)
3、如何在函数外边调用内部函数
def outer():
name = 'alex'
# 内部函数
def inner()
print(name)
return inner
fn = outer() # 访问外部函数,获取到内部函数的地址
fn() # 访问内部函数
4、总结
闭包:在内层函数中引入外层函数的变量
作用:
1、保护变量不收侵害
2、让一个变量常驻内存
三、迭代器
dir() 查看变量能够执行的方法(函数)
Iterator : 迭代器, __iter__(), __next__()
Iterable:可迭代的 __iter__()
for循环的流程:
it = lst.__iter__()
while 1:
try:
el = it.__next__()
for循环的循环体
except StopIteration:
break
# 从迭代器中获取数据的唯一方法: __next__()
三个特征:
1、省内存
2、惰性机制
3、只能往前。不能退后
# 如何判断一个数据是否是可迭代对象
# 1. dir() -> __iter__ 可迭代的
# dir() -> __next__ 迭代器
# lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
# print("__iter__" in dir(lst)) # True 可迭代的
# print("__next__" in dir(lst)) # False 不是迭代器
#
# print("__iter__" in dir(int))
# print("__next__" in dir(int))
#
# it = lst.__iter__() # 迭代器
# print("__iter__" in dir(it)) # True 迭代器本身就是可迭代的
# print("__next__" in dir(it)) # True
lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
# collections 关于集合类的相关操作
# Iterable : 可迭代的
# Iterator : 迭代器
from collections import Iterable, Iterator
print(isinstance(lst, Iterable)) # True
print(isinstance(lst, Iterator)) # False
print(isinstance({1,2,3}, Iterable)) # True, 可以使用for循环