一、函数的嵌套:

   1、函数的嵌套调用

def max2(x,y):
m = x if x>y else y
return m def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,d)
return res3 # max4(23,-7,31,11) 函数的嵌套调用

函数的嵌套调用

   2、函数的嵌套定义

函数的嵌套定义

   3、函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,他是单向的。

def f1():
a = 1
def f2():
def f3():
print(a)
f3()
f2() f1()
################
def f1():
a = 1
def f2():
a = 2
f2()
print('a in f1 : ',a) f1() 作用域链应用举例

作用域链应用举例

二、 函数名的本质

   1、函数名就是函数的地址

    print(func)

   2、函数名可以作为变量

     def func1():
    print(666)
    f1 = func1
    f2 = f1
    f2()

   3、函数名可以作为函数的参数

    def func():
     print(666)
    def func1():
     func()
    def func2(x):
     x()
    func2(func1)

   4、函数名可以当做函数的返回值

    def wraaper():
     def inner():
     print('inner ')
     return inner
    ret = wraaper() # inner
    ret() # inner()

   5、函数名可以作为容器类类型的元素

    def func1():
     print('in func1')     def func2():
     print('in func2')     def func3():
     print('in func3')     def func4():
     print('in func4')
    l1 = [func1,func2,func3,func4]
    for i in l1:
     i()

   向上面的函数名这种,第一类对象     

    第一类对象(first-class object)指
      1.可在运行期创建
      2.可用作函数参数或返回值
      3.可存入变量的实体。

   globals()   和 locals()

    globals():返回全局变量的一个字典

    locals():返回当前位置的局部变量的字典

三、闭包

   内层函数对外层函数的变量(非全局变量)的引用,并返回,就这样形成了闭包。

    def wrapper():

      name='alex'

      def inner():

        print(name)

      inner()

      return inner

    wrapper()

   闭包的作用:

    当程序执行时,遇到了函数执行,他会在内存中开辟一个局部名称空间,如果这个函数内部形成了闭包,那么他就不会随着函数的结束而消失。

#输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner f = func()
f() #输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner f2 = func2()
f2()

判断闭包函数的方法__closure__

def wrapper():
money = 1000
def func():
name = 'eva'
def inner():
print(name,money)
return inner
return func f = wrapper()
i = f()
i() 闭包嵌套

闭包嵌套

from urllib.request import urlopen

def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read()
return get xiaohua = index()
content = xiaohua()
print(content) 闭包函数获取网络应用

闭包函数获取网络应用

四、迭代器

    1、可迭代对象:str,list,dict,tuple,set,range()

    2、对象内部含有__iter__方法就是可迭代对象

    3、可迭代对象满足可迭代协议

   判断一个对象是否是可迭代对象:

     第一种方法:print ('__iter__' in  dir (s1))

     第二种方法:from collcetions import iterable可迭代对象/Iterator迭代器

       print(isinstanse)('alex',Iterable)

       print(isinstanse)('alex',Iterator)

   迭代器:对象内部含有__iter__方法且含有__next__方法就是迭代器

   可迭代对象vs迭代器

     可迭代对象不能取值,迭代器是可以取值的,但是可迭代对象可以转化成迭代器

        lis=[1,2,3]

        itrl=lis.__iter__()

        print(itrl.__next__())

     迭代器如何取值:__next__一次取一个值

   可迭代对象和迭代器的区别:

    (1)可迭代对象不能取值,迭代器可以

    (2)迭代器非常节省内存

    (3)迭代器每次只会取一个值

    (4)迭代器是单向的,不回头

   for 循环:

    将可迭代对象转化成迭代器

    调用__next__方法取值

    利用异常处理停止报错

    s1 = 'kfdsjl'
    iter1 = s1.__iter__()
    while 1:
     try:
     print(iter1.__next__())
     except StopIteration:
     break

