python 基础学习笔记(7)——迭送器

函数名的运用

    函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量

函数名的内存地址

def func():
    print(666)
print(func)
##结果<function func at 0x000001CAA4FCC1E0>

函数名可以赋值给其他变量

def func():
    print(666)
a = func #将func的函数名赋值给a
a()  #a() = func()

##结果   666

函数名可以当作容器类的元素

def func1():
    print(666)
def func2():
    print(555)
def func3():
    print(444)
def func4():
    print(333)
func_list = [func1,func2,func3,func4]
for item in func_list:
    item()

##  结果
	666
	555
	444
	333

函数名可以当作函数的参数

def func():   
    print("吃了么")
def func2(fn):   
    print("我是func2")   
    fn()    # 执行传递过来的fn   
    print("我是func2")
func2(func)     # 把函数func当成参数传递给func2的参数fn.

函数名可以作为函数的返回值

def func_1():   
    print("这里是函数1")   
    def func_2():       
        print("这里是函数2")   
    print("这里是函数1")   
    return func_2
fn = func_1()  
# 执行函数1.  函数1返回的是函数2, 这时fn指向的就是上面函数2
fn()    # 执行func_2函数

闭包

    闭包就是内层函数,对外层函数(非全局)的变量的引用
def func1():
    name = "张三"
    def func2():
        print(name)
        # 闭包
    func2()
func1()
# 结果: 张三

检测闭包

    我们可以使用__closure__ 来检测函数是否是闭包. 使用函数名.__closure__返回cell就是 闭包. 返回None就不是闭包
def func1():
    name = "张三"
    def func2():
        print(name)
    func2()
    print(func2.__closure__)
func1()
结果:
张三
(<cell at 0x0000020077EFC378: str object at 0x00000200674DC340>,)

迭送器

    迭代操作对象有 str, list, tuple, dic, set。
s = abc
for i in s:
    print(i)
结果:
a
b
c
错误的代码:
for i in 123:
    print(i)
结果
Traceback (most recent call last):
  File "D:/python_object/二分法.py", line 62, in <module>
    for i in 123:
TypeError: int object is not iterable

注意看报错信息,报错信息中有这样一句话: ‘int’ object is not iterable 翻译过来就是整数类型对象是不可迭代的. iterable表示可迭代的.表示可迭代协议 那么如何进行验证你的数据类型是否符合可迭代协议.我们可以通过dir函数来查看类中定义好的所有方法

a = abc
print(dir(a))  # dir查看对象的方法和函数
# 在打印结果中寻找__iter__ 如果存在就表示当前的这个类型是个可迭代对象

这是查看一个对象是否是可迭代对象的第一种方法,我们还可以通过isinstence()函数来查看一个对象是什么类型的

l = [1,2,3]
l_iter = l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable)) #True             #查看是不是可迭代对象
print(isinstance(l,Iterator)) #False            #查看是不是迭代器
print(isinstance(l_iter,Iterator)) #True       
print(isinstance(l_iter,Iterable)) #True

通过上边的我们可以确定.如果对象中有__iter__函数,那么我们认为这个对象遵守了可迭代协议.就可以获取到相应的迭代器 总结 Iterable: 可迭代对象. 内部包含__iter__()函数

Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().

迭代器的特点:

1. 节省内存.

2. 惰性机制

3. 不能反复, 只能向下执行.

我们可以把要迭代的内容当成子弹. 然后呢. 获取到迭代器__iter__(), 就把子弹都装在弹夹中. 然后发射就是__next__()把每一个子弹(元素)打出来. 也就是说, for循环的时候.一开始的 时候是__iter__()来获取迭代器. 后面每次获取元素都是通过next()来完成的. 当程序遇到 StopIteration将结束循环.

经验分享 程序员 微信小程序 职场和发展