## 函数
  - 函数是代码的一种组织形式,一般一个函数完成一个特定功能
  - 函数需要先定义后使用

  - 函数的定义

    def func_name(参数):
      func_body
      ...
      return func_result

## 函数的返回值
  - 函数和过程的区别就在于有没有返回值
  - 用return关键字表示返回内容
  - 函数内在执行到return语句后,整个函数无条件结束执行
  - 若在函数定义时没有明确的写明return内容,则该函数默认返回None
  - 推荐无论函数有没有返回值都以return结束

## 函数的参数

  - 位置参数(positional argument)
    - 参数的值按照顺序依次传递
    - 最常见,但是必须牢记每个位置参数的含义,若位置混淆,将会得到不可预测的结果

    def self_intro(name, age, love):
  return "Hello, I'm {0}, {1} years old, I love {2}".format(name, age, love)     self_intro("Stanley", 22, "Python")
    # "Hello, I'm Stanley, 22 years old, I love Python"

    - 若参数位置错误,将会得到意外的结果

    self_intro(22, "Stanley", "Python")
    # "Hello, I'm 22, Stanley years old, I love Python"

  - 关键字参数(keyword argument)
    - 在函数调用时使用关键字,明确每个参数对应的值,以避免位置参数带来的混乱

    self_intro(age=22, name="Stanley", love="Python")
    # "Hello, I'm Stanley, 22 years old, I love Python"

    - 也可以将位置参数和关键字参数结合使用,此时位置参数位置必须对应,关键字参数位置可以不对应

    self_intro("Stanley", love="Python", age=22)
    # "Hello, I'm Stanley, 22 years old, I love Python"

  - 默认参数
    - 无论是关键字参数还是位置参数,在函数调用时都必须提供参数值
    - 对于不常用的参数或者多次函数调用使用相同值的参数就可以使用默认值参数,在函数调用时若未指定该参数的值,则该参数使用默认值,若指定了参数值则使用指定值

    def self_intro(name, age, love="Python"):
    return "Hello, I'm {0}, {1} years old, I love {2}".format(name, age, love)     self_intro("Stanley", 22)
    # "Hello, I'm Stanley, 22 years old, I love Python"     self_intro("Stanley", 22, love="Lily")
    # "Hello, I'm Stanley, 22 years old, I love Lily"

    - 默认参数在函数被定义的时候就已经计算出来,而不是在程序运行的时候计算,所以在将可变的数据类型(比如列表或字典)当做默认参数时会出现一些问题

    def demo(num, result=[]):
     """
     将第一个参数添加到列表中,并返回一个单值列表
       """
     result.append(num)
     return result     demo(1) # 函数第一次调用没有问题
    # [1]     demo(2)   # 预期返回[2]
    # [1, 2] # 实际返回

    原因分析:默认参数在定义的时候就已经计算出来结果,之后的多次调用都只是针对原有列表进行操作,并没有生成新的列表,所以结果与预期有差异

    修改:

    def demo(num):
     result = [] # 此时每次函数调用都生成一个新的列表
     result.append(num)
     return result     demo(1)
    # []     demo(2)
    # [2] # 结果与预期相同

    或:

    def demo(num, result=None):
     if result is None: # 若函数在调用时没有设置默认参数,则生成新的空列表
     result = []
     result.append(num)
     return result     demo(1)
    # []     demo(2)
    # []     demo(3, result=[1, 2])
    # [1, 2, 3]     demo(4)
    # [4]

  - 收集参数
    - 收集参数有两种,分别使用*收集位置参数,使用**收集关键字参数

    - 使用*收集位置参数
    - 当参数被用在函数内部时,*将一组可变数量的位置参数收集添加到一个元组中
    

    def get_args(*args):
     return args     get_args(1, 2, 3, "a", "b")
    # (1, 2, 3, 'a', 'b')

    - 位置参数和*收集参数同时使用,位置参数在获取值后,将其余位置参数全部放入*收集参数中      

    def self_intro(name, age, *loves):
     return "Hello, I'm {0}, {1} years old. I love {2}".format(name, age, loves)     self_intro("Stanley", 22, "Python", "JS", "HTML", "CSS")
    # "Hello, I'm Stanley, 22 years old. I love ('Python', 'JS', 'HTML', 'CSS')"

    - 使用**收集关键字参数
      - 使用**可以将参数收集到一个字典中,参数的名称是字典的键,对应的参数值是字典的值

    def self_intro(**kwargs):
     return kwargs     self_intro(name="Stanley", age=22, love="Python")
    # {'name': 'Stanley', 'age': 22, 'love': 'Python'}

  - 几种参数的混合使用

    def self_intro(name, age, *args, love="Python", **kwargs):
     print("My name is {0}, I'm {1} years old".format(name, age))
     for arg in args:
     print("I'm {}".format(arg))
     print("My love is {0}".format(love))
     for k, v in kwargs.items():
     print("My {0} is {1}".format(k, v))     self_intro("Stanley", 22, "male", "Student", nationality="China", major="English")
    # My name is Stanley, I'm 22 years old
    # I'm male
    # I'm Student
    # My love is Python
    # My nationality is China
    # My major is English