《Python》 函数嵌套、闭包和迭代器的更多相关文章

  1. 孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归

    孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python函数非常的灵活,今天学习了python函数的以 ...

  2. 第十七篇 Python函数之闭包与装饰器

    一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...

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

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

  4. python基础 (函数名,闭包,和迭代器)

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

  5. python之函数名,闭包、迭代器

    一.函数名的运用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1,函数名的内存地址: def func(): print("呵呵") pr ...

  6. Py修行路 python基础 (九)作用域 函数嵌套 闭包

    名称空间与作用域 变量,函数 分成三种 #内置名称空间  内置函数, 系统函数内部自定义的. python查看内置函数,命令: import builtins dir(builtins) #全局名称空 ...

  7. python全栈 函数名 闭包及迭代器

    1,函数名的运用 2.闭包 3.迭代器 一.函数名的运用 1.函数名的命名规范和变量是一样的 函数名其实就是变量名 (1)函数名的内存地址 例: def func(): print("ale ...

  8. python函数之闭包函数与无参装饰器

    一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x ...

  9. python函数中闭包的概念说明

    函数中闭包的概念说明 闭包: 内层函数对外层函数非全局变量的引用,就叫做闭包 判断闭包方法 ._closure_ : 执行后返回有效信息就是闭包,返回none就不是闭包 举例1: 是闭包 def wr ...

  10. Python中的闭包与迭代器

    前面内容补充 函数名分应用(第一类对象) 函数名的命名规范与变量命名是一样的函数名其实就是变量名 函数名可以作为列表中的元素进行存储 例如: def func1(): pass def func2() ...

随机推荐

  1. javascript 构造函数类和原型 prototyp e定义的属性和方法的区别

    1.把方法写在原型中比写在构造函数中消耗的内存更小,因为在内存中一个类的原型只有一个,写在原型中的行为可以被所有实例共享,实例化的时候并不会在实例的内存中再复制一份而写在类中的方法,实例化的时候会在每 ...

  2. RSA加密解密中pkcs1与pkcs8格式私钥互相转换

    net,ios中rsa加解密使用的是pkcs1,而java使用的是pkcs8 如果是按1024取模(通常都是1024),pkcs1格式的私钥长度应该是812.如果是pkcs8的格式的密钥长度为861. ...

  3. (转)MyBatis & MyBatis Plus

    (二期)3.mybatis与mybatis plus [课程三]mybatis ...运用.xmind0.1MB [课程三]mybatis...机制.xmind0.2MB [课程三]mybatis与j ...

  4. YOLOv1-darknet 内容解析

    目录 YOLOv1-darknet 内容解析 1. 核心思想 2. 特点 3. 缺点 4. 算法流程 5. 详细内容 6. 主要参考 YOLOv1-darknet 内容解析 1. 核心思想 目标检测分 ...

  5. windows与kali双系统安装基本教程

    以前写过一篇在虚拟机中安装kali的基本教程的文章,那时候的kali还是1.0时代,现如今已经kali2.0了,在虚拟机中运行kali还是会受到性能的影响,所以还是装到自己电脑上跑起来最爽.当然如果你 ...

  6. C++学习笔记(二)——交换函数(swap)

    这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C++中如何选择传参方式. 先来看第一段程序: void swap(int x, int y) { int temp = y; y = ...

  7. HDU 6098 Inversion

    Inversion 思路:从大到小排序后,每次找到第一个下标不整出i的输出. 代码: #include<bits/stdc++.h> using namespace std; #defin ...

  8. 一个纯净的webpack4+angular5脚手架

    该篇主要是结合刚发布不久的webpack4,搭建一个非cli的angular5的脚手架demo,主要分为以下几个方面阐述下脚手架结构: # 脚手架基础架构(根据angular5的新规范) /** * ...

  9. C#中简单的文件操作实例

    using System; using System.IO; namespace Demo { class Program { static string tmpPath = @"D:/Lg ...

  10. select exists 的应用一例

    当遇到多层exists的时候,事情就变得开始复杂了.我们来看看这个例子吧 假设有三张表 选课表:学号.课程号 学生表:学号.姓名 课程表:课程号.课程名 请选出选了所有课程的学生 SELECT 姓名 ...