内容简述:

1、函数定义

2、形参与实参

3、关键字参数与默认参数

4、可变参数

5、全局变量与局部变量

6、内部函数

7、闭包

8、lambda表达式

9、递归

1、函数定义

我们可以将一些实现特定功能,重复使用到的「代码片段」抽取出来,封装成一个函数。比如求两个数和的函数:

def plus(a, b):

"""

计算两个数的和

:param a: 第一个参数

:param b: 第二个参数

:return: 两个参数的和

"""

return a + b

if __name__ == '__main__':

print("1 + 2 = %d" % plus(1, 2))

复制代码

运行结果如下:

1 + 2 = 3

复制代码

从上面的求和函数可以初窥函数定义的一些端倪,接着具体说下规则:

函数定义格式:def 函数名(传入参数)

使用 `return` 返回值,不写的话默认返回 None 值。

Python函数的 返回值可以有多个 ,本质上利用的元组。

Python传递的 参数有多个 的话,可以用逗号隔开。

一个建议:函数定义时,可在函数的第一行语句中选择性地使用文档字符串编写函数说明,除了方便阅读,使用help(函数名)也可以拿到这个函数的说明信息。

2、形参与实参

定义函数时,函数名后传入的参数叫「形参」,调用函数时,函数名后传入的参数叫「实参」。这里还涉及到一个「传值与传址」的问题,传值就是传入一个参数的值,而传址则是传入一个参数的内存地址。两者的区别是:如果函数是传值类型的,在函数里修改了参数的值,外部的变量(实参)是不会改变的,比如下面这样一段代码:

def f(a):

a = 1

b = 0

f(b)

print(b)

复制代码

运行结果如下:

0

复制代码

尽管我们修改了传入参数的值,但是实参却依旧是0,没有改变,这就是传参,如果传递的是内存地址,修改的了话实参也会受影响。但是Python和其他编程语言有点不同(比如C语言里可以用&参数名传地址)。

Python不允许开发者选择采用传值还是传址,而是采用「传对象引用」的方式,如果传入的参数是一个不可变对象(数字,字符串和元组)的引用,就不能修改原始对象的值;如果传入的参数是一个可变对象(列表,字典)的引用,就能直接修改原始对象的值。

比如下面这样一串代码:

def f(a):

b[0] = 1

b = [0]

f(b)

print(b)

复制代码

运行结果如下:

[1]

复制代码

3、关键字参数与默认参数

「关键字参数」:当函数需要传入的参数有多个的时候,怕参数混淆传错,可以在传入的时候指定形参的参数名,比如:plus(a = 1, b = 2)。

「默认参数」:在 定义形参的时候赋予初始值,调用的时候就可以不带参数去调用函数,比如:

def plus(a=1, b = 2),调用的时候直接plus()或者只传入一个参数plus(3)都是可以的,还可以配合关键字参数指定传入的是哪个参数。另外,默认参数也称作「缺省参数」。

4、可变参数

有时传入函数中的 参数数目 可能是 不固定 的,比如,要你计算一堆数字的和,而具体有多少

个数字不知道,这个时候就可以使用可变参数了。只需要在函数定义时在参数前加上* 星号,

就代表这个参数是可变参数(其实是只是把数据打包成了一个元组)。

另外,如果除了可变参数外还有其他的参数,那么写在可变参数后的参数要用关键字参数指定,

否则会加入可变参数的范畴。还有一点要注意,如果传入的参数是列表或者元组,会被再次

打包成元组,如果想解包的话,需要在实参前加*,代码示例如下:

def plus(*a):

result = 0

for b in a:

print(b, end='\t')

if __name__ == '__main__':

a = [1, 2, 3, 4, 5]

plus(a)

print()

plus(*a)

复制代码

运行结果如下:

[1, 2, 3, 4, 5]

1   2   3   4   5

复制代码

另外,如果想把参数打包成字典的方式,可在函数形参前使用两个**标识。

5、全局变量与局部变量

全局变量:定义在最外部,可在函数内部进行访问,但不能直接修改。

局部变量:定义在函数内部,在函数外部无法访问的参数和变量。

