一、第一类对象
1、函数名的运用
    函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量
    1、函数名的内存地址

def func1():
print('你是谁,你来自哪里')
print(func1)
# <function func1 at 0x000001256F021E18>

2、函数名可以赋值给其他变量

def func1():
print('这是函数1')
# print(func1)
res = func1 # 把函数当成一个变量赋值给另一个变量
res() # 函数调用 func1()
# 这是函数1

3、函数名可以当作容器类的元素

def func1():
print('大风吹1') def func2():
print('大风吹2') def func3():
print('大风吹3') def func4():
print('大风吹4') lst = [func1,func2,func3,func4]
for i in lst:
i()

4、函数名可以当作函数的参数进行传递

def func1():
print('这两天降温了') def func2(fn):
print('我是函数2')
fn()
print('我是函数2') func2(func1)

 

def func1():
print('哈哈') def func2():
print('嘿嘿') def func3():
print('呵呵') # 代理装饰器雏形
def proxy( a ): # a 就是变量,形参
print('我是代理')
a()
print('代理完毕') proxy(func1)
proxy(func2)
proxy(func3)

 5、函数名可以作为函数的返回值

def func1():
print('这是函数1')
def func2():
print('这是函数2')
return func2 fn = func1() # 执行函数1,函数1返回的是函数2,这时fn之想的就是函数2
fn() # 执行上面返回的函数(也就是函数2)
二、闭包  -->函数的嵌套
 
   闭包就是内层函数,对外层函数(非全局)的变量的引用,
 
闭包的优点:
    1、保护变量不被修改
    2、让一个变量常驻内存
def wapper():
name = '昂昂' # 局部变量常驻于内存
def inner():
print(name) # 在内层函数中调用外层函数的局部变量
return inner # 返回内部函数名 res = wapper() # res 是一个内层函数
res() # res 就是inner,执行的时间不确定,必须保证里边的name存在
# 写一个简易爬虫

from urllib.request import urlopen
# 去掉数字签名
import ssl
ssl._create_default_https_contest = ssl._create_unverified_context def func():
#获取到网页中的内容,当网速很慢时,反复的去打开这个网站,会很慢
content = urlopen("https://www.dytt8.net/";).read() def inner():
return content.decode("gbk") # 网页内容
return inner print('开始网络请求')
ret = func() # 网络请求已经完毕
print("网络请求完毕")
print("第一次",ret()[30])
print("第二次",ret()[30])
查看是否闭包
     我们可以使用 __closure__ 来检测函数是否闭包,使用函数名.__closure__ 返回cell 就是闭包,但会None 就不是闭包
 
不是闭包
def wapper():
name = 'xiaomeng'
def inner():
print('zhangying')
print(inner.__closure__)
inner() wapper()

是闭包

def wapper():
name = 'xiaomeng'
def inner():
print(name)
print(inner.__closure__) # (<cell at 0x000001B2D03086A8: str object at 0x000001B2D03A23F0>,)
inner() wapper()
三、迭代器  -->固定思路,for循环
 
    一个数据类型中包含了__iter__ 函数表示这个数据是可迭代的
 
 dir(数据):返回这个数据可执行的所有操作
s = '你是谁啊'
print(dir(s)) # 可以打印对象中的方法和函数
print(dir(str)) # 可以打印类中申明的方法和函数
判断迭代器和可迭代对象的方案
 
    __iter__    可迭代的
    
    __iter__   __next__  迭代器
 
判断迭代器和可迭代对象的方案(官方)
 
    from collections import Iterable,Iterator
    isinstance(对象,Iterable) 是否是可迭代的   True  or  Fault
    isinstance(对象,Iterator) 是否是迭代器   True  or  Fault
 
模拟for循环
lst = [1, 2, 3]
# 模拟for循环 for el in lst
it = lst.__iter__() # 拿迭代器
while 1: # 循环
try: # 尝试
it.__next__()
except StopIteration: # 出现错误,意味着数据拿完了
break # 结束循环
迭代器一定可迭代,可迭代的东西,不一定是迭代器
 
迭代器的特点:
 
    1、省内存(生成器)
    2、惰性机制
    3、只能向前,不能后退 
 
作用:统一了各种数据类型的遍历
 
 

python - 闭包,迭代器的更多相关文章

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

    小学生都能学会的python(闭包和迭代器) 1. 函数名第一类对象 函数名其实就是变量名 1). 可以像变量一样互相赋值. 2). 可以作为函数的参数,进行传递 3). 可以作为返回值返回 4). ...

  2. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  3. python基础——迭代器

    python基础——迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器 ...

  4. Python 闭包

    什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...

  5. Python闭包与函数对象

    1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (a ...

  6. Python闭包及装饰器

    Python闭包 先看一个例子: def outer(x): def inner(y): return x+y return innder add = outer(8) print add(6) 我们 ...

  7. Python闭包详解

    Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...

  8. Python闭包及其作用域

    Python闭包及其作用域 关于Python作用域的知识在python作用域有相应的笔记,这个笔记是关于Python闭包及其作用域的详细的笔记 如果在一个内部函数里,对一个外部作用域(但不是全局作用域 ...

  9. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  10. Python 闭包小记

    闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来 ...

随机推荐

  1. 从centos镜像创建maven仓库

    创建镜像 1. 使用centos7作为基础镜像2. 将jdk1.8(官方要求1.8)和nexus3解压后的两个文件放进cp进去3. export环境变量后启动一下试一试4. docker commit ...

  2. 实验1 C语言开发环境使用和数据类型,运算符,表达式

    part :验证性内容 .输出学号. #include<stdio.h> int main(void){ printf("); ; } .输入两个整数,求它们的乘积. #incl ...

  3. Linux常用的基础命令总结

    man 查看英文命令帮助   可以看作--help 拷贝目录的命令cp -a  包含所有 ls -a 显示所有文件包括隐藏文件  -ld ls -F 过滤目录文件(给不同类型文件结尾加上不同的符号) ...

  4. git cherry-pick 的使用

    之前和同事在不同的分支开发一个功能的不同模块,在自己分支有用到同事分支的一些实现,被老大告诉用git cherry-pick来搞定! git cherry-pick  能够把另一个分支的一个或多个提交 ...

  5. MyBatis笔记(一) 最简单的select

    小白学习MyBatis的第一天,学习资料包括MyBatis3的官方文档,以及孤傲苍狼大佬的博客.这里先致敬大佬. · 首先,什么是MyBatis? 引用官网的一段话,“MyBatis 是一款优秀的持久 ...

  6. C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密

    前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...

  7. radhat6.6上安装oracle12c RAC (二)

    二.GI(Grid Infrastructure)安装 首先将安装包传到node1的目录 2.1 GI软件安装 2.1.1.解压安装包 #su - grid解压 GRID 到 GRID用户的$ORAC ...

  8. js中call()的用法

    A.call(B,x,y) 1`改变函数A的this指向,使之指向B; 2` 把A函数放到B中运行,x和y是A函数的参数. //父类 Person     function Person() {   ...

  9. 人生苦短,我用Python——博客目录

    计算机基础 计算机硬件基础知识 操作系统基础 Python基础 Windows环境下Python2和Python3的安装 交互式环境与变量的使用 简单介绍Python基本数据类型及程序交互 基本运算符 ...

  10. Ubuntu 下生成 python 环境安装文件 requirements.txt

    参考: 查找python项目依赖并生成requirements.txt Ubuntu 下生成 python 环境安装文件 requirements.txt 首先通过 pip 安装pyreqs模块: p ...