zoukankan      html  css  js  c++  java
  • 基础函数--3

    一: 函数名的应用(第一类对象)

      函数名的命名规范和变量是一样的

      函数名其实就是变量名,与()配合可以执行函数的变量

    1,函数名的内存地址:

    def func():
        print("呵呵")
    print(func)
    
    结果:
    <function func at 0x1101e4ea0>

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

    def func():
        print("呵呵")
    
    print(func)
    
    a = func     # 把函数当成⼀一个变量量赋值给另⼀一个变量量
    a()         # 函数调⽤用 func()        

    3,可以作为列表中的元素进行存储:

    def func1():
        pass
    def func2():
        pass
    lst = [func1,func2]
    for el in lst:
        el

    可以作为参数传递给函数;

    def func():
        pass
    def proxy(fn):
        fn()          #执行传递过来的fn
    proxy(func)      #把函数func当成参数传递给proxy的参数fn

    可以作为函数的返回值;

    def func():
        def inner():
            pass
        return inner
    
    func()()

    二:闭包

    什么是闭包?闭包就是内层函数,对外层函数(非全局)的引用.

    def func1():
        name = "alex"
        def func2():
            print (name)       #闭包
         func2()
    func1()
    
    
    结果: alex

    闭包的作用:

      保护你的变量不受外界影响

      可以让变量常驻内存

    超简易爬虫代码:
    from urllib.request import urlopen
    
    def but():
        content = urlopen("http://www.xiaohua100.cn/index.html").read()
        def get_content():
                return content
         return get_content
    fn = but()      #这里已经开始加载
    
    #后面需要用到这里的内容的时候不需要在执行耗时的操作了
    
    content = fn()
    print(content)      #获取内容
    
    content2 = fn()
    print(content2)      #从新获取内容

    我们可以使用__closure__来检测函数是否是闭包,使用函数名.__closure__返回cell就是闭包,返回None就不是闭包

    def func1():
        name = "alex"
        def func2():
            print(name)     #闭包
        func2()
        print(func2.__closure__)   #(<cell at 0x10c2e20a8: str object at
    0x10c3fc650>,)
    
    func1()

    如何在函数外调用内部函数

    def outer():
        name = "alex"        #内部函数
        def inner():
            print(name)
        return inner
    
    fn = outer()         #访问外部函数,获取到内部函数的函数地址
    fn()        #访问内部函数

    多层嵌套

    def func1 ():
        def func2():
            def func3():
                print("嘿嘿")
            return func3
        return func2
    
    func1()()()

    三,迭代器

      我们之前一致在使用可迭代对象进行迭代操作,那么什么是可迭代对象?

      目前我们熟悉的可迭代对象:str,list,tuple,dic,set

      我们可以使用dirlai 验证查看该数据包含了那些方法

      用来遍历字典,元组,字符串......可迭代对象

    可迭代对象: Iterable  ,里面有__iter__()可以获取迭代器,没有__next__()

    迭代器:   Iterotor  ,里面有__iter__()可以获取迭代器,有__next__()

    迭代器的特点:

      1,只能向前

      2,惰性机制

      3,省内存(生成器)

    for循环的内部机制:

      1,首先获取迭代器

      2,使用while循环获取数据

      3,it.__next__()来获取数据

      4,处理异常   try:xxx             except StopIteration

    it=xx.__iter__()
    while 1:
        try:
            data = it.__next__()
            xxxxxxxx
        except StopIteration:
            break
  • 相关阅读:
    linux基础学习-8.1-无法远程连接服务器常见原因
    schema约束文档 根元素的写法
    用双重for循环生成九九乘法表
    Random类、String类的一些常用方法
    Random()方法结合Scanner类实现猜数游戏
    使用System类和Date类来计算自己从出生到现在度过了多少时间
    获取map集合中键和值的三种方式
    斗地主实现洗牌发牌功能
    集合框架<一>
    动手动脑2
  • 原文地址:https://www.cnblogs.com/wangjun187197/p/9456425.html
Copyright © 2011-2022 走看看