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

  - 函数的定义

    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. Excel数据导入数据库

    maven依赖 <!--excel相关依赖--> <dependency> <groupId>org.apache.poi</groupId> < ...

  2. dom父节点

  3. [RabbitMQ]Windows环境下rabbitmqclt(Command Line Tools)出现Erlang distribution failed错误的解决方法

    摘要 当使用rabbitmqctl时出现Erlang distribution failed,把%SystemRoot%Windows\System32\config\systemprofile下的. ...

  4. window系统安装jdk,jre

    java开发少不了安装jdk.当然如果只是想运行其他人的java项目,只需要安装jre就行了,不需要安装jdk,jdk是编译用的.jdk可以同时安装多个 版本,只需要在项目部署时注意切换版本选择.在这 ...

  5. spring mvc踩坑记

    前言 主要介绍自己在学习spring mvc过程中踩到的一些坑,涉及到当时遇到这个错误是如何思考的,对思路进行总结,下次遇到类似的错误能够提供一些思路甚至快速解决. 环境准备 jdk8,spring4 ...

  6. Struts2_结果类型_resulttype_1

    看下面的例子: 一般使用4种:dispatcher(容器内跳转到JSP页面).redirect(重定向到jsp页面).chain(容器内跳转到另一个Action).redirectAction(重定向 ...

  7. 我的ORM框架

    任何系统的基础,都可以算是各种数据的增删改查(CRUD).最早操作数据是直接在代码里写SQL语句,后来出现了各种ORM框架.C#下的ORM框架有很多,如微软自己的Entity Framework.第三 ...

  8. 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)(转)

    这篇文章给大家介绍关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)的相关资料,还给大家收集些关于MySQL会出现中文乱码原因常见的几点,小伙伴快来看看吧   最近两天做项目总是被乱码问题困 ...

  9. anaconda和jupyter notebook使用方法

    查看安装的conda版本 conda --version 如果没有安装anaconda,可以从以下链接下载anaconda或者miniconda,两者安装一个就可以了 miniconda大约50M h ...

  10. simotion读写CF卡,保存/读取变量

    simotion读写CF卡功能 1 使用西门子的Simotion运动控制器时,有时需要用到 读/写 CF卡的功能.主要来自以下几个方面的需求. 1)用户数据量较大,可保持(retain)存储区的容量不 ...