小学生都能学会的python(闭包和迭代器)

1. 函数名第一类对象
函数名其实就是变量名
1). 可以像变量一样互相赋值.
2). 可以作为函数的参数,进行传递
3). 可以作为返回值返回
4). 可以作为集合的元素进行存储

# def chi():
#     print("吃月饼")
# print(chi)
# fn = chi # 函数名可以进行赋值
# a = 10
# b = a
# chi()
# fn()
# 函数名可以像变量名一样进行使用# def func1():
#     print("我是一个单纯的函数")
#
# def func2(abc): # abc接收到的是一个函数的内存地址
#     abc()  # 执行func1, func1()
#     print("我是func2", abc)
#
# # a = "苹果"
#
# func2(func1) # func1是函数的内存地址, 函数名可以像变量一样进行参数的传递# def outer():
#     def inner():
#         print("我是里面")
#     return inner
#
# outer()() # ()表示的是执行
# ret = outer() # outer得到的结果是inner
# ret() # 执行的是inner函数# a = "周润发"
# b = "蓝洁瑛"
# c = "春三十娘"
# d = "简直了"
#
# lst = [a, b, c, d]
# for el in lst:
#     print(el)# def chi():
#     print("吃饭")
# def he():
#     print("喝饮料")
# def du():
#     print("赌是不好的")
# def chou():
#     print("少抽点烟")
#
# lst = [chi, he, du, chou]
# for el in lst:
#     el()# a = 10
# print(a + 20)# 错误的
# def a():
#     pass
# print(a + 10)
#
# def panpan():
#     print("我是潘潘. 我喜欢毒丈夫 ")
#
# def xiaoping():
#     print("我是小萍萍. 我喜欢毒丈夫 ")
#
# def xiaohua():
#     print("我是小花花. 我喜欢毒丈夫 ")
#
# def daguanren():
#     print("大官人喜欢xxxx")
#
# def wangpo(nv, nan): # 核心业务逻辑
#     nv()
#     nan()
#
# wangpo(xiaohua, daguanren) # 王婆代理了大官人和潘潘# def chi():
#     print("我是吃")
#
# a = chi
# haha = a
# hehe = haha
# bilibili= hehe
#
# bilibili()
# print(bilibili.__name__) # 函数名def play(wanjv1, wanjv2, wanjv3):'''玩儿函数:param wanjv1: 玩具1:param wanjv2: 玩具2:param wanjv3: 玩具3:return: 开心'''print("我要玩儿荡秋千")return "开心"# play("独木桥", "独轮车", "独眼龙")
print(play.__doc__) #  document
print(str.join.__doc__)

  

2. 闭包(函数的嵌套. 返回函数名)
作用:
1). 保护变量
2). 常驻内存
基本写法
def outer():
a = 10
def inner():
return a
return inner

# def func():
#     a = 10
#     print(a)
# func()
# print(a) # 在外面你是访问不到局部变量的, 局部变量是安全的# 全局变量可能会被修改, 全局变量是不安全的. 可能会被其他函数所更改
# a = 10
# def func():
#     global a
#     a = 20
#     print(a)
# func()
# print(a)# 用闭包可以保护我们的变量
# 写法: 在外层函数中声明一个变量. 在内层函数使用或者返回这个变量.
# 这个结构叫闭包
# 1.可以保护我的变量
# 2.可以让一个变量常驻内存# def outer():
#     a = 10 # 常驻内存
#     def inner():
#         print(a) # 在内部使用的外面的变量
#     return inner # 返回了内部函数
#
#
# # ret是inner的地址. ret就是inner
# ret = outer()
# # ret() # 这里执行inner()
# # print("哈哈")
# # print("哈哈")
# # print("哈哈")
# # ret() # inner的执行时间是不确定的
# # print("哈哈")
# # print("哈哈")
# # print("哈哈")
# # ret() # inner的执行时间是不确定的
#
# # def haha():
# #     pass
# # print(ret.__closure__) # 有东西, 就是闭包. None就不是闭包# 闭包的应用.保护变量, 常驻内存
from urllib.request import urlopendef func():# 闭包. content会常驻内存content = urlopen("http://www.xiaohuar.com/").read()def inner():return contentreturn innerprint("加载中...")
g = func() # 网络请求
print("加载完毕")
print(g())
print(g())
print(g())

  

3. 迭代器(用)
1. Iterable: 可迭代的.里面有__iter__()
2. Iterator: 迭代器. 里面有__iter__() 还有 __next__()

特点:
1. 节省内存(欠)
2. 惰性机制(只有执行__next__()才会取值)
3. 只能向前. 不能反复

dir() 查看数据可以执行的方法
isinstance() 判断xxx对象是否是xxx类型

for循环的内部用的是迭代器
lst = [1, 2, 3]
it = lst.__iter__().__next__()
while 1:
try:
it.__next__()
except StopIteration:
break