局部变量无法在外部访问的原因:

Python在运行函数时,会利用栈(Stack)来存储数据,执行完函数后,所有数据会被自动删除。

函数中无法修改全局变量的原因:

试图在函数里修改全局变量的值时,Python会自动在函数内部新建一个名字一样的局部变量代替。如果硬是要修改,可以在函数内部使用global关键字修饰全局变量,但是不建议这样做,会使得程序维护成本的提高。

6、内部函数

所谓的内部函数其实就是「函数嵌套」,在一个函数中嵌套另一个函数,要注意:

内部函数的作用域,只在内部函数的「直接外部函数内」,外部是无法调用的没,外部调用内部函数会直接报:函数找不到的错误!

内部函数无法直接修改外部函数中的变量,否则会报UnboundLocalError错误!如果想在内部函数中直接修改,可以把直接外部函数中的变量通过容器类型来存放,或者使用Python提供的 nonlocal关键字 修饰。代码示例如下:

def fun_x():

x = [10]

y = 10

def fun_y():

x[0] += x[0]

nonlocal y

y *= y

return x[0] * y

return fun_y()

if __name__ == '__main__':

print(fun_x())

复制代码

运行结果如下:

2000

复制代码

7、闭包

在函数内嵌套了另一个函数,如果「内部函数引用了外部函数的变量」,则可能产生闭包。

Python中形成闭包的三个条件:

函数嵌套

内部函数引用外部变量

外部函数返回内部函数

一个函数闭包的代码示例如下:

def outer(a):

b = 1

def inner():

print(a + b)

return inner

if __name__ == '__main__':

test_1 = outer(2)

test_1()

复制代码

运行结果如下:

2

复制代码

在上面的代码中,直接把内部函数当做返回值返回了,b是一个局部变量,按理来说,生命周期在调用完outer()函数后就完结了。但是载上面的代码中,调用test_1时,b变量的值却正常输出了,函数闭包使得函数的「局部变量信息」得以保存。

Python中通过__closure__属性保存闭包中的局部变量,把上面test_1函数里的东东

打印出来,代码如下:

print(test_1.__closure__)

print(test_1.__closure__[0].cell_contents)

print(test_1.__closure__[1].cell_contents)

复制代码

运行结果如下:

(, )

2

1

复制代码

8、lambda表达式

在Python中可以使用lambda关键字来创建匿名函数,直接返回一个函数对象,而不用去纠结给函数起什么名字,省去了定义函数的步骤,从而简化代码,一个对比大小简单的lambda表达式代码示例如下:

big = lambda x, y: x > y

print("第一个参数比第二个参数大:%s" % big(1, 2))

复制代码

运行结果如下:

第一个参数比第二个参数大:False

复制代码

9、递归

所谓的递归就是「函数调用自身」,最简单的递归求和代码示例如下:

def sum(n):

if n == 1:

return 1

else:

return n + sum(n - 1)

print("1到100的求和结果是: %d" % sum(100))

复制代码

运行结果如下:

1到100的求和结果是: 5050

复制代码

另外要注意两点:

递归要有结束条件,以避免递归的无休止调用!

递归可以简化程序,但不一定能提高程序的执行效率!

如果本文对你有所帮助,欢迎

留言,点赞,转发

素质三连,谢谢

