python note 11 函数名的使用、闭包、迭代器
1、函数名就是一个变量
def func():
print("我是一个小小的函数")
a = func
print(a)
#输出变量存放地址 <function func at 0x00000251AD780048>
func()
#func()等同于a(),输出 我是一个小小的函数
2、函数名是变量名
def func1():
print("我是1")
def func2():
print("我是2")
def func3():
print("我是3")
lst = [func1, func2, func3]
for el in lst:
el()
#输出 我是1 我是2 我是3
3、函数名可以作为参数传递给函数
def my():
print("我是my")
def proxy(fn): # 代理模式. 装饰器
print("在处理之前")
fn()
print("在处理之后")
proxy(my) # 把函数名作为参数传递给另一个函数
#输出 在处理之前 我是my 在处理之后
def func1():
print("我是func1")
def func2():
print("我是func2")
def func(fn, gn): # 函数名可以作为参数进行传递
print("我是func")
fn()
gn()
print("哈哈哈")
func(func1, func2)
func()()用法
def func():
print("我是func")
a = 10 # 变量
def inner():
print("我是inner")
return inner
ret = func()
ret()
func()() # 先运行func() 然后在返回值上加(),等于上一个写法
#输出 我是func 我是inner
4、闭包
#闭包. 在内层函数中访问外层函数的变量
# 闭包的作用:
# 1. 可以保护你的变量不收侵害
# 2. 可以让一个变量常驻内存
如果不闭包全局变量是不安全的
a = 10 # 不安全的
def outer():
global a
a = 20
def outer_2():
global a
a = 30
outer_2()
outer()
print(a)
#输出 20
#如果交换outer_2()和outer(),那么输出会变为30
闭包变量会常驻内存
def outer():
a = 10 # 常驻内存, 为了inner执行的时候有值.
def inner():
print(a)
return inner
fn = outer()
fn() # 调用的时机是不定的.
#输出 10
超简易爬虫
from urllib.request import urlopen
def outer():
# 常驻内存
s = urlopen("http://www.xiaohua100.cn/index.html").read()
def getContent(): # 闭包
return s
return getContent
print("爬取内容.....")
pa = outer()
ret = pa()
print(ret)
查看是否闭包
def func():
a = 10
def inner():
print(a)
print(inner.__closure__)
func()
# 如果打印的是None. 不是闭包. 如果不是None, 就是闭包
5、迭代器
# dir查看xx类型的数据可以执行哪些方法 print(dir(str))、print(dir(list))、print(dir(int))
# 所有的带__iter__可以使用for循环的, 可迭代对象。print(dir(int)) 没有__iter__
# 可迭代对象可以使用__iter__()来获取到迭代器
# 迭代器里面有__next__()
# s = "石可心喜欢赵一宁"
# it = s.__iter__() # 获取迭代器
# print(dir(it)) # 迭代器里有__iter__ 还有__next__
迭代器特性
# 1. 只能向前.
# 2. 几乎不占用内存, 节省内存(需要明天生成器)
# 3. for循环
# 4. 惰性机制 (面试题,难度系数比较高)
s = "石可心喜欢赵一宁"
it = s.__iter__() # 获取迭代器
print(it.__next__())# 石
print(it.__next__())# 可
print(it.__next__())# 心
print(it.__next__())# 喜
print(it.__next__())# 欢
print(it.__next__())# 赵
print(it.__next__())# 一
print(it.__next__())# 宁
迭代器模拟for循环
lst = ["赵一宁", "石可心", "朱奎峰", "姚明","潘长江"]
for el in lst: # 底层用的是迭代器
print(el)
不输出错误
lst = ["赵一宁", "石可心", "朱奎峰", "姚明","潘长江"]
it = lst.__iter__() # 获取迭代器
while 1:
try: # 尝试执行
el = it.__next__() # 获取下一个元素
print(el)
except StopIteration: # 处理错误,不显示
break
判断是否为迭代器
偏方
# print("__iter__" in dir(it))
# print("__next__" in dir(it))
# 可以通过dir来判断数据是否是可迭代的, 以及数据是否是迭代器
官方方案
# from collections import Iterable # 可迭代对象
# from collections import Iterator # 迭代器
#
# print(isinstance(lst, Iterable))
# print(isinstance(lst, Iterator))
#
# print(isinstance(it, Iterable))
# print(isinstance(it, Iterator))
python note 11 函数名的使用、闭包、迭代器的更多相关文章
- 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器
1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...
- python基础之函数名的使用,闭包以及迭代器
内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
- day 12 函数名的应用 闭包 迭代器
今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: 1. 可以在局部作用域声明一 ...
- Day 11 函数名,闭包,装饰器. +作业
'''一.函数名.def func(): print(5555)print(func)#输出结果 <function func at 0x026B5E88> 打印函数地址. # 1. 函数 ...
- Python基础之 函数名,闭包,和迭代器
1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...
- python中的函数名,闭包,迭代器
一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...
随机推荐
- html+css+jq随记
随便写个博客吧,记录一下自己的历程,今天忽然用自己好久不用的jq还做项目,并且从零开始搭建,让自己慌乱不已啊!遇到了如下问题 1.ios端点击闪屏的问题,解决办法如下 在body上添加 -webkit ...
- (简单)华为M3青春 CPN-AL10的Usb调试模式在哪里打开的步骤
每次我们使用PC通过数据线连接到安卓手机的时候,如果手机没有开启usb开发者调试模式,PC则没能成功检测到我们的手机,有时候我们使用的一些功能比较强的的应用软件比如以前我们使用的一个应用软件引号精灵, ...
- java——什么是浅表副本
ArrayList.clone(),hashtable.clone()方法返回此ArrayList的浅表副本(不复制这些元素本身),那么什么是浅表副本? 一个集合的浅度拷贝意味着只拷贝集合中的元素,不 ...
- c# datatable 分组
DataTable dt = new DataTable(); IEnumerable<IGrouping<, ));//按行政区代码前两位分组
- Flask 里的WEB表单应用
它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器. 创建模板文件 login. ...
- Log4j日志框架学习零到壹(一)
日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...
- 如何清除保存在IE浏览器上的账号密码
1,打开浏览器,打开右上角的工具选项,选择Internet选项 2,在‘常规’选项卡中点击“删除”按钮,在弹框中勾选“密码”,选择删除即可.
- visual studio 2013 几个测试工具(Nunit 3、xUnit)
一.Nunit 3 1.在解决方案里添加一个类库——引用——右键(如下图)) 3.搜索nunit 并安装(如图) 3.注意引入命名空间并给测试类和测试方法添加特性(如图) 4.如果测试通过则为绿色(如 ...
- redis hashmap数据结构分析
说明一点:redis的hash中每一个key都是一个单独的hash表,field是hash表中的key,value是hash表中的value: //redis中hash数据结构为:key-field- ...
- js常用身份校验规则
js常用身份校验规则 var Validator = { extractBirth: function(id) { // 身份证提取出生年月 var re = null, split, year, m ...