对于Python的函数,我们需要记住的是:

1. 函数的默认返回值是None。

2. python是一个自上而下逐行解释并执行的语言。因此,函数的定义必须在函数被调用之前。同名的函数,后定义的会覆盖前面定义的。

3. 程序执行的时候,遇到函数定义只会先将函数整体读进内存,并不立刻执行。等到函数被调用的时候才执行函数体。

4. python函数的参数传递的是一个引用而不是值。这点很重要。这一点可以用下面的例子证明:

def f1(a_list):
    s = id(a_list)
    a_list[0] = 5
    print(s)
    print(a_list)

li = [1,2,3,4,]
f1(li)
print(id(li))
print(li)

运行结果:

11797576
[5, 2, 3, 4]
11797576
[5, 2, 3, 4]

  对于函数,最重要的知识点莫过于参数了。参数分为形式参数(形参)和实际参数(实参)。

  def f1(a,b,c):

    pass

  f1(1,2,3)

  其中,a,b,c就是形参,1,2,3就是实参,也就是实际要传递的参数。通常在传递参数的时候我们按照参数的位置,逐一传递,这叫“位置参数”。而有时候我们会用“形参名”=“值”的方式传递参数,这叫“指定参数”。


Python中的形式参数有以下几种:

一、普通参数:

  它们在参数列表中的位置相对固定,集体排在最左边,必须根据其顺序进行参数传递。例如:

def f1(a,b,c):
    print(a,b,c)

f1(1,2,3)

  在传递参数时,位置参数必须在左边,指定参数必须位于右边。例如:

def f1(a,b,c):
    print(a,b,c)

f1(1,c=3,b=2)

  但这样不行:

def f1(a,b,c):
    print(a,b,c)

f1(c=3,1,b=2)

二、默认参数:

  默认参数是为某些参数设定一个默认值,既可以减少参数传入量,也可以享受使用默认值的便利。默认参数必须位于参数列表的最后部分!例如:

def f1(a,b,c=3):
    print(a,b,c)

f1(1,2)

  上面的例子也可以这么引用:f1(1,2,4),这时我们指定了c的值为4,而不使用默认值。

  但在混合使用普通参数和默认参数的时候要注意一个问题,下面这个例子,a、b为普通参数,c、d为默认参数。我们希望c使用默认值,但是d另外指定值。正确的做法是:

def f1(a,b,c=3,d=4):
    print(a,b,c,d)

f1(1,2,d=8)

  此处要明确的使用“d=8”的传递形式。如f1(1,2,,8),f1(1,2,8)之类的方式都不行。


三、动态参数

  Python的动态参数有两种,分别是*args和**kwargs,这里面的关键是一个和两个星号,而不是args和kwargs,实际上你可以使用*any或**whatever的方式,但就如self一样,潜规则我们使用*args和**kwargs。

  1、*args:一个星号表示接受任意个动态参数。调用时,会将实际参数打包成一个元组传入形式参数。如果参数是个列表,会将整个列表当做一个参数传入。例如:

def f1(*args):
    print(args)

f1('a','b','c')
li = [1,2,3]
f1(li)

运行结果:

('a', 'b', 'c')
([1, 2, 3],)

  但是!如果传入一个迭代器,例如字符串和列表,并在参数前面加上*,那么就会将迭代器的各个元素逐一当做参数传递给*args。例如:

def f1(*args):
    print(args)

li = [1,2,3,4]
f1(*li)

运行结果:
(1, 2, 3, 4)

  2、 **kwargs:两个星表示接受键值对的动态参数,数量任意。调用的时候会将实际参数打包成字典。例如:

def f1(**kwargs):
    print(kwargs)

f1(k1 = 'v1')

运行结果:
{'k1': 'v1'}

  如果,想传递一个字典类型作为参数呢?如下所示:

def f1(**kwargs):
    print(kwargs)

dic = {
    'k1':'v1',
    'k2':'v2'
}

f1(dic)

  结果却会报错,提示TypeError: f1() takes 0 positional arguments but 1 was given,意思是不需要位置参数,你却给了一个。那怎么传递字典的键值对呢?

用两个星号!如下所示:

def f1(**kwargs):
    print(kwargs)

dic = {
    'k1':'v1',
    'k2':'v2'
}

f1(**dic)

运行结果:
{'k1': 'v1', 'k2': 'v2'}

