函数名的使用

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

闭包

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

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

闭包的作用:就是使一个局部变量常驻内存,方便后面程序调用。
使用__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函数二(函数名,闭包,迭代器)之杵臼之交的更多相关文章

  1. Python进阶(二)----函数参数,作用域

    Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: ​ 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...

  2. Day11--Python--函数名,闭包,迭代器

    通过 lst.__iter__()拿到lst.的迭代器 1.函数名第一类对象 函数名就是变量名 1.函数名可以像变量一样互相赋值. 2.可以作为函数的参数,进行传递 3.可以作为返回值返回 4.可以作 ...

  3. python中的函数名,闭包,迭代器

    一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...

  4. python --- 11 第一类对象 函数名 闭包 迭代器

    一 .函数名的运用    ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址    ③ 函数名可以赋值给其他变量         ④函数名可以当做容器类 ...

  5. python之路---11 第一类对象 函数名 闭包 迭代器

    二十九. 1.函数名的运用    ①函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 ②函数名是一个内存地址    ③ 函数名可以赋值给其他变量         ④函数名可以当 ...

  6. day_10 函数名,闭包,迭代器

    1. 函数名的使用 1.函数名是一个变量,函数名储存的是函数的内存地址 2.函数名可以赋值给其他变量 3.函数名可以当容器类对象的元素 4.函数名可以当其他函数的参数 5.函数名可以做函数的返回值 2 ...

  7. python摸爬滚打之day11----函数闭包,迭代器

    1.函数名 函数名就是一个变量名, 函数名存储的是该函数的内存地址.    函数名都可以进行哪些应用? 函数名可以赋值给其他的变量; 函数名可以作容器里的元素使用; 函数名可以当做形参传进另一函数; ...

  8. python基础之函数名的使用,闭包以及迭代器

    内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...

  9. day12 python函数名的应用 闭包 迭代器

    day12 python   一.函数名的应用(是第一类对象)     函数名的命名规范和变量是一样的     函数名其实就是变量名 def func():     print('i am funct ...

随机推荐

  1. iOS学习——输入验证码界面封装

    在很多App中都有输入验证码的功能需求,最近项目需要也有这个功能.做完之后简单整理了一下,将实现的基本思路做下记录.实现后的效果大致如下图所示,当四位签到码全部输入时,提交按钮是可以提交的,否则提交按 ...

  2. 英语笔记3(git)

    备注 一: Staging Modified Files Let’s change a file that was already tracked. (tracked 表示该文件已经被git管理过,再 ...

  3. css实现超出文本省略号的两个方法

    方法一:适用于定宽高; <!DOCTYPE html> <html> <head lang="en"> <meta charset=&qu ...

  4. 一张脑图说清 Nginx 的主流程

    一张脑图说清 Nginx 的主流程 这个脑图在 nginx-1.14.0-research 上.这是我在研究nginx的http模块的时候画的.基本上把 Nginx 主流程(特别是 HTTP 的部分) ...

  5. 死磕 java集合之TreeMap源码分析(四)-内含彩蛋

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 二叉树的遍历 我们知道二叉查找树的遍历有前序遍历.中序遍历.后序遍历. (1)前序遍历,先遍历 ...

  6. vs17 破解密钥

    Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS201 ...

  7. sql server 性能调优之 死锁排查

    一.概述 记得以前客户在使用软件时,有偶发出现死锁问题,因为发生的时间不确定,不好做问题的重现,当时解决问题有点棘手了.现总结下查看死锁的常用二种方式. 1.1 第一种是图形化监听: sqlserve ...

  8. TypeScript: type alias 与 interface

    官方文档中有关于两者对比的信息,隐藏在 TypeScript Handbook 中,见 Interfaces vs. Type Aliases 部分. 但因为这一部分很久没更新了,所以其中描述的内容不 ...

  9. python操作符笔记

    1.**两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16 2.//就是做浮点除法,并舍弃小数部分(注意不是四舍五入) 3.@是python中的修饰符,具体功能我没弄懂.

  10. ASP.NET Core DI 手动获取注入对象

    ASP.NET Core DI 一般使用构造函数注入获取对象,比如在ConfigureServices配置注入后,通过下面方式获取: private IValueService _valueServi ...