python基础之函数名的使用,闭包以及迭代器
内容梗概:
1. 函数名的使⽤用以及第⼀一类对象
2. 闭包
3. 迭代器 1.函数名
一. 函数名的运⽤.
函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.
1.1 函数名的内存地址
1.2 函数名可以赋值给其他变量
def func():
print("哈哈")
a = func #将函数名赋值给a
a()
print(func) #内存地址是一致的
print(a)
1.3 函数名可以当做容器类的元素
def func1():
print("呵呵")
def func2():
print("呵呵")
def func3():
print("呵呵")
def func4():
print("呵呵")
lis = [func1,func2,func3,func4]
for el in lis:
el()
1.4. 函数名可以当做函数的参数
def func2():
print("我是func2啊")
def func(fn):
print("我是啥玩意")
fn()
func(func2) 1.5. 函数名可以作为函数的返回值
def func1():
print("这里是函数一啊")
def func2():
print("这里是函数二啊")
return func2
fn = func1() # 执行函数1. 函数1返回的是函数2, 这时fn指向的就是上⾯面函数2
fn() 1.6 代理模式 (比较特殊)
装饰器的雏形
把函数名当成变量来使用
def chi(fn): # fn 代理了func1和func2
print("开挂")
fn()
print(fn.__name__) # 返回函数名
print("洗包") def play_dnf():
print("疯狂的刷") def func1():
print("我是func1") def func2():
print("我是func2") def he():
print("我要喝酒") chi(play_dnf) 2. 闭包
2.1什么是闭包? 闭包就是内层函数,对外层函数(非全局)的变量的引⽤.叫闭包
闭包的样式:
def func1():
name = "alex"
def func2():
print(name) # 闭包
func2()
func1()
注意:闭包的特点: 1.保护我们的变量 2.必须是局部变量
2.2 如何判别闭包
def outer():
a = 10
def inner():
print(a)
print(inner.__closure__) # (<cell at 0x000001C079677588: int object at 0x0000000054776D30>,)
inner() # 返回CELL得值就是,返回NONE则不是
outer()
问题:如何在外部调用内部的函数?
def func1():
def func2():
def func3():
print("嘿嘿")
return func3
return func2
func1()()() #将内层函数返回到外层就可以调用,多层嵌套一层一层返回就可以了 2.3 闭包的作用
1. 保护我们的变量不受侵害
2. 可以让一个变量常驻内存,供后面程序的使用
2.的解释 python规定. 如果你在内部函数中访问了了外层函数中的变量. 那么这个变量将不会消亡.
将会常驻在内存中. 也就是说. 使用闭包, 可以保证外层函数中的变量在内存中常驻 2.4 补充注释
def func1(a,b):
'''
这个函数用来计算两个数的和并返回
:param a: 第一个参数a
:param b: 第二个参数b
:return: a+b的和
author:zwh
'''
print("我是func")
return a + b
print(func1.__doc__) #可查看函数的文档注释
print(func1.__name__) #可查看函数名 3.迭代器
3.1 可迭代对象
str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可迭代协议. 3.2 如何进验证你的数据类型是否符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有方法
实例:
s = [0,1,2,3,5,6,9]
print(dir(s)) #查看是否含有__iter__,只要含有就是可迭代对象 3.3 如何查看一个对象为什么类型
法1:
collections: 关于集合类的相关操作
Iterable : 可迭代的
Iterator : 迭代器 lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
from collections import Iterable,Iterator
print(isinstance(lst,Iterable))
print(isinstance(lst,Iterator)) 法2 (野路子)
lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
a = dir(lst)
print("__iter__" in a) # True 可迭代的
print("__next__" in a) # False 不可迭代的 tips:
如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.就可以获取到相应的迭代器.
这里的__iter__是帮助我们获取到对象的迭代器. 我们使用迭代器中的__next__()来获取到一个迭代器中的元素.,, 3.4 for 循环的内部机制
lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
a = lst.__iter__() #获得迭代器 <list_iterator object at 0x0000027BCA220748>
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__()) #当没有下一个元素的时候,会报错 StopIteration 所以我们可采用新机制
lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
a = lst.__iter__() #获得迭代器 <list_iterator object at 0x0000027BCA220748>
while 1:
try:
print(a.__next__())
except StopIteration:
break #这种方法不会出现报错 3.5 迭代器特点总结
Iterable: 可迭代对象. 内部包含__iter__()函数
Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().
迭代器的特点:
1. 节省内存.
2. 惰性机制(必须用__next__()来获取数据)
3. 不能反复, 只能向下执⾏行行.
我们可以把要迭代的内容当成子弹. 然后呢. 获取到迭代器__iter__(), 就把子弹都装在弹夹中.
然后发射就是__next__()把每一个子弹(元素)打出来.
也就是说, for循环的时候. 一开始的时候是__iter__()来获取迭代器.
后⾯面每次获取元素都是通过__next__()来完成的. 当程序遇到StopIteration将结束循环.
python基础之函数名的使用,闭包以及迭代器的更多相关文章
- Python基础之 函数名,闭包,和迭代器
		
