Python学习day13-函数进阶(1)

闭包函数

闭包函数,从名字理解,闭即是关闭,也就是说把一个函数整个包起来。正规点说就是指函数内部的函数对外部作用域而非全局作用域的引用。

为函数传参的方式有常用有以下两种:

  1. 用参数的形式

    xxxxxxxxxx
    5

    1
    def func(x):

    2
        print(x)

    3
        

    4
    func(1)

    5

  2. 包给函数

    xxxxxxxxxx
    11

    1
    def outter(x):

    2
        x = 1

    3
        

    4
        def inner():

    5
    print(x)

    6
        return inner

    7
    f = outter(1)# outter的返回值为inner所以会执行到print(x)

    8

    9
    f()

    10
    f()

    11

    闭包函数的应用

    闭包的意义在哪呢,其返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用的时候,都会优先调用外层包裹的作用域。

    其主要应用领域就在于延迟计算和爬虫领域,可以简化代码量,也会使代码更加的稳定。

装饰器

装饰器是一个逻辑上比较复杂的概念,所幸我们并不必追究太深,只需知道其使用方法和大概原理即可。

所以什么是装饰器呢,个人理解装饰器就是包裹在函数外面的另外一个函数,而且装饰器的起到对原函数增加功能的作用,且不影响原函数的调用和存在。

需要注意的是,装饰器本身其实是任意可调用的对象,被装饰的对象也可以是任意可调用的对象。

装饰器的实现必须遵循的两大原则在于:

  • 不修改被装饰对象的源代码
  • 不修改被装饰对象的调用方式

装饰器模板

这里咱们就不举例那些非常复杂的装饰器模型了,只会越看越晕,我们只需要记住并熟练一个装饰器的模板就可以了,万能模板如下:

xxxxxxxxxx

1
def deco(func):

2
    def wrapper(*args,**kwargs):

3
    # 在这里写需要添加并实现的功能

4
        res = fun(*args,**kwargs)

5
        return res

6
    return wrapper

7
# 调用方式如下

8
def f1():

9
print('from f1')

10
    

11
f1 = deco(f1)

12
f1()

迭代器

迭代是一个比较常见的概念,迭代,也就是更新换代,一个接着一个改变,但单纯的重复并不是迭代。

可迭代对象

Python中一切皆对象(注意,此对象非彼对象)。对于这一切对象中,只要是有__iter__方法的对象,都是可迭代对象。

xxxxxxxxxx
1

1
name = 'nick'.__iter__

2
lis = [1,2].__iter__

3
tup = (1,2).__iter__

4
dic = {'name':'nick'}.__iter__

5
s1 = {'a','b'}.__iter__

6
f = open('file','r',encoding = 'utf8')

7
f.__iter__

8
f.close()

迭代器对象

可迭代对象是有__iter__方法的对象,而迭代器对象则是同时有__iter____next__方法的对象。

其实只有文件本身即是可迭代对象又是迭代器对象,别的对象都需要用__iter__拿到迭代器本身才可以用__next__方法。

for循环的原理

for循环其实就是一种迭代器循环,in后面必须是可迭代的对象,这点在leetcode刷题的时候就可以碰到,但凡是碰到链表类型的题目,都是不能放在for循环里的,也不能用len测量其长度,就是因为链表类型不可迭代。

其实for循环的内层原理类似于while然后捕捉错误,比如:

xxxxxxxxxx
1

1
lt = [1,2,3]

2
lt_iter = lt.__iter__()

3
while 1:

4
 try:

5
 print(lt_iter.__next__())

6
 except StopIteration:

7
 break

8
# for循环本身到最后也是报错的StopIteration,只不是内部做了处理,捕捉到报错直接break了,所以for循环的本质还是while循环。

转载于:https://www.cnblogs.com/Xu-PR/p/11342604.html

