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 ...
随机推荐
- php的__autoload和php的__call
首先, __call是php语言自身就具有的一种语言features...,不是thinkphp的语言特征. 关于__call参考: http://love-love-l.blog.163.com/b ...
- NodeJs中npm使用
什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ruby , pear 之于 PHP . npm 是 Node 官方提供的包管理工具,他已经成了 Node ...
- Asp.net MVC 控制器ActionResult的例子
ActionResult 父类型 ViewResult View() 多重载应用 PartialViewResult PartialView() 部分试图 New EmptyResult() 空 如 ...
- 题解——HDU 1848 Fibonacci again and again
一道组合游戏的题目 SG函数的板子题 预处理出SG函数的值然后回答询问即可 代码 #include <cstdio> #include <algorithm> #include ...
- parent获取子元素以及自身元素
innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取位于对象起始和结束标签内的文本 oute ...
- cron,linux定时脚本
Linux的cron和crontab Cron定时执行工具详解 Linux下的crontab定时执行任务命令详解 Linux上启动Cron任务 [linux]解析crontab cron表达式详解 c ...
- Python数据类型补充1
一.可变和不可变类型 可变类型: 值变了,但是id没有变,证明没有生成新的值而是在改变原值,原值是可变类型 不可变类型:值变了,id也跟着变,证明是生成了新的值而不是在改变原值,原值是不可变 # x= ...
- [UVA-11039]Children's Game
解析 微扰法贪心经典题 代码 #include <bits/stdc++.h> using namespace std; bool cmp(const string &x, con ...
- 使用openlayers 3 在线加载天地图及GeoServer发布的地图
使用openlayers3来加载天地图卫星图和标注图层,GeoServer发布地图,一并用openlayers测试加载出来,顺便实现了7种地图控件.下面直接贴代码: <!DOCTYPE html ...
- 前端开发——HTML学习笔记
HTML03