1、函数基础
  函数是python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构。
  函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件。
  函数用于将相关功能打包并参数。
  python中可以创建4种函数:
    全局函数:定义在模块中
    局部函数:嵌套于其他函数中
    lambda函数:表达式
    方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用
  Python提供了很多内置函数。

  注意:有两种方式可以查看Python的内置函数。

    1、https://docs.python.org/3/library/functions.html

    2、交互式模式下:help(__builtins__)

2、创建函数
语法:
  def functionName(parameters):
    suite

一些相关的概念:
  def是一个可执行语句。因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其他语句,例如if或while中。
  def创建了一个对象并将其赋值给一个变量名(即函数名)。
  return用于返回结果对象,其为可选;无retrun语句的函数自动返回None对象。返回多个值时,彼此间使用逗号分隔,且组合为元组形式返回一个对象。
  def语句运行之后,可以在程序中通过函数后附加括号进行调用。

  2.1、文档化参数
  如果想要给函数写文档,让其他使用该函数人能理解的话,可以加入注释(以#开头)。另外一个方式就是直接写上字符串。这类字符串在其他地方可能会非常有用,比如在def语句后面(以及在模块或者类的开头)。如果在函数的开头写下字符串,它就会作为函数的一部分进行存储,这称为文档字符串。

  示例:

def square(x):
'Calculates the square of the number x.'
return x*x

  文档字符串可以按如下方式访问:
    square.__doc__
  注意:__doc__是函数属性。属性中的双下划线表示它是个特殊属性。

  

  2.2、参数传递:参数的传递是通过自动将对象赋值给本地变量实现的。

  

  不可变参数通过"值"进行传递:
    在函数内部改变形参的值,只是让其引用了另一个对象。
  可变参数通过"指针"进行传递:
    在函数内部改变形参的值,将直接修改引用的对象。

  有两种方式可避免可变参数被函数修改:
    直接传递可变对象的副本:testFunc(A,B[:])
    在函数内部创建可变参数的副本:B=B[:]

示例:
可变参数:
>>> l1 = [1,2,3]
>>> def f1(x):
... x.pop()
... print(x)
...
>>> f1(l1) #这里我们发现当调用函数f1时,会修改列表l1的值。是他们他们都是指向相同的引用。
[1, 2]
>>> l1
[1, 2] 不可变:
>>> l1 = [1,2,3]
>>> def f1(x):
... x.pop()
... print(x)
...
#注意我们这里调用参数的方法l1[:]相当于对列表l1做了一次全拷贝,所以他们没有指向相同的引用。
>>> f1(l1[:])
[1, 2]
>>> l1
[1, 2, 3]

  2.3、函数参数模型
  默认情况下,参数通过其位置进行传递,从左至右,这意味着,必须精确地传递和函数头部参数一样多的参数。但也可以通过关键字参数、默认参数或者参数容器等改变这种机制。
    位置参数:从左至右
    关键字参数:调用函数时,使用"name=value"的语法通过参数名进行匹配
    默认参数:定义函数时使用"name=value"的语法直接给变量一个值,从而传入的值可以少于参数个数
      def f1(x,y,z=9)
    可变参数:定义函数时使用*开头的参数,可用于收集任意多基于位置或关键字的参数
      def f1(*x):把收集到的结果都当成元组来识别
      def f1(**x):把收集到的结果都当成字典来识别
    可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打撒,从而传递任意多基于位置或关键字的参数

  注意:调用函数时,如果混用位置参数和关键字参数时,左侧先写所有位置参数,然后在写所有的关键字参数。
    定义函数时使用有默认值的参数时:形参放左边,有默认值的参数放右边。
    调用函数时使用可变参数要求:
      定义函数时使用*:收集位置参数
      定义函数时使用**:收集关键字参数

示例:
可变参数,用于收集位置参数,返回结果为元组
>>> def f10(*x):
... print(x)
...
>>> m = 3
>>> n = 5
>>> o = 9
>>> f10(m)
(3,)
>>> f10(m,o)
(3, 9)
>>> 可变参数,用于收集关键字参数,返回结果为字典。
>>> def f11(**x):
... print(x)
...
>>> f11(x=1,y=5,z=9)
{'z': 9, 'x': 1, 'y': 5} 可变参数解包:必须匹配
>>> l1 = ["Sun","Mon","Tus"]
>>> x,y,z = l1
>>> print(x,y,z)
Sun Mon Tus 示例:
>>> l1 = ["Sun","Mon","Tus"]
>>> def f1(x,y,z):
... print(x,y,z)
...
>>> f1(*l1)
Sun Mon Tus

  2.4、函数作用域:
  Python创建、改变或查找变量名都是在名称空间中进行。
  在代码中变量名被赋值的位置决定了其能被访问到的范围。
  函数定了本地作用域,而模块定义了全局作用域。
    每个模块都是一个全局作用域,因此,全局作用域的范围仅限于单个程序文件。
    每次对函数的调用都会创建一个新的本地作用域,赋值的变量除非使用global声明为全局变量,否则均为本地变量。
    所有的变量名都可以归纳为本地、全局或内置的(由__builtins__模块提供)。

  

  函数变量作用域:LEGB原则

    作用域越小,优先级越多。

  

python成长之路【第三篇】:函数的更多相关文章

  1. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  2. python成长之路第三篇(3)_内置函数及生成器迭代器

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.lambda表达式 2.map内置函数 3.filter内置函数 4.reduce内置函数 5.yield生成器 ...

  3. python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...

  4. python成长之路第三篇(2)_正则表达式

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...

  5. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  6. 我的Python成长之路---第三天---Python基础(12)---2016年1月16日(雾霾)

    四.函数 日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现.在编程的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代 ...

  7. python成长之路【第九篇】:网络编程

    一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...

  8. python成长之路【第二篇】:列表和元组

    1.数据结构数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence) ...

  9. python成长之路——第三天

    一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在pyt ...

  10. 我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)

    三.深浅拷贝 在Python中将一个变量的值传递给另外一个变量通常有三种:赋值.浅拷贝以及深拷贝 讨论深浅拷贝之前我们把Python的数据类型分为基本数据类型包括数字.字符串.布尔以及None等,还有 ...

