前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python函数二(函数名,闭包,迭代器

Python函数二(函数名,闭包,迭代器

作者头像
py3study
发布2020-01-17 12:15:42
4070
发布2020-01-17 12:15:42
举报
文章被收录于专栏:python3python3

函数名的使用:

  • 函数名可以作为值,赋值给变量。
  • 函数名可以作为参数传参给函数。
  • 函数名可以作为返回值。
  • 函数名可以作为元素存储在容器里。

闭包: 在嵌套函数内,使用外层局部变量(非全局变量)就是一个闭包,闭包可以多层嵌套。 闭包的优点:

  • 避免局部变量不被外界修改。
  • 函数生命周期延长。
  • 节省开辟空间,销毁空间的时间。

闭包的作用:就是使一个局部变量常驻内存,方便后面程序调用。 使用__closure__查看一个函数是否是闭包:

代码语言:javascript
复制
def func1():
    str_ = "闭包" # 局部变量
    def func2():
        print(str_) # 使用局部变量,闭包
    func2()
    print("fun2",func2.__closure__) # 打印func2是否是闭包
func1()
print("fun1",func1.__closure__)

#打印内容如下:
闭包 
fun2 (<cell at 0x000000000222D7C8: str object at 0x000000000224E0E0>,)
fun1 None     

通过打印可以看出fun2是闭包。 闭包的调用:

代码语言:javascript
复制
def func1():
    str_ = "闭包" # 局部变量
    def func2():
        print(str_) # 使用局部变量,闭包
    print(func2.__closure__) # 打印func2是否是闭包
    return func2
func1()() # 调用闭包func2()

# 打印内容如下:
(<cell at 0x00000000022ED7C8: str object at 0x0000000002431030>,)
闭包     

迭代器: iterable表示可迭代的对象,遵守可迭代协议使用dir(对象)可以查看数据类型是否符合可迭代协议。dir(对象)可以获取对象所有的方法,如果方法中有__iter__说明对象遵守可迭代协议,是可迭代类型数据,如下:

代码语言:javascript
复制
s = "Hello World"
print(dir(s))

#打印内容如下:
'__init_subclass__', '__iter__', '__le__', ' # 这里只打印部分内容

还可以通过isinstance(对象,参数)来检测是可迭代对象还是迭代器,如果返回结果为True是可迭代对象,如果False不是可迭代对象。

下面是对常见数据类型的打印:

代码语言:javascript
复制
num = 10
bool_t = True
str_1 = "Hello World"
list_1 = [1,2,3]
tuple_1 = (1,2,3)
dict_1 = {"电影":"黄飞鸿","电视剧":"上海滩"}
set_1 = {1,2,3,4}
from collections.abc import Iterable
print("int:",isinstance(num,Iterable))
print("str:",isinstance(str_1,Iterable))
print("bool:",isinstance(bool_t,Iterable))
print("list:",isinstance(list_1,Iterable))
print("tuple:",isinstance(tuple_1,Iterable))
print("dict:",isinstance(dict_1,Iterable))
print("set:",isinstance(set_1,Iterable)) 
print("range:",isinstance(range(10),Iterable)) 

#打印结果如下
int: False 
str: True 
bool: False 
list: True 
tuple: True 
dict: True 
set: True 
range: True 

由此可以得出,可迭代对象:有str、list、dict、set、tuple、range()。 迭代器:可迭代对象使用__iter__方法创建一个对象,这个对象中含有__next__方法,我们就把这个对象称为迭代器。在迭代器中可以使用__next__方法来获取迭代器中的元素,如下:

代码语言:javascript
复制
str_1 = "Hello World"
from collections.abc import Iterable,Iterator
print(isinstance(str_1,Iterator)) # 查看是否是迭代器
str_iter = str_1.__iter__() # 创建迭代器
print(isinstance(str_iter,Iterator)) # 查看是否是迭代器

#打印结果如下:
False 
True 

for循环的工作原理就是通过迭代器来实现的。 下面来看个简单的迭代器

代码语言:javascript
复制
str_1 = "Hello" 
str_iter = str_1.__iter__()
print(str_iter.__next__())
print(str_iter.__next__())
print(str_iter.__next__())
print(str_iter.__next__())
print(str_iter.__next__())

#打印内容如下:
H 
e 
l 
l 
o 

由上面的输出可以看出与for循环的输出类似,并且迭代器是不可回退的,但是当我们的迭代器超过字符串的长度后会报错StopIteration,那在使用for循环时for是怎么知道对象的长度,并且不会报错的呢? 下面我们用while循环和迭代器模拟for循环的内部机制。

代码语言:javascript
复制
str_1 = "Hello"
str_iter = str_1.__iter__()
while True:
try: # 捕获异常
print(str_iter.__next__()) # 打印迭代器内容
except StopIteration: # 处理异常
break

#打印内容如下:
H 
e 
l 
l 
o 

注意:迭代器只能向下执行不能回退,并具有惰性,每次只获取一条数据。 小结: Iterable:可迭代对象, 内部包含__iter__()方法。         Iterator:迭代器, 内部包含__iter__() 同时包含__next__()。  迭代器的特点:

  • 节省内存(不一次性加载全部数据,使用数据时,每次只获取一条数据)。
  • 惰性机制(每次只获取一条数据)
  • 不能反复执行,只能向下执行。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档