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

  - 函数的定义

    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. jQuery源码浅析2–奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  2. Objective-C #define 用法解析 (转)

    原文地址: http://blog.csdn.net/kindazrael/article/details/8108868 Objective-C : #define 用法解析 在 C 语言中,预处理 ...

  3. C++ VS编译问题--LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    用VS编译时,当出现错误LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏: 这个问题的解决方案为: 1. 找到项目\xx属性\配置属性\清单工具\输 ...

  4. APK加固之类抽取分析与修复

    0x00 简单介绍   目前我己知的APK加固主要有以下两种方式(或有其它的方式有待发现) 隐藏dex文件:通过对目标DEX文件进行整体加密或压缩方式把整个dex转换为另外一个文件存放在assets文 ...

  5. 【起航计划 025】2015 起航计划 Android APIDemo的魔鬼步伐 24 App->Notification->Notifying Service Controller service中使用Notification

    这个例子介绍了如何在Service中使用Notification,相关的类为NotifyingController和NotifyingService. 在Service中使用Notification的 ...

  6. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

  7. springboot/springmvc转换器

    常用的转换器 String转Date转换器(用于接受日期参数自动转换成Date类型便于后台数据处理) /** * 全局handler前日期统一处理 * @author zhanghang * @dat ...

  8. oracle-插入到数据库中为日期

    oracle中创建一个表,其中一个字段为date,当我们进行插入操作 create table xf_allsalestotal ( xf_txdate date not null, xf_store ...

  9. Ubuntu小工具

    更好的工具 更多的界面风格: https://github.com/anmoljagetia/Flatabulous 更丰富的终端zsh: https://github.com/robbyrussel ...

  10. 框架: namespace和use的区别以及使用注意项

    我们在使用框架的时候,总会使用到namespace和Use这两个东西,我们先来看它们存在的意义 namespace:是指我们当前类中,所在的位置.使用namespace关键字的话,我们就可以达到效果: ...