python 零基础学习之路-04 函数

 一 函数基础

  1、函数的使用必须遵循先定义后调用,在使用函数时,一定要明确地区分定义阶段和调用阶段。

  2、函数在定义阶段只检测语法,不执行代码!!

  3、定义函数的三种形式:无参、有参、空函数(设计代码结构)。

  4、调用函数:函数名+括号,可以在函数内部用return来返回值,都好分隔多个值返回元祖。(注意:当return执行后,函数立马结束)

  5、函数参数:

      #1、位置参数:按照从左到右的顺序定义的参数

      #2、关键字参数:按照key=value的形式定义的实参

      #3、默认参数:形参在定义时就已经为其赋值

      #4、可变长参数:*args、**kwargs

      #5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递

    需要注意的是:关键字实参必须在位置实参的后面;

                   默认参数可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参);

           默认参数通常放在最右方;

 

二 名称空间与作用域

  1、名称空间:存放名字的地方,三种名称空间(x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)

  2、名称空间的加载顺序:

      #1、python解释器先启动,因而首先加载的是:内置名称空间,全局存活,全局有效。
      #2、执行test.py文件,然后以文件为基础,加载全局名称空间,全局存活,全局有效。
      #3、在执行文件的过程中如果调用函数,则临时产生局部名称空间,临时存活,局部有效。

  3、名字的查找顺序:局部名称空间--->全局名称空间--->内置名称空间

  4、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关。

  5、查看作用域:globals(),locals()

  

三 闭包函数

  1、闭包函数:内部函数包含对外部作用域而非全局作用域的引用

  2、闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

  3、装饰器:装饰器就是闭包函数的一种应用场景,装饰器的作用就是在不修改被装饰对象的源代码且不修改被装饰对象的调用方式的前提下,为被装饰对象添加上新功能。装饰器通常在被装饰函数的正上方单独一行,靠近函数的先执行。

 

四 迭代器与生成器

  1、迭代:迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值。

  2、迭代器,可迭代对象,迭代器对象:

      为什么要有迭代器:对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器。

      什么是可迭代对象:可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__

      什么是迭代器对象:可迭代对象执行obj.__iter__()得到的结果就是迭代器对象,而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。

  3、迭代器的优缺点:

      优点:提供一种统一的、不依赖索引的方式、惰性计算节省内存。

      缺点:无法获取长度,一次性的,只能往后走,不能往前退。

  4、生成器:只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码。注意:生成器就是迭代器,可以如此取值res=next(g)。

  5、yield总结:可以把函数做成迭代器,对比return,可以返回多次值,可以挂起/保存函数的运行状态。

 

五 面向过程编程

  1、首先强调:面向过程编程绝对不是用函数编程这么简单,面向过程是一种编程思路、思想,而编程思路是不依赖具体的语言或语法的。言外之意是即使我们不依赖函数,也可以基于面向过程的思想编写程序。

  2、定义:面向过程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么,基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式。

  3、优点:复杂的问题流程化,进而简单化。

  4、缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身。

  5、应用:扩展性要求不高的场景。

 

六 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

  1、三元表达式: xxx  if  xxx  else xxx

  2、列表推导式:egg_list=['123%s'%r  for r in range(10)]

  3、生成器表达式:chicken=('123%s'%r for r in range(5))   (优点:省内存,一次就生成一个值。)>>>next(chicken)  

  4、递归与二分法:递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用。调用函数会产生局部的名称空间,占用内存,因为上述这种调用会无需调用本身,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制。

  5、递归调用应该分为两个明确的阶段:递推,回溯。(python的递归效率低且没有尾递归优化)

  6、二分法:算法的一种,算法是解决问题的方法)可以极大低缩小问题规模。

  7、匿名函数:lambda x,y: x+y   (特点一次性使用 随时定义 

  8、内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii

    常用内置函数表

  拓展返回导师博客:www.cnblogs.com/linhaifeng/articles/7580830.html

posted @ 2018-05-20 22:39  afeng2017  阅读(150)  评论(0)    收藏  举报