Python学习day13-函数进阶(1)相关推荐

  1. Python之路---函数进阶

    程序员三大美德: 懒惰 因为一直致力于减少工作的总工作量. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知 ...

  2. Python学习之函数返回多个值

    Python学习之函数返回多个值 问题的引出 Python中,一个函数能不能一次返回多个值? 在C语言中,函数最多返回一个值,如果要返回多个值,可以把这些值封装在一个结构体中.注意,C语言不允许函数返 ...

  3. python判断特殊字符的函数,python学习--quote()函数,,屏蔽特殊的字符、比如

    python学习--quote()函数,,屏蔽特殊的字符.比如 屏蔽特殊的字符.比如如果url里面的空格!url里面是不允许出现空格的. 在 Python2.x 中的用法是: urllib.quote ...

  4. python学习 字符串函数

    python学习 字符串函数 字符串不能被改变,以下和函数,只是 原字符串初始化后不能改变,函数只是将改变后的值返回赋给新的变量(当然可以赋给原来的变量) 大小写函数 capitalize()函数 大 ...

  5. python学习(函数)

    前言:目前先将python的基础语法和知识学完,再去尝试写脚本,这次就学习python中的函数和类. 一.定义函数 使用关键字def 来定义一个函数,这就是函数定义,而且定义以冒号结尾. 格式: de ...

  6. python学习之函数

    最近跟着廖雪峰老师的python教程在学习,总结一下学习成果 函数定义: 当没有return语句时,返回的结果为None def 函数名 ():函数体return 返回值 函数调用: 我们可以调用py ...

  7. python学习day13 day14 迭代器 生成器

    迭代器 可迭代的: list dic str set tuple f = open() range() enumerate # 显示列表所拥有的所有方法 print(dir([])) 双下方法:很少直 ...

  8. 轩小陌的Python笔记-day11 函数进阶

    day11 函数进阶 目标:掌握函数相关易错点 & 项目开发必备技能. 今日概要: 参数的补充 函数名到底是什么? 返回值和print,傻傻分不清楚. 函数的作用域 1.参数的补充 在函数基础 ...

  9. Python学习8 函数 匿名函数 内置函数

    转换相关的方法-eval 转换相关的方法-json 函数基本语法大纲 函数概念 示例: 题目: 函数的参数 def f(x,y=1,*z,**abc):print(x,y,z,abc,sep=&quo ...

最新文章

  1. 字节一实习生求助:晚上九点半在公司打游戏,被领导发现后开除,将来找工作会背调出来吗?...
  2. Struts2笔记——第一个实例HelloWorld
  3. led内部结构_粘合剂和密封胶性质一样吗?用在汽车、LED灯具需要注意什么?
  4. 推荐一个C++练手项目,面试也可用
  5. php读取excel中数据库,ThinkPHP 框架实现的读取excel导入数据库操作示例
  6. Android ContentProvider
  7. BP算法,用梯度下降法更新权值W与偏置项b
  8. java string... 参数_Java String.Format() 方法及参数说明
  9. 犯罪分子社工GoDaddy 员工,获得密币相关网站域名的控制权
  10. 嘿,我造了个代码高亮的插件
  11. 软通动力华为项目组Java开发面试总结
  12. SAP系统里的统驭科目
  13. Asp.net mvc5开源项目超级冷笑话
  14. 土巴兔CEO王国彬:这五点,决定了你事业的上限
  15. 考研数学:有理函数中多项式分解定理
  16. 从小白到鹅厂的通关秘籍(附简历讲解与部分面试题)
  17. 所谓的我对大学的目标与期望!!!
  18. 矩阵分解算法与因子分解机
  19. [图像形态学操作]——腐蚀和膨胀、开闭运算、黑帽礼帽
  20. SpringBoot实现定时重启项目

热门文章

  1. Lesson 2 Installing the Oracle Database Software
  2. 160525、高并发之mysql主从复制(linux)
  3. java 重定向和转发(转载)
  4. 【C#】using用法
  5. Jquery的.post说解(一)
  6. 人脸识别技术大总结(1):Face Detection Alignment
  7. linux命令之awk命令
  8. 《Spark与Hadoop大数据分析》——1.2 大数据科学以及Hadoop和Spark在其中承担的角色...
  9. C# 面向对象之继承后初始化顺序
  10. oracle入门学习(3) 所用的学习环境介绍与设置