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 函数名的使用、闭包、迭代器的更多相关文章

  1. 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器

    1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用 1.赋值 def func(): print("你吃了么?") # print(func) # a = func # ...

  2. python基础之函数名的使用,闭包以及迭代器

    内容梗概: 1. 函数名的使⽤用以及第⼀一类对象 2. 闭包 3. 迭代器 1.函数名一. 函数名的运⽤.函数名是一个变量, 但它是⼀个特殊的变量, 与括号配合可以执行函数的变量.1.1 函数名的内存 ...

  3. day12 python函数名的应用 闭包 迭代器

    day12 python   一.函数名的应用(是第一类对象)     函数名的命名规范和变量是一样的     函数名其实就是变量名 def func():     print('i am funct ...

  4. day 12 函数名的应用 闭包 迭代器

    今日主要内容 1, 函数名的应用,第一类对象 函数名可以像变量一样进行使用   #再函数名后面添加() 才是对函数的调用, 否则打印的是函数的内存地址 1.赋值 2.作为list元素 3.作为参数 d ...

  5. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  6. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  7. Day 11 函数名,闭包,装饰器. +作业

    '''一.函数名.def func(): print(5555)print(func)#输出结果 <function func at 0x026B5E88> 打印函数地址. # 1. 函数 ...

  8. Python基础之 函数名,闭包,和迭代器

    1.函数名作用 函数名本质上就是函数的内存地址或对象. 1.可以被引用 2.可以被当作容器类型的元素 3.可以当作函数的参数和返回值 4.如果记不住的话,那就记住一句话,就当普通变量用 2.闭包 什么 ...

  9. python中的函数名,闭包,迭代器

    一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...

随机推荐

  1. js实时显示鼠标坐标

    <!DOCTYPE html><html><head>    <meta charset="utf-8">    <title ...

  2. Windows编程1

    一个最简单的windows必须包括两个函数: 1.入口函数:WinMain 2.窗口过程回调函数:WndProc 结构如下: #include <windows.h> //窗口过程回调函数 ...

  3. Pathon学习笔记1

    1.解释型语言和编译型语言 编译型:需要一个翻译的程序——编译器(Compiler)对源代码进行转化,变成可执行代码,称为编译(Compile).大的复杂的程序还需要链接程序(Linker)来链接各个 ...

  4. vue 单独页面body css 样式设置

    给某个page下template中的第一个div设置如下样式: .body-bg { position: absolute; width: 100%; height: 100%; top:; left ...

  5. HTML5 关于本地操作文件的方法

    由于传统 b/s 开发出于安全性的考虑,浏览器对于本地文件的操作权限几乎没有,用户想要操作一个文件基本都是采用先上传到服务器, 再回显给浏览器供用户编辑,裁剪等的方法,这种方式虽然可行,但其对于服务器 ...

  6. sql存储过程调用示例

    1.配置文件: <connectionStrings> <add name="constr" connectionString="data source ...

  7. wcf_first

    WCF包括3部分:client(需要连接到哪里,需要调用什么),service(宿主,及其消息的公开,地址的公开),wcf服务库(提供契约名称,及其怎么干) 步骤: 1.新建wcf库,其中提供一个契约 ...

  8. node图片资源捉取

    开头先简单说明一下,因为网络资源上最多的资源就是图片,所以在这里也只简单的捉取了图片资源,至于其他的文档,音乐等我是没有试过的.所以暂时还是以图片为案例!!! Step1 首先我们需要加载我们需要的资 ...

  9. MFC 中MessageBox 显示在所有窗口的最上面

    int MessageBox(   HWND hWnd,          // handle of owner window   LPCTSTR lpText,     // address of  ...

  10. struts2注解json 配置文件json

    java提供了便捷的Json-lib  类库,能够让我们很方便的将 Array / JavaBean / Map 解析成 JSON 串,当然反之也是可以的. struts2借助于json-lib类库, ...