1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...
 - python基础(13):函数名的使用、第一类对象、闭包、迭代器
		
1. 函数名的运用 函数名是⼀个变量,但它是⼀个特殊的变量,与括号配合可以执⾏函数的变量. 1.1 函数名的内存地址 def func(): print("呵呵") print(f ...
 - 【学习笔记】--- 老男孩学Python,day12  函数名的应用,闭包,迭代器
		
1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...
 - Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
		
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
 - Python基础之函数:2、globlal与nonlocal和闭包函数、装饰器、语法糖
		
目录 一.global与nonlocal 1.global 2.nonlocal 二.函数名的多种用法 三.闭包函数 1.什么是闭包函数 2.闭包函数需满足的条件 3.闭包函数的作用 4.闭包函数的实 ...
 - python基础之函数详解
		
Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...
 - python基础——匿名函数
		
python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...
 - python基础——返回函数
		
python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...
 - python基础——匿名函数及递归函数
		
python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...
 
随机推荐
- 【做题】CFedu41G. Partitions——推式子
			
实际上这题的题面还是颇有意思,对两个划分不同的定义暗示了第二类斯特林数,模数是\(1000000007\)又表明这题不是NTT. 那么一开始的想法是考虑每个集合的贡献.设这个集合为\(S\),那么它的 ...
 - e信与酸酸结合开wifi使用路由器上网
			
关于e信"正常情况下"使用路由器网上是有方法的,入户线插上lan,电脑接lan拨号 我想要说的是连接e信后使用路由器上网,并且是绝对正常的思维 手机也是可以连接上wifi,但是手机 ...
 - Oracle用户被锁定解决方法
			
解决方法: 1.用dba角色登陆:2.输入下面格式命令解锁: alter user 用户名 account unlock;3.如果密码忘记了,输入下面格式命令修改密码: alter user 用户名 ...
 - synchronized 关键字如何使用
			
http://blog.csdn.net/shenshibaoma/article/details/53009505 http://www.importnew.com/20444.html 锁一般分为 ...
 - Shiro学习笔记五(Shiro标签,及通配符)
			
1.首先是导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> ...
 - js运算符的一些特殊应用
			
作者: 小文 来源: http://www.cnblogs.com/daysme/ 时间: 2017/3/2 17:21:03 本文集合了了js运算符的一些特殊应用. js位运行符的运用. js运算符 ...
 - 【BZOJ 5125】小Q的书架
			
Problem Description 小 \(Q\) 有 \(n\) 本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小 \(Q\) 希望把这一排书分成恰好 \(k\) 段,使 ...
 - 【Python】【jupyter-notebook】
			
1. win7 安装:https://www.cnblogs.com/zlslch/p/6984403.html 1.Jupyter Notebook 和 pip 为了更加方便地写 Python ...
 - 两个DIV并排显示
			
今天做的一个项目,需要做3个div,一个是总框(Div1),另外两个是子框,按比例填满div1,我设置好两个div的width和height,发现效果是两个子div上下显示,如图所示: 要想将两个DI ...
 - 算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)等是什么意思?
			
Java中 Set 和 List 集合 的contains()方法,检查数组链表中是否包含某元素检查数组链表中是否包含某元素,使用 Set 而不使用 List 的原因是效率问题, 前者的 set ...