小学生都能学会的python(闭包和迭代器)
小学生都能学会的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 urlopen def func():
# 闭包. content会常驻内存
content = urlopen("http://www.xiaohuar.com/").read()
def inner():
return content
return inner print("加载中...")
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__())
小学生都能学会的python(闭包和迭代器)的更多相关文章
- 小学生都能学会的python(函数的进阶)
小学生都能学会的python(函数的进阶) 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def fun ...
- 小学生都能学会的python(函数)
小学生都能学会的python(函数) 神马是函数 函数: 对功能或者动作的封装 函数的定义 def 函数名(形参列表): 函数体(return) ret = 函数名(实参列表) 函数的返回值 retu ...
- 小学生都能学会的python(文件操作)
小学生都能学会的python(文件操作) 1. open("文件路径", mode="模式", encoding="编码") 文件的路径: ...
- 小学生都能学会的python(深浅拷贝)
小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...
- 小学生都能学会的python(小数据池)
小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...
- 小学生都能学会的python(字典{ })
小学生都能学会的python(字典{ }) 1. 什么是字典 dict. 以{}表示. 每一项用逗号隔开, 内部元素用key:value的形式来保存数据 {"jj":"林 ...
- 小学生都能学会的python(列表[ ])
小学生都能学会的python(列表[ ]) 1. 什么是列表(list) 能装东西的东西 列表中装的数据是没有限制的, 大小基本上是够用的 列表使用[]来表示. 在列表中每个元素与元素之间用逗号隔开 ...
- 小学生都能学会的python(编码 and 字符串)
小学生都能学会的python(编码 and 字符串) 一,编码 最早的计算机编码是ASCII. 有英文+数字+特殊字符 8bit => 1byte 没有中文, 后面的编码必须兼容ASCII ...
- 小学生都能学会的python(运算符 和 while循环)
---恢复内容开始--- 小学生都能学会的python(运算符和编码) 一.格式化输出 #占位:"%s"占位,占得是字符串,"%d"占位,占的是数字. # 让用 ...
随机推荐
- 理解 Javascript 执行上下文和执行栈
如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制.理解执行上下文和执行栈同样有助于理解其他的 Jav ...
- @Bean 指定初始化和销毁方法
bean 的生命周期 bean 的创建 --> 初始化 --> 销毁 ioc 容器管理 bean 的声明周期 可以自定义初始化和销毁方法 构造器( 对象创建 )被调用时机 单实例:在容器启 ...
- rabbitMQ学习笔记(五) 消息路由
生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉. 这时候就可以对消息进行过滤了. 在消费者端设置好需要接收的消息类型. 如果不使用默认的E ...
- python:单引号,双引号和三引号
python中字符串可以用单引号括起来,也可以用双引号,这两种方式是等价的需要表示一个字符串对象的话,单引号和双引号没有区别 为什么需要单引号和双引号同时支持,而一般都是”呢? 比如” 双引号’里面有 ...
- Ant批量处理jmeter脚本
Ant是一个可以把代码从某个地方拿来,编译,再拷贝到某个地方去的构建工具.一时冲动学习一下,顺便王婆卖瓜尝试着处理jmeter的脚本,于是,采坑之旅也从此开始.本文省略ant安装步骤和ant脚本说明, ...
- spark中的广播变量broadcast
Spark中的Broadcast处理 首先先来看一看broadcast的使用代码: val values = List[Int](1,2,3) val broadcastValues = sparkC ...
- C++ Primer 学习笔记与思考_3 ---头文件那些事儿(extern)
(一)extern在头文件里的使用方法 由于头文件包括在多个源文件里.而且变量的定义仅仅能出现一次,所以在头文件里. 仅仅能够声明不能够出现定义. 我们能够在头文件里用extern声明全局变量,这样在 ...
- bzoj3713: [PA2014]Iloczyn(乱搞)
3713: [PA2014]Iloczyn 题目:传送门 题解: 随手一发水题x2 直接离线啊,斐波那契到了第五十个就炒鸡大了 代码: #include<cstdio> #include& ...
- JDBC整理
JDBC提供了独立于数据库的统一Api,用以执行SQL命令.JDBC API由以下常用的接口和类组成: DriverManagement:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取C ...
- 3. Longest Substring Without Repeating Character[M] 最大不重复子串
题目 Given a string, find the length of the longest substring without repeating characters. Example 1: ...