随机推荐

  1. uglifyjs压缩批处理

    uglifyjs. 据说是用来压缩JS文件的,据说还能优化JS,据说是基于node的,还据说比Google Closure Compiler更带感. uglifyjs压缩批处理我们不可能每次都打开cm ...

  2. soap request by afnetworking2.X/3.X

    for 2.X 参考 http://jiapumin.iteye.com/blog/2109378 AFHTTPRequestOperationManager *manager = [AFHTTPRe ...

  3. EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除

    外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...

  4. SinalR+WebSocket

    1.参考资料: http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server http://signalr.ne ...

  5. 移动表格行 解决低版本IE fadeIn fadeOut 失效问题

    在维护一个内部使用的web工具的时候,需要在表格里配置参数,并且支持参数列的上下移动,有jQuery-UI工具支持对表格列的拖动,但是此处不追求效果,而且旧系统页面兼容性很差,无奈只能做上下移动的按钮 ...

  6. Echarts 地图(map)插件之 鼠标HOVER和tooltip自定义提示框

    [自行修改 "引号"] 一.鼠标HOVER时的事件: 参照官方文档解释, 可以看出这款插件有丰富的鼠标事件可供选择: 调用鼠标HOVER事件的方法很简单,只需把以下代码放到char ...

  7. Java:并行编程及同步使用方法

    知道java可以使用java.util.concurrent包下的 CountDownLatch ExecutorService Future Callable 实现并行编程,并在并行线程同步时,用起 ...

  8. Access数据库中Sum函数返回空值(Null)时如何设置为0

    在完成一个Access表中数据统计时,需要统计指定字段的和,使用到了Sum函数,但统计时发现,指定条件查询统计时有可能返回空值(Null),导致对应字段显示为空白,正常应显示为0.基本思路是在获取记录 ...

  9. spring事物配置,声明式事务管理和基于@Transactional注解的使用

    http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...

  10. windows 8.1无人值守安装

    上个星期网上泄漏了微软最新的操作系统Windows 8.1,我便迫不及待的下载下来进行体验.发现其安装过程交互次数太多,太过漫长,遂研究了一下无人值守安装,现将成果记录如下. 一. 微软有专门的布署工 ...