四、万能参数(理论上)

   当*args和**kwargs组合起来使用,理论上能接受任何形式和数量的参数,在很多代码中我们都能见到这种定义方式。需要注意的是,*args必须出现在**kwargs之前。

def f1(*args,**kwargs):
    print(args,kwargs)

f1(1,2,3,4,k1 = 'v1',k2 = 'v2')

运行结果:

(1, 2, 3, 4) {'k1': 'v1', 'k2': 'v2'}

  上面的例子中,1,2,3,4会传入*args;k1 = 'v1',k2 = 'v2'会传入**kwargs

Python函数解析的更多相关文章

  1. Python urllib urlretrieve函数解析

    Python urllib urlretrieve函数解析 利用urllib.request.urlretrieve函数下载文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Ur ...

  2. python重要的第三方库pandas模块常用函数解析之DataFrame

    pandas模块常用函数解析之DataFrame 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器 ...

  3. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  4. Python XML解析(转载)

    Python XML解析 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是 ...

  5. python函数基础以及函数参数简解

    python中函数分为函数.内置函数Python所有的内置函数 自定义函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. ...

  6. Python网页解析

    续上篇文章,网页抓取到手之后就是解析网页了. 在Python中解析网页的库不少,我最开始使用的是BeautifulSoup,貌似这个也是Python中最知名的HTML解析库.它主要的特点就是容错性很好 ...

  7. python函数参数的pack与unpack

    python函数参数的pack与unpack 上周在使用django做开发的时候用到了mixin(关于mixin我还要写一个博客专门讨论一下,现在请参见这里),其中又涉及到了一个关于函数参数打包(pa ...

  8. Python 函数基础、有序集合、文件操作(三)

    一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...

  9. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

随机推荐

  1. Asp.net WebApi + EF 单元测试架构 DbContext一站到底

    其实关于webapi和Ef service的单元测试我以前已经写过相关文章,大家可以参考: Asp.net WebAPI 单元测试 单元测试 mock EF 中DbContext 和DbSet Inc ...

  2. EWM一个仓库号对应ERP多个PLANT的配置

    1. CIF多个DC到EWM系统,创建SCU并配置成仓 2. tx:/sapapo/loc3 对多个DC生成分配模型 3. IMG:分配仓库编号 去掉缺省的授权处理方 4. 维护SCU hierarc ...

  3. DataGridView很详细的用法(转载)

    一.DataGridView 取得或者修改当前单元格的内容: 当前单元格指的是 DataGridView 焦点所在的单元格,它可以通过 DataGridView 对象的 CurrentCell 属性取 ...

  4. [C] tcharall(让所有平台支持TCHAR)v1.1。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释

    作者:zyl910 v1.1版的改动如下—— 将源码上传到github. 调整目录结构. 添加CMake编译配置文件. 使用doxygen规范注释. 文件清单—— docs\ docs\images\ ...

  5. Meaningful Use 中与HL7相关的消息及医疗文档

    汇总 HL7 消息 入出转消息 ADT A01,A03,A04,A08 免疫消息 VXU V04 电子处方消息 NEWRX Message v8.1 EDIFACT, v8.1 XML,  v10.6 ...

  6. [Aaronyang] 写给自己的WPF4.5 笔记21 [3d课 2/4]

    1. 当然复杂的3d模型我们是可以通过更专业的工具做出来,然后导入项目中,我们只是方便演示,选择简单的图形. Tip: 关于摄像机的NearPlaneDistance和FarPlaneDistance ...

  7. 服务器断电,Oracle数据库无法启动解决方案

    数据库没有备份的情况下,数据库所在服务器由于意外断电,导致服务器启动之后,Oracle数据库startup报错. 1. 数据库没开归档模式 2. 无备份 解决方案: 1 2 3 4 5 6 7 8 9 ...

  8. MySQL – 导出数据成csv

    方案有很多种,我这里简单说一下: 1.  into outfile SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' FIELDS TERMI ...

  9. Gradle自定义你的BuildConfig

    BuildConfig.DEBUG 首先在Gradle脚本中默认的debug和release两种模式BuildCondig.DEBUG字段分别为true和false,而且不可更改.该字段编译后自动生成 ...

  10. CSS基础(二):基础和语法

    CSS语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明.选择器通常是您需要改变样式的 HTML 元素. selector {declaration1; declaration2; . ...