python入门之函数调用第二关_猪行天下之Python基础——5.1 函数(上)
内容简述:
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 函数(上)相关推荐
- python入门之函数调用第一关_零基础学习 Python 之与函数的初次相见
写在之前 大家好,这是首发在我公众号「Python空间」的第 26 篇文章,欢迎关注. 大家好,这里是零基础学习 Python 系列,在这里我将从最基本的Python 写起,然后再慢慢涉及到高阶以及具 ...
- python用来初始化对象属性的是_猪行天下之Python基础——8.1 类与对象
内容简述: 1.面相对象的理解 2.类与对象 3.继承 4.组合 5.对象相关的内置函数 1.面相对象的理解 考虑到部分读者可能没有接触过面向对象编程,所以先介绍下面向对象的一些特征,形成一个面向对象 ...
- python入门之函数调用第二关_Python入门之函数调用——第2关:函数正确调用 - 得到想要的结果...
任务描述 函数被定义后,本身肯定不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果. 本关的目标是让读者了解并掌握函数调用的相关知识. 相关知识 定义函数与调用函数的顺序 在定义了函数之后 ...
- 猪行天下之Python基础——10.1 Python常用模块(上)
内容简述: 1.time和datetime模块 2.logging模块 PS:如果你想搜索安装某个模块或者发布一个自己的模块可以到移步到:pypi.org/ 1.time和datetime时间模块 ① ...
- 猪行天下之Python基础——1.1 Python开发环境搭建
内容简述: 1.选择Python 2 还是 Python 3? 2.Python环境的下载与安装 1.选择Python 2还是Python 3 Python 3 在设计时并「没有考虑向下兼容」,即Py ...
- 猪行天下之Python基础——7.1 文件存储
内容简述: 1.open()函数与文件打开模式 2.file对象提供的函数 3.常见的文件操作示例 4.os模块里的常用函数 5.实用代码示例 1.open()函数与文件打开模式 Python中读写文 ...
- Python入门练习题026:字符串写入的行数
""" 记录下自己自学python和练习写的代码,等以后进阶后,再回来看一下曾经自己写的代码有多蠢Python入门练习题026:字符串写入的行数 把字符串S字符写入行中, ...
- (Python入门)学习笔记一,初次接触尝试使用Python——环境搭建与配置
(Python入门)学习笔记一,初次接触尝试使用Python 早就耳闻Python大名,搞大数据.做人工智能.整机器学习,就得了解Python.之前一直没有去了解,现在由于之前一个项目涉及到一点Pyt ...
- 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. ...
最新文章
- 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )
- 信息管理系统(Servlet+jsp+mvc+jdbc)
- mysql国际化_Java的Struts框架中的主题模板和国际化设置
- On Comparing Side-Channel Preprocessing Techniques for Attacking RFID Devices
- python 学习2 /输入/ 输出 /列表 /字典
- 计算机系统的无形组成部分,软件是什么东西?!
- ThinkPHP3.2.3执行页面循环案例代码(部分)
- 深入聊聊MVVM框架(闲谈)
- android弹窗设计,想印:UI设计中弹窗设计的五条基本原则
- Java新职篇:使用程序块
- freemarker中空值“”,null值的判断
- 使用计算机终端情况,朗威V1.0计算机终端保密检查系统
- C51单片机的初次使用
- 微信小程序码接口返回的二进制内容处理返回给前端展示
- PhotoShop如何使用图层之实例演示?
- Corg.quartz.JobPersistenceException: Couldn‘t retrieve trigger
- CSDN写漂亮博客的技巧--改字体大小颜色、插入多列表格、字体高亮等
- 40个常见的HTML5 面试问题及答案
- 4412开发板Qt定时器-实验步骤和部分代码
- 晚上11:45点 ,你进入睡眠状态了吗?