一、函数名的应用及闭包

# 函数名的应用 及闭包
#1, 函数名就是函数对象在内存中的内存地址
def func():print(6666)print(func)   # <function func at 0x000002666B812E18>#2 函数名,可以作为变量
# a = 2
# b = a
# c = b
# print(b)def func1():print(8888)
f = func1
f2 = f
f()    # 8888#3,函数名,可以作为函数的参数
def func2():print(777,end=" ")
def func3(x):print(999,end=" ")print(x,end=" ")x()
print(func2)   # <function func2 at 0x00000243C9718950>
func3(func2)   #  输出 999  <function func2 at 0x00000243C9718950> 777#函数名,可以当作函数的返回值
print("\n"+"华丽的分隔线".center(68,'*'))
def wrapper():def inner():print("in inner")return inner
f=wrapper()
f()
# 函数名可以作为容器类型元素
def foo():print("I am foo")
def duck():print("You are duck")
def beat():print("I like this beat")
dic = {'foo':foo,'duck':duck,"beat":beat}
dic['foo']()   # I am foo
dic['duck']()  # You are duck
dic['beat']()  # I like this beat# 像上面函数名这种,称为第一类对象
# 第一类对象的特点
# 1, 可在运行期创建
# 2,可用作函数参数或返回值
# 3,可存入变量的实体
## 不明白吗?那就记住一句话,就当普通变量用# 闭包
# 内层函数 对 外层 函数的变量(非全局变量)的引用,这样就形成闭包,内层函数就叫闭包函数
def wrapper():name = 'chris'def inner():print(name)return inner
func = wrapper()
func()      # chris# 判断闭包函数的常用方法:  __closure__
def wrapper():name = "LiMing"def inner():print(name)print(inner.__closure__)  # 输出的 __closure__有cell元素:是闭包函数   ,内部函数 被 一层外部函数,闭包return inner
wrapper()    #  (<cell at 0x000001FDE53D65B8: str object at 0x000001FDE70485E0>,)
name = 'egg'
def func2():def inner():print(name)print(inner.__closure__)   # 输出的__closure__为None : 不是闭包函数return inner
f2 = func2()
f2()   # eggprint("分道线".center(100,'#'))def wrapper():money = 1000def func():name = 'baby'def inner():                             #  内部函数 被 外部两层函数 闭包print(name,money)print(inner.__closure__)    # (<cell at 0x00000222CAB465B8: int object at 0x00000222CABE6B30>, <cell at 0x00000222CAB46618: str object at 0x00000222CAC086C0>)print('inner',inner)       #    inner <function wrapper.<locals>.func.<locals>.inner at 0x00000222CABD8AE8>return innerreturn func
f = wrapper()
i = f()
# i()print("一线天".center(59,'$'))hobby = 'sing'
def  fn(n):                                    #   n = hobby n 是fn函数的局部变量def inner():print(n)print(n +"1")print(inner.__closure__)    # (<cell at 0x000001DFEA006678: str object at 0x000001DFEA0C8768>,)return inner
f = fn(hobby)
print(f.__closure__[0].cell_contents)    # 查看闭包的元素
f()                     # sing'''
闭包的作用:当程序执行时,遇到了函数执行,他会在内存中开辟一个空间,局部名称空间,
如果这个函数内部形成了闭我,那么他就不会随着函数的结束而结束。
#闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
#应用领域:延迟计算(原来我们是传参,现在我们是包起来
'''
from urllib.request import urlopendef index(url):def get():return urlopen(url).read()return getbaidu=index('http://www.baidu.com')
print(baidu().decode('utf-8'))

 二、迭代器:

# 可迭代对象  内部 有 __iter__ 方法# lis = [1,3,5,10]
#
# print(dir(lis))
# print("__iter__" in dir(lis))# 什么是迭代器?
# 对象内部含有__iter___方法且含有__next__方法, 就是迭代器# f = open('register',encoding='utf-8')
# print(f)
# print("__iter__" in dir(f))
# print("__next__" in dir(f))
#
# print("__iter__" in dir(dict))
# print("__next__" in dir(dict))
# print(dir(f))# 判断一个对象是否可迭代对象:
# 第一个方法
dic = {'name':'chris'}
s1 = "hello world"
print('__iter__' in dir(dic))  # True
print("__iter__" in dir(s1))   # True
# 第二种方法
# from collections import Iterable
# from collections  import Iterator
# print(isinstance(s1,Iterable))  # True  字符串是可迭代对象
# print(isinstance(s1,Iterator))  # False  字符串不是迭代器
# print(isinstance(s1,str))       #  True# isinstance()方法  vs  type()方法
# isinstance()可以判断对象 ,所从属的所有对象类别 ,而type()方法,仅判断 基本数据类型#  dir()方法,获取指定对象的所有方法名,将方法名以字符串类型,保存在一个列表中返回。# 什么是迭代器? 迭代器,从表象上来说,就是具有 __iter__ 和 __next__方法的对象。
# 常见的迭代器,比如说,打开文件时,产生的文件句柄

fhandler = open("register",encoding='utf-8')
print(fhandler)   # <_io.TextIOWrapper name='register' mode='r' encoding='utf-8'>
# 验证 文件句柄 是否具有  __iter__ 和 __next__ 方法
print( "__iter__" in dir(fhandler))    # True
print( "__next__" in dir(fhandler))    # True# 验证 dict 类型 ,是不是迭代器?
print('__iter__' in dir(dict))        # True    具有这个方法,表示是可迭代对象
print('__next__' in dir(dict))        # False
# 可见 dict 类型,不是迭代器,它仅仅是一个可迭代对象。
# 另外一种判定方法:
from collections import Iterator
print(isinstance(fhandler,Iterator))   # True   是迭代器# 可迭代对象 vs 迭代器
# 可迭代对象不能取值 ,迭代器是可以取值的。
# 可迭代对象 ---》 (转化成)迭代器
lis = [1,3,5]   # 可迭代对象
ite1 = lis.__iter__()
print(ite1)     # <list_iterator object at 0x00000164B0C784E0>  列表迭代器对象
ite2 = iter(lis)   # <list_iterator object at 0x000001D4D0B451D0>  列表迭代器对象
print(ite2)
# 总结 : 调用可迭代对象的__iter__()方法,或者用iter(iterable)方法,把迭代对象传参进去# 迭代器如何取值呢? next 一次,取一个值
# print(ite2.__next__())  # 1
# print(ite2.__next__())  # 3
# print(ite2.__next__())  # 5
# print(ite2.__next__())  #  StopIteration   当手动从迭代器,取值,取完了,还取,抛出异常# 迭代器的特点:
# 1,可迭代对象不能取值,迭代器是可以取值的
# 2, 迭代器非常节省内存
# 3, 迭代器每一次只会取一个值
# 4,迭代器单向的,一条路走到头# 用 while 循环 模拟 for 循环:
# 1,将可迭代对象转化成迭代器
# 2,调用__next__方法取值
# 3,利用异常处理停止报错
# l = [11,12,13,14,15]
# iter_l = iter(l)
# while 1:
#     try:
#         print(iter_l.__next__())
#     except StopIteration:
#         break

转载于:https://www.cnblogs.com/chris-jia/p/9493599.html

函数名、闭包及迭代器相关推荐

  1. 函数名,函数的闭包和迭代器

    #1函数名 def chi():print("吃月饼") print(chi) fn = chi # 函数名可以进行赋值 a = 10 b = a chi() fn() # 函数名 ...

  2. python note 11 函数名的使用、闭包、迭代器

    1.函数名就是一个变量 def func():print("我是一个小小的函数") a = func print(a) #输出变量存放地址 <function func at ...

  3. python值函数名的使用以及闭包,迭代器详解

    一.函数名的运用 函数名就是一个变量名,但它是一个特殊的变量名,是一个后面加括号可以执行函数的变量名. def func():print("我是一个小小的函数") a = func ...

  4. python函数名的运用,闭包,迭代器

    一.函数名的运用 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1.函数名的内存地址 1 def func(): 2 print("呵呵") 3 prin ...

  5. python函数名的应用、闭包和迭代器

    一.函数名的应用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数变量. 1.函数名的内存地址 def func():print("哈哈") print ...

  6. 函数 名的使用和第一类对象,闭包,迭代器

    1,函数名的运用: 函数名(func())是一个变量,和变量由相同点和异同点,相同点:变量的命名规则同样适用于函数名,同样能进行赋值操作,异同点:函数名不能进行逻辑运算. 1>函数名的内存地址, ...

  7. python函数闭包的应用_python学习第10天----函数名应用、闭包、迭代器

    1.函数名的应用 1)如果直接打印函数名,打印出的为函数的地址 deffunc():print("你好,世界")print(func) 输出: View Code #可将函数赋值给 ...

  8. 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)

    函数进阶 递归函数 回调函数 闭包函数 特点 匿名函数 lambda 表达式 迭代器 iter() next() 迭代器的取值方案 迭代器取值特点,取一个少一个,直到都取完,最后再获取就会报错 检测迭 ...

  9. 函数名的使用、闭包、生成器

    一.函数名的使用 1.函数名可以当成迭代元素 1 def func1(): 2 pass 3 def func2(): 4 pass 5 lst=[1,2,func1,func2] 2.函数名可以当成 ...

最新文章

  1. 编程珠玑——第八章习题10扩展和习题11
  2. 后门构建工具Backdoor Factory
  3. 背景建模之单高斯实现
  4. python 装饰器有哪些_python装饰器有什么用
  5. mysql通过centos本地命令行还原数据库出现乱码问题
  6. springBoot微信支付(native)基本使用
  7. win7自定义html为桌面,Win7系统如何自定义个性桌面?
  8. WPF使用DialogResult.OK报错
  9. 动作Action详解
  10. 赛尔号星球大战游戏攻略
  11. linux系统下,python 调用终端禁用鼠标键盘
  12. 前端:基于Vue框架以及Axios实现天气预报系统
  13. 微信小程序实现页面加入背景图片以及调节透明度
  14. 酒精测试仪方案开发PCBA
  15. 常见的相似度计算方式
  16. gff文件_gff/gtf格式
  17. 计算机ipad手机组成,如何为自适应手机,计算机和iPad制作网页的摘要
  18. 45-网上商城数据库-商品分类数据操作(二)
  19. BC57F68与CSR8645区别对比
  20. 智慧医院智慧医疗解决方案

热门文章

  1. php pdo mysql类源码_完整示例php+pdo实现的购物车类
  2. python求字符组合_python – 生成一个潜在的8个字符串的所有可能的2个字符组合?...
  3. mw325r已断开服务器无响应,水星mw325r路由器恢复出厂设置之后上不了网怎么办?...
  4. 四边形内接于圆定理_中考数学提分36计之第19计思维模型助你轻松搞定圆问题,提分必备...
  5. java zip 文件夹_Java Zip文件文件夹示例
  6. 在R中创建晶须和盒图
  7. spring boot面试_Spring Boot面试问题
  8. 浅析人工智能自然语言生成定义
  9. 在命令行中使用ssh连接远程服务器
  10. React学习笔记2017-12-31