对于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. android 图片占用内存与什么有关

    android 图片占用内存与什么有关 原文链接:http://blog.csdn.net/zjl5211314/article/details/7041813 在开发手机应用的时候,内存是有限的,那 ...

  2. AngularJS指令嵌套时link函数执行顺序的问题

    今天研究指令嵌套时,发现子指令的link函数先于父指令的link函数执行. 这样和预想的顺序不一样. 也就是说,如果子指令的某个scope变量依赖于父指令传来的参数时,可能一直是undefinded比 ...

  3. 修改oracle密码有效期限制

    racle11g,静默安装后用户的密码有效期默认设置为180天,180天后密码将失效,oracle会提示要修改密码.   我们项目用的是jdbc连接oracle数据库,没法自动处理oracle的这种密 ...

  4. Maven - 解决Maven下载依赖包速度慢问题

    通常我们会因为下载jar包速度缓慢而苦恼,这十分影响开发效率,以及程序员的心情,在IDE下载jar时,无法对IDE做任何动作,只能大眼对小眼. 下载jar速度慢究其原因就是因为很多资源都是国外的,我们 ...

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

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

  6. HDU 3874 Necklace (树状数组 | 线段树 的离线处理)

    Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  7. wordpress自动截取文章摘要代码

    想要实现 wordpress 首页显示摘要有几种方法: 第一种,可以在写文章的时侯在需要分割的地方加入<!–more–>标签,但在输出首页摘要的同时,也会使feed只显示摘要,不方便读者阅 ...

  8. 4kbps~15kbps语音编码器基础框架ACELP

  9. How to create an anonymous IDA PRO database (.IDB)

    Source: http://www.0xebfe.net/blog/2013/01/13/how-to-create-an-anonymous-ida-pro-database-dot-idb/ P ...

  10. SQL Server Profiler:使用方法和指标说明

    SQL Server Profiler的中文意思是SQL Server事件探查,一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接.感觉这个工具的作用还是很大的,给大家分享一 ...