Python函数二(函数名,闭包,迭代器)之杵臼之交
函数名的使用
- 函数名可以作为值,赋值给变量。
- 函数名可以作为参数传参给函数。
- 函数名可以作为返回值。
- 函数名可以作为元素存储在容器里。
闭包
在嵌套函数内,使用外层局部变量(非全局变量)就是一个闭包,闭包可以多层嵌套。
闭包的优点:
- 避免局部变量不被外界修改。
- 函数生命周期延长。
- 节省开辟空间,销毁空间的时间。
闭包的作用:就是使一个局部变量常驻内存,方便后面程序调用。
使用__closure__查看一个函数是否是闭包:
def func1():
str_ = "我是闭包" # 局部变量
def func2():
print(str_) # 使用局部变量,闭包
func2()
print("fun2:",func2.__closure__) # 打印func2是否是闭包
func1()
print("fun1:",func1.__closure__) # 打印内容如下
我是闭包
fun2: (<cell at 0x0000000002F52B58: str object at 0x00000000031BEAC0>,)
fun1: None
通过打印可以看出fun2是闭包。
闭包的调用:
def func1():
str_ = "我是闭包" # 局部变量
def func2():
print(str_) # 使用局部变量,闭包
return func2 # 返回的是函数地址 func1()()
# 打印内容如下
我是闭包
闭包的简单示例:
from urllib.request import urlopen
def reptile():
# 获取URL所有内容
content = urlopen("https://www.baidu.com").read()
def get_content():
return content
return get_content
get_closure = reptile() # 获取闭包
content = get_closure() # 获取内容
print(content.decode('utf-8')) # 解码显示
# 打印内容如下
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
迭代器
iterable表示可迭代的对象,遵守可迭代协议使用dir(对象)可以查看数据类型是否符合可迭代协议。dir(对象)可以获取对象所有的方法,如果方法中有__iter__说明对象遵守可迭代协议,是可迭代类型数据,如下:
s = "Hello World"
print(dir(s)) #打印内容如下:
'__init_subclass__', '__iter__', '__le__', ' # 这里只打印部分内容
还可以通过isinstance(对象,参数)来检测是可迭代对象还是迭代器,如果返回结果为True是可迭代对象,如果False不是可迭代对象。
下面是对常见数据类型的打印:
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__方法来获取迭代器中的元素,如下:
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
由此可以证明上面的结论,可迭代对象并不是迭代器,需要通过__iter__方法创建迭代器对象,迭代器对象才是迭代器。
for循环的工作原理就是通过迭代器来实现的。
下面来看个简单的迭代器
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循环的内部机制。
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__()。
迭代器的特点:
- 节省内存(不一次性加载全部数据,使用数据时,每次只获取一条数据)。
- 惰性机制(每次只获取一条数据)。
- 不能反复执行,只能向下执行。
下一篇:生成器,推导式:https://www.cnblogs.com/caesar-id/p/10316858.html
Python函数二(函数名,闭包,迭代器)之杵臼之交的更多相关文章
- Python进阶(二)----函数参数,作用域
Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...
- Day11--Python--函数名,闭包,迭代器
通过 lst.__iter__()拿到lst.的迭代器 1.函数名第一类对象 函数名就是变量名 1.函数名可以像变量一样互相赋值. 2.可以作为函数的参数,进行传递 3.可以作为返回值返回 4.可以作 ...
- python中的函数名,闭包,迭代器
一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...
- python --- 11 第一类对象 函数名 闭包 迭代器
一 .函数名的运用 ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址 ③ 函数名可以赋值给其他变量 ④函数名可以当做容器类 ...
- python之路---11 第一类对象 函数名 闭包 迭代器
二十九. 1.函数名的运用 ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址 ③ 函数名可以赋值给其他变量 ④函数名可以当 ...
- day_10 函数名,闭包,迭代器
1. 函数名的使用 1.函数名是一个变量,函数名储存的是函数的内存地址 2.函数名可以赋值给其他变量 3.函数名可以当容器类对象的元素 4.函数名可以当其他函数的参数 5.函数名可以做函数的返回值 2 ...
- python摸爬滚打之day11----函数闭包,迭代器
1.函数名 函数名就是一个变量名, 函数名存储的是该函数的内存地址. 函数名都可以进行哪些应用? 函数名可以赋值给其他的变量; 函数名可以作容器里的元素使用; 函数名可以当做形参传进另一函数; ...
- python基础之函数名的使用,闭包以及迭代器
内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
随机推荐
- 值得收藏的Mybatis通用Mapper使用大全。
引言 由于小编的记性不太好,每次在写代码的时候总是把通用mapper的方法记错,所以今天把通用mapper的常用方法做一下总结,方便以后直接查看.好了,不废话啦. 引包 <!-- 通用Mappe ...
- 学习HTML5 canvas遇到的问题
学习HTML5 canvas遇到的问题 1. 非零环绕原则(nonzZero rule) 非零环绕原则是canvas在进行填充的时候是否要进行填充的判断依据. 在判断填充的区域拉一条线出来,拉到图形的 ...
- 什么是“闭包”(closure)为什么要用它?
什么是闭包: 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方 ...
- Zara带你快速入门WPF(4)---Command与功能区控件
前言:许多数据驱动的应用程序都包含菜单和工具栏或功能区控件,允许用户控制操作,在WPF中,也可以使用功能区控件,所以这里介绍菜单和功能区控件. 一.菜单控件 在WPF中,菜单很容易使用Menu和Men ...
- qt 共享内存 单例
QT 进程间通信之古老的方法(内存共享) 让QT只运行一个实例 以上两篇文章中分别讲述了QSharedMemory的不同作用,第一篇讲了进程间通信,第二篇讲述了怎么让应用程序只 ...
- 一纸理解JVM
JVM,JDK,JRE定义 JVM是Java Virtual Machine(Java虚拟机)的缩写. JDK是Java Development Kit JAVA语言开发工具箱(JAVA核心) JRE ...
- pyhive 连接 Hive 时错误
一.User: xx is not allowed to impersonate xxx' 解决办法:修改 core-site.xml 文件,加入下面的内容后重启 hadoop. <proper ...
- 知识小罐头03(idea+maven+部署war包到tomcat 上)
自学的的小伙伴第一就要用maven!自学的的小伙伴第一就要用maven!自学的的小伙伴第一就要用maven! 重要的事说三遍!maven本质上,其实就是一种目录的格式,没有什么特别的地方!而且,你可以 ...
- 带着萌新看springboot源码11(springboot启动原理 源码上)
通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...
- 聚类——FCM
聚类——认识FCM算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.FCM概述 FCM算法是基于对目标函数的优化基础上的一种数据聚类方法.聚类结 ...