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将结束循环.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值