python全栈day11

  

01 函数名的应用

理解:可以理解为特殊的变量
  1.函数名等同于函数的内存地址
  2.函数名可以作为变量

def func1():
    print(666)
f1 = func1    #将函数名func1赋值给f1
f2 = f1    #再继续将值赋给f2
f2()      #执行

 

  3.函数名可以当做函数的参数

def func1()
    print(666)

def func2()
    x()
func2(func1) #实参为函数名

  

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

def wrapper():
    def inner():
        print('inner')
        return 666
    return inner             #外部函数将内部函数的函数名当做返回值

ret = wrapper()
ret()        

  

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

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

上述的函数和后面要介绍的类就是第一类对象

02 闭包

定义:

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

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

def wrapper():
    x = 0
    def inner():
        nonlocal x
        a = x
        x += 1
        return a
    return inner      #产生闭包

f1 = wrapper()        #将外部函数赋值给变量
print(f1())               #0
print(f1())               #1
print(f1())               #2

  

03 可迭代对象
  补充:dir()以列表的形式返回该类型数据的所有方法。
  从源码的角度考虑:对象内部含有__iter__方法的就是可迭代对象。

判断方法1:

s = '1234567'       #判断字符串是否是可迭代对象
print('__iter__' in dir(s))

  

04 迭代器
  从源码的角度考虑:对象内部含有__iter__方法,并且含有__next__方法就是迭代器。
  可迭代对象---->迭代器

lis = [1,2,3,4,5]
iter_lis = lis.__iter__()       #方法一
iter_lis2 = iter(lis)           #方法二

  补充判断方法:

from collections import Iterable
from collections import Iterator

print(isinstance('Abner',Iterable))         #返回True表面元素为可迭代对象
print(isinstance('Abner',Iterator))         #返回False表面元素不是迭代器

  

  迭代器的优缺点

  优点:

    1.可以不通过索引或者关键字取值

    2.节省内存空间

  缺点:

    1.无法获取迭代长度,在没有执行到末尾之前

    2.不能回头反复,必须一路走到头

  可迭代对象和迭代器区别:
    1.可迭代对象是不能取值的,而迭代器可以。
    2.迭代器非常节省内存
    3.迭代器每次只会取一个值
    4.迭代器只能单向的,不反复。
  应用:
    1.数据量大
    2.单纯的取值


05 while循环模拟for循环机制

s = 'sadhada'
for i in s:
    print(i)          #for循环

iter_s = s.__iter__()
while 1:                            #利用while循环模拟for循环遍历机制
    try:
        print(iter_s.__next__())
    except:
        StopIteration                   #异常处理
        break

  

原文地址:https://www.cnblogs.com/abner28/p/9493406.html