python入门之函数调用第二关_猪行天下之Python基础——5.1 函数(上)相关推荐

  1. python入门之函数调用第一关_零基础学习 Python 之与函数的初次相见

    写在之前 大家好,这是首发在我公众号「Python空间」的第 26 篇文章,欢迎关注. 大家好,这里是零基础学习 Python 系列,在这里我将从最基本的Python 写起,然后再慢慢涉及到高阶以及具 ...

  2. python用来初始化对象属性的是_猪行天下之Python基础——8.1 类与对象

    内容简述: 1.面相对象的理解 2.类与对象 3.继承 4.组合 5.对象相关的内置函数 1.面相对象的理解 考虑到部分读者可能没有接触过面向对象编程,所以先介绍下面向对象的一些特征,形成一个面向对象 ...

  3. python入门之函数调用第二关_Python入门之函数调用——第2关:函数正确调用 - 得到想要的结果...

    任务描述 函数被定义后,本身肯定不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果. 本关的目标是让读者了解并掌握函数调用的相关知识. 相关知识 定义函数与调用函数的顺序 在定义了函数之后 ...

  4. 猪行天下之Python基础——10.1 Python常用模块(上)

    内容简述: 1.time和datetime模块 2.logging模块 PS:如果你想搜索安装某个模块或者发布一个自己的模块可以到移步到:pypi.org/ 1.time和datetime时间模块 ① ...

  5. 猪行天下之Python基础——1.1 Python开发环境搭建

    内容简述: 1.选择Python 2 还是 Python 3? 2.Python环境的下载与安装 1.选择Python 2还是Python 3 Python 3 在设计时并「没有考虑向下兼容」,即Py ...

  6. 猪行天下之Python基础——7.1 文件存储

    内容简述: 1.open()函数与文件打开模式 2.file对象提供的函数 3.常见的文件操作示例 4.os模块里的常用函数 5.实用代码示例 1.open()函数与文件打开模式 Python中读写文 ...

  7. Python入门练习题026:字符串写入的行数

    """ 记录下自己自学python和练习写的代码,等以后进阶后,再回来看一下曾经自己写的代码有多蠢Python入门练习题026:字符串写入的行数 把字符串S字符写入行中, ...

  8. (Python入门)学习笔记一,初次接触尝试使用Python——环境搭建与配置

    (Python入门)学习笔记一,初次接触尝试使用Python 早就耳闻Python大名,搞大数据.做人工智能.整机器学习,就得了解Python.之前一直没有去了解,现在由于之前一个项目涉及到一点Pyt ...

  9. python从入门到精通 邮电出版社_《人民邮电出版社Python深度学习入门:基于PYTHON的理论与实现》【价格 目录 书评 正版】_中国图书网...

    译者序 xiii 前言 xv 第 1 章 Python入门 1 1.1 Python是什么 1 1.2 Python的安装 2 1.2.1 Python版本 2 1.2.2 使用的外部库 2 1.2. ...

最新文章

  1. 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )
  2. 信息管理系统(Servlet+jsp+mvc+jdbc)
  3. mysql国际化_Java的Struts框架中的主题模板和国际化设置
  4. On Comparing Side-Channel Preprocessing Techniques for Attacking RFID Devices
  5. python 学习2 /输入/ 输出 /列表 /字典
  6. 计算机系统的无形组成部分,软件是什么东西?!
  7. ThinkPHP3.2.3执行页面循环案例代码(部分)
  8. 深入聊聊MVVM框架(闲谈)
  9. android弹窗设计,想印:UI设计中弹窗设计的五条基本原则
  10. Java新职篇:使用程序块
  11. freemarker中空值“”,null值的判断
  12. 使用计算机终端情况,朗威V1.0计算机终端保密检查系统
  13. C51单片机的初次使用
  14. 微信小程序码接口返回的二进制内容处理返回给前端展示
  15. PhotoShop如何使用图层之实例演示?
  16. Corg.quartz.JobPersistenceException: Couldn‘t retrieve trigger
  17. CSDN写漂亮博客的技巧--改字体大小颜色、插入多列表格、字体高亮等
  18. 40个常见的HTML5 面试问题及答案
  19. 4412开发板Qt定时器-实验步骤和部分代码
  20. 晚上11:45点 ,你进入睡眠状态了吗?

热门文章

  1. Flink从入门到精通100篇(十五)-Flink SQL FileSystem Connector 分区提交与自定义小文件合并策略 ​
  2. rnn词性标注算法_Python预测算法哪家强?权游龙妈是生还是凉凉?
  3. Python入门100题 | 第045题
  4. 百度指数cookie不可用解决方案
  5. 聚类算法中各种距离的计算与python的具体实现代码
  6. 淘宝大数据之路【转】
  7. 预发环境与生产环境共享数据库时定时任务重复执行问题解决
  8. 分布式电子邮件系统设计--转载
  9. jquery学习手记(1)
  10. 【Python】GroupBy:数据聚合与分组运算