## 函数递归
  - 函数自己调用自己
  - 优点:简洁,容易理解
  - 缺点:对递归深度有限制,消耗资源大
  - 写递归时一定注意结束条件,递归次数不要超过python系统限制

  - fibnacci数列

 def fib(n):
lis = []
for i in range(n):
if i == 0 or i == 1:
lis.append(1)
else:
lis.append(lis[i - 1] + lis[i - 2])
return lis def f(n):
if n == 1 or n == 2:
return 1
return f(n - 1) + f(n - 2) print(f(10)) # -> 55
print(fib(10)) # -> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

## 函数文档
  - 函数的文档的作用是对当前函数提供使用相关的参考信息
  - 文档的写法
      - 在函数内部开始的第一行使用三双引号字符串定义符
      - 一般具有特定格式
  - 文档查看
    - 使用help(func_name)
    - 使用func_name.__doc__

本文参考书籍:[美]Bill Lubanovic 《Python语言及其应用》

Python函数及参数的更多相关文章

  1. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...

  2. 【转】Python函数默认参数陷阱

    [转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]) ...

  3. 详解python函数的参数

    详解python函数的参数 一.参数的定义 1.函数的参数在哪里定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开 案列: ...

  4. 可变数据类型不能作为python函数的参数

    可变数据类型:列表.字典 不可变数据类型:整型.浮点型.字符串.元组 为什么可变数据类型不能作为python函数的参数?请看以下例子: def foo(a=[]): a.append(1) retur ...

  5. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  6. python函数动态参数详解

    Python的动态参数: 1,参数前一个"*":在函数中会把传的参数转成一个元组. def func (*args): print(args) func(123,1,2,'a') ...

  7. Python 函数的参数知识汇总

    函数搞不熟,后边就晕头转向了,在此重新归纳一下廖大神的函数教程,加深记忆 一.函数的参数分为: 位置参数 def power(x): # x 就是power(x)的一个位置参数,我们调用power(x ...

  8. Python学习笔记(四)Python函数的参数

    Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...

  9. 使用可变对象作为python函数默认参数引发的问题

    写python的都知道,python函数或者方法可以使用默认参数,比如 1 def foo(arg=None): 2 print(arg) 3 4 foo() 5 6 foo("hello ...

  10. Python面试题目之Python函数默认参数陷阱

    请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_l ...

随机推荐

  1. jq实例

    1.导航栏 <style type="text/css"> * {padding:0;margin:0;list-style:none;} img { width:11 ...

  2. CentOS 使用RPM方式安装MySQL5.6

    转载自:http://blog.csdn.net/liumm0000/article/details/18841197 RPM方式安装MySQL5.6 a. 检查MySQL及相关RPM包,是否安装,如 ...

  3. synchronized + volatile + ThreadLocal

    线程的共享 synchronized  +  volatile + ThreadLocal <1> synchronized 锁住的是对象,当用它来锁住一个类时,实际上也是锁的一个对象. ...

  4. intellijidea课程 intellijidea神器使用技巧1-4 idea安装

    idea安装 run intellij idea==>finish ==>do not import settings==>ok==>evaluate for free==&g ...

  5. 应该知道的一些Markdown语法

    目录 快速输入标题 斜体和粗体,删除线 分隔线 外链接 无序列表 有序列表 定义型列表 插入图片 文字引用 标签分类 表格 行内代码块 代码段 注脚 待办事宜 Todo 列表 显示当前文章的目录 快速 ...

  6. HashWithIndifferentAccess

    The params method returns the parameters passed to the action, such as those fromthe form or query p ...

  7. sudoers文件解析

    分类: LINUX 今天在用户组中新加了一个普 通用户,开始这个用户没有sudo权限,于是通过sudo visudo修改了sudo的配置文件,赋予了普通用户的root权限.后来想着能不能将/etc/s ...

  8. Help for enable SSL 3.0 and disable TLS 1.0..

    https://support.mozilla.org/en-US/questions/967266 i cant find tab Encryption for enable SSL 3.0 and ...

  9. vim复制粘贴到系统剪贴板

    一般来讲,如果你没有在.vimrc中配置过相关的信息的话,可以考虑下面的方法.系统环境 Ubuntu 14.04 LTS. 安装与使用 首先需要安装一个vim-gtk 命令$sudo apt-get ...

  10. traffic_light_bag_file 数据集 下载链接

    链接:https://pan.baidu.com/s/19p5aGRfs6iFtN_SWAxCkRQ 密码:v9wx