# for c in 123:
#     print(c)# iterable 可迭代的, str, list. tuple, dict, set, open(), range()
# dir() 可以查看某数据类型中可以执行的方法
# s = "alex"
# print(dir(s)) # 在字符串中发现了__iter__. 没有__next__
# a = 123
# print(dir(a)) # 在int中没有__iter__ 没有__next__
# lst = [1, 2, 3,]
# print(dir(lst)) # 在list中也有__iter__# 所有包含了__iter__的东西都可以使用for循环. 都可以进行迭代
# 迭代器, 在for循环内部. 调用了__iter__(), 访问__iter__()可以得到迭代器
# lst = [1, 2, 3, 4, 5, 6]
#
# it = lst.__iter__()  # iterator 迭代器
# while 1:
#     try:
#         print(it.__next__())
#     except StopIteration:
#         print("结束了")
#         break# for el in lst:
#     print(el)
# else:
#     print("结束了")# 迭代器给所有的数据类型提供了一种统一的遍历的方式(可迭代协议), Iterable, __iter__()
# lst = [1, 2, 3, 4, 5]
# # print("__iter__" in dir(lst))
# # print("__next__" in dir(lst))
#
# it = lst.__iter__()
# # print("__iter__" in dir(it)) #  迭代器里面是有__iter__的.  迭代器一定是可迭代的
# # print("__next__" in dir(it))
#
# for el in it: # 迭代器可以使用for循环
#     print(el)# 小总结
# Iterable: 可迭代对象. 里面包含了__iter__(),可以使用for循环
# Iterator: 迭代器. 里面包含了__iter__() 和 __next__(), 也可以使用for循环# from collections import Iterable # 可迭代的
# from collections import Iterator # 迭代器
#
# lst = ["周润发","麻花藤","刘伟"]
# print(isinstance(lst, Iterable)) # instance  实例, 对象
# print(isinstance(lst, Iterator)) # instance  实例, 对象
#
# it = lst.__iter__()
# print(isinstance(it, Iterable)) # instance  实例, 对象
# print(isinstance(it, Iterator)) # instance  实例, 对象#  总结
#  特点:
#   1. 节省内存
#   2. 惰性机制
#   3. 只能向前. 不能反复lst = [1,2,3]
it = lst.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())# 重新拿一个迭代器
it = lst.__iter__()
print(it.__next__())
print(it.__next__())

  

转载于:https://www.cnblogs.com/konghui/p/9670469.html

小学生都能学会的python(闭包和迭代器)相关推荐

  1. 小学生在家自学python_小学生都能学会的python(函数)

    小学生都能学会的python(函数) 神马是函数 函数: 对功能或者动作的封装 函数的定义 def 函数名(形参列表): 函数体(return) ret = 函数名(实参列表) 函数的返回值 retu ...

  2. python小学生能学嘛_小学生都能学会的python(深浅拷贝)

    小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...

  3. python小学生课本剧_小学生都能学会的python(小数据池)

    小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...

  4. python小学生课本剧_小学生都能学会的python(生成器)

    小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...

  5. 小学生都能学会的Python基础语法——代码规范判断语句循环语句

    前言: Python 语言与 Perl,C 和 Java 等语言有许多相似之处.但是,也存在一些差异,在本章中我们将来学习 Python 的基础语法,让你快速学会 Python 编程. 一.代码的执行 ...

  6. 小学生python-小学生都能学会的python(函数)

    小学生都能学会的python(函数) 神马是函数 函数: 对功能或者动作的封装 函数的定义 def 函数名(形参列表): 函数体(return) ret = 函数名(实参列表) 函数的返回值 retu ...

  7. 人人都能学会的python编程教程1:第一行代码

    前言 众所周知,现在IT行业很火,行业薪酬也很高,国家在2017年也发布了人工智能教育的推广计划,人人会编程的时代将要到来.不会编程.不懂编程可能有些跟不上时代的节奏,普通人不懂技术也许会觉得这个很难 ...

  8. 人人都能学会的python编程教程(基础篇)完整版

    人人都能学会的python编程教程1:第一行代码 人人都能学会的python编程教程2:数据类型和变量 人人都能学会的python编程教程3:字符串和编码 人人都能学会的python编程教程4:关系运 ...

  9. python是人都能学会_人人都能学会的python编程教程15:高级特性2

    生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...

最新文章

  1. Microbiome:应用多维宏组学方法协同揭示复杂细菌群落对目标底物代谢的菌间相互关系(一作解读)...
  2. flutter_webview_plugin 无法加载网页的异常处理
  3. Win7 64位的SSDTHOOK(1)---SSDT表的寻找
  4. 谷歌I/O走进TensorFlow开源模型世界:从图像识别到语义理解
  5. Ubuntu 10.04下SSH配置
  6. Yii的查询搜索函数find findAll findOne:find就是返回结果 findone就是返回一条数据 findall就是返回所有数据
  7. 华为手机像素密度排行_2020上半年手机芯片十大排行:华为麒麟990第四,骁龙865第一...
  8. libevent 源码阅读 Ubuntu下muduo库的安装与使用
  9. 第四章使用jQuery操作DOM元素
  10. 12c oracle 激活_Oracle 12C 安装教程
  11. Flask笔记-使用Cookie及简单加密判断是否为登录用户
  12. Vercel反向代理做CDN,免费给网站加速隐藏源站,可绑定域名
  13. win7打开chm文件问题解决之道
  14. 特殊人物请遵循公司工作的基本准则
  15. 爬虫使用分享:风云2号卫星气象照片
  16. 语言包常用语言对应代码
  17. DirectShow 简介
  18. 妈妈计算机英语怎么说,妈妈的英文翻译,妈妈英语怎么说
  19. python画拓扑图权值是线条粗细_拓扑图线条流动效果
  20. No.1_NABCD模型分析

热门文章

  1. 姓名学三才数理怎么算?怎样才能算吉凶?姓名打分PHP源码
  2. python clr createinstance_Python System.Byte方法代码示例
  3. Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析
  4. 计算机桌面太亮,电脑屏幕太亮太刺眼了怎么调整
  5. Java项目登陆输入中文用户名报NullPointerException(空指针异常),输入英文登陆成功
  6. JS exports
  7. c++对ipv4和ipv6地址的兼容处理
  8. AutoCAD.net 获取三维多段线各顶点坐标(C#)
  9. 如何克服上台演讲时紧张情绪
  10. 【微信小程序项目实践总结】30分钟从陌生到熟悉