【Python从入门到精通】(十一)Python的函数的方方面面【收藏下来保证有用!!!】
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
本文主要介绍Python的函数,函数的定义,使用,可变参数等等都有详细介绍。
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
前言
前面几个章节提及了好多Python函数,比如:print(),range(),len()函数等等。这些都是Python的内置函数,可以直接使用。当然,除了直接使用内置函数外,Python也支持自定义函数,即将一段有规律的,可重复使用的代码定义成函数。从而达到一次编写,多次调用的目的。
函数定义
函数是按照固定格式封装组织的可以重复使用的代码段。它能提高应用的模块性和代码的重复利用率。
函数定义的语法格式是:
def 函数名(参数列表):
代码块
[return [返回值]]
函数名:其实就是一个符合Python语法的标识符,函数名最好能体现该函数的功能,比如: save_user。
形参列表:设置该函数可以接收多少个参数,多个参数之间用逗号(,)分割。需要注意的是没有参数的话,也需要留一对空的()
[return[返回值]]:整体作为函数的可选参数,用于设置该函数的返回值。也就是说,一个函数,
可以有返回值,也可以没有返回值。
函数调用
调用函数的语法格式是:
[返回值]=函数名([形参值])
函数名即指的是要调用的函数的名称,形参值指的是当初创建函数时要求传入的各个形参的值。
如果该函数有返回值,我们可以通过一个变量来接收该值,当然也可以不接收。需要注意的是,函数有多少个形参,那么调用的时候就需要传入多少个值,
且顺序必须和创建函数时一致。即便该函数没有参数,函数名后的小括号也不能省略。
举个栗子吧:
def my_abs(x):
"""
返回绝对值
:param x:
:return:
"""
if not isinstance(x, (int, float)):
raise TypeError('传入的数据类型不对')
if x >= 0:
return x
else:
return -x
调用代码是:
x = my_abs(-3)
print(x)
print(my_abs.__doc__)
运行结果是:
3
返回绝对值
:param x:
:return:
这是一个获取绝对值的函数,其函数名是my_abs,通过函数名可以让人大致明白函数的作用。形式参数是x。通过__doc__可以查看函数的说明文档。其返回值是处理后的值。
今天依然是码农飞哥学习的一天。

函数值传递和引用传递(形参和实参的介绍)
介绍函数值传递和引用传递之前首先需要了解两个概念。
- 形式参数(简称形参):在定义函数时,函数名后面括号中的参数就是形式参数,可以将形参想象成剧本中的角色。
- 实际参数(简称实参):在调用函数时,函数名后面括号中的参数称为实际参数,也就是函数的调用者给函数的参数,可以将实参想象成演角色的演员。
函数参数传递方式分为两种:分别是值传递和引用传递: - 值传递:适用于实参类型为不可变类型(字符串,数字,元组)
- 引用(地址)传递:适用于实参类型为可变类型(列表,字典)
值传递和引用传递的区别是:函数参数进行值传递时,若形参发生改变,不会影响实参的值。而应用传递的话,改变形参的值,实参的值也会一同改变。依然是举例说明:
函数param_test会将形参obj变成 obj+obj。如果是值传递则调用函数param_test之后,实参的值不变。如果是引用传递的话则调用param_test之后,实参的值也会变成 obj+obj。
def param_test(obj):
obj += obj
print('形参值为:', obj)
print('*******值传递*****')
a = '码农飞哥'
print('a的值为:', a)
param_test(a)
print('实参的值为:', a)
print("*******引用传递*****")
b = [1, 2, 3]
print('b的值为:', b)
param_test(b)
print('实参的值为:', b)
运行结果是:
*******值传递*****
a的值为: 码农飞哥
形参值为: 码农飞哥码农飞哥
实参的值为: 码农飞哥
*******引用传递*****
b的值为: [1, 2, 3]
形参值为: [1, 2, 3, 1, 2, 3]
实参的值为: [1, 2, 3, 1, 2, 3]
Python位置参数
位置参数,有时也被称为必备参数,指的是必须按照正确的顺序将实参传到函数中,换句话说,调用函数时传入实参的数量和位置必须和定义函数时保持一致。如果不一致的话,则在程序运行时Python解释器会报TypeError异常。举个例子,下面演示调用函数事参数传入的数量不对的情况。
def girth(width , height):
return 2 * width+height
#调用函数时,必须传递 2 个参数,否则会引发错误
print(girth(3))
运行之后直接报Traceback错误。
Traceback (most recent call last):
File "/Volumes/Develop/Python_learn/PycharmProjects/python_demo_1/demo/function/locate_fun.py", line 6, in <module>
print(girth(3))
TypeError: girth() missing 1 required positional argument: 'height'
传入参数的位置不对的情况,本例中本想传入name的值为码农飞哥,age的值为18。结果入参顺序不对导致得到的结果不对。
def print_info(name, age):
print('姓名=' + name + " 年龄=" + str(age))
print_info(18,'码农飞哥')
那么怎么处理这种情况呢?有两种方式:
- 严格按照形参的数量和位置入参。
- 按照关键字参数入参,所谓的关键字参数就是指使用形参的名字来确定输入的参数值。通过此方式制定函数实参时,不再需要与形参的位置完全一致,只要将参数名写正确即可。还是以上面的函数为例:
利用关键字参数来调用函数的话则是这样写:
def print_info(name, age):
print('姓名=' + name + " 年龄=" + str(age))
print_info(age=18,name='码农飞哥')
运行结果是:
姓名=码农飞哥 年龄=18
可以看出关键字参数入参时,不需要保证入参的顺序跟形参的顺序保持一致。

默认参数设置
前面介绍的位置参数,就是说调用函数时必须要传入该参数。但是有些场景下我们并不想传入所有的参数。这种情况下就可以使用默认参数了。不过需要注意的是:指定有默认值的形式参数必须在所有没默认值的参数的最后,否则会产生语法错误。其语法格式是:
def 函数名(...,形参名,形参名=默认值):
代码块
下面给出一个示例,该函数是记录学生的信息,有两个有默认值的参数,分别是age和city。它们都被置于函数的形参列表最后处。
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print("gender:", gender)
print("age:", age)
print("city:", city)
print(enroll('张三', '一年级'))
print('************************** ')
print(enroll('李四', '二年级', 7))
运行结果是:
name: 张三
gender: 一年级
age: 6
city: Beijing
None
**************************
name: 李四
gender: 二年级
age: 7
city: Beijing
None
从上面代码可以看出:1. 可以不用传入有默认值的参数。2. 如果传入默认的参数,则会覆盖掉默认值。
可变参数
Python函数可变参数(*args,**kwargs),又称为不定长参数,即传入函数中的实际参数可以是任意多个,Python定义可以变参数,主要有以下两种形式:
- 在形参前添加一个
*,格式是*args。表示创建一个名为args的空元组,该元组可以接受任意多个外界传入的非关键字实参。必须以非关键字参数的形式给普通参数传值,否则Python解释器会把所有参数都优先传给可变参数。 **kwargs表示创建一个名为kwargs的空字典,该字典可以接受任意多个以关键字参数赋值的实参。举个,下面就是根据传入的值求和。
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
print(calc(10, 9))
运行的结果是:19。
再举个例子呗:
def record(str, **kwargs):
print('str=', str)
print('kwargs=', kwargs)
record('测试', name='码农飞哥', age=20)
record('测试2')
运行结果是:
str= 测试
kwargs= {'age': 20, 'name': '码农飞哥'}
str= 测试2
kwargs= {}
从上面代码可以看出,可变参数可以不用传入,不传的话则会创建一个空元组或者空字典。
逆向参数收集
Python不仅有可变参数,将多个参数打包到一个元组或者字典中,还支持逆向参数收集,即直接将列表,元组,字典作为函数参数。不过调用函数时要对实参加上*号。就像下面这样:
def param_test(name, age):
print('name=', name)
print('age=', age)
data = ['码农飞哥', 18]
param_test(*data)
运行结果是:
name= 码农飞哥
age= 18
return函数返回值
一个函数可以有返回值,也可以没有返回值,有返回值的语法结构是:
return [返回值]
返回值可以指定,也可以省略不写。如果不写的话就默认为是None,即空值。
Python函数返回多个值的方法
通常情况下,一个函数只有一个返回值,实际上Python也是如此,
只不过Python函数能以返回列表或元组的方式,将要返回的多个值保存到序列中,从而间接实现返回多个值的目的。
- 在函数中,提前将要返回的多个值存储到一个列表或元组中,然后函数返回该列表或元组
- 函数直接返回多个值,之间用逗号(,)分隔,Python会自动将多个值封装到一个元组中,其返回值仍是一个元组。下面就举例说明下:
def multi_return():
return_tuple = ('张三', 12)
return return_tuple
def multi_return2():
return '张三', 12
print(multi_return())
result = multi_return2()
print('multi_return2返回值是=,类型是=', result, type(result))
运行结果是
('张三', 12)
multi_return2返回值是=,类型是= ('张三', 12) <class 'tuple'>
总结
本文详细介绍了Python中的函数,从函数的定义说到函数的调用。重点介绍了形参和实参的相关知识点。总的来说Python的函数可以没有入参,可以没有返回值。可以传入可变参数。当传入的参数是不可变类型时则是值传递,当传入的参数是可变类型时则是引用传递。

我是码农飞哥,再次感谢您读完本文。
全网同名【码农飞哥】。不积跬步,无以至千里,享受分享的快乐
我是码农飞哥,再次感谢您读完本文。
【Python从入门到精通】(十一)Python的函数的方方面面【收藏下来保证有用!!!】的更多相关文章
- Python从入门到精通视频(全60集) ☝☝☝
Python从入门到精通视频(全60集) Python入门到精通 学习 教程 首先,课程的顺序需要调整:一和三主要是介绍学习和布置开发环境的,一介绍的是非VS开发,三介绍的是VS开发.VS2017现在 ...
- Python从入门到精通视频(全60集)✍✍✍
Python从入门到精通视频(全60集) 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看 ...
- Python 从入门到精通:一个月就够了
毫无疑问,Python 是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事.其实,只要掌握了科学的学习方法并制定了合理的学习计划, ...
- 【Python从入门到精通】(九)Python中字符串的各种骚操作你已经烂熟于心了么?
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文将重点介绍Python字符串的各种常用方法,字符串是实际开发中经常用到的,所有熟练的掌握它的各种用法显得尤为重要. 干货满满,建议收藏,欢迎大 ...
- 【Python从入门到精通】(二十五)Python多进程的使用
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本篇重点介绍Python多进程的使用,读者朋友们可以将多进程和多线程两者做一个对比学习. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题 ...
- ❤️【Python从入门到精通】(二十七)更进一步的了解Pillow吧!
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 进一步介绍Pillow库的使用,详细了解 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~. 前言 本文是 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- python从入门到大神---Python的jieba模块简介
python从入门到大神---Python的jieba模块简介 一.总结 一句话总结: jieba包是分词技术,也就是将一句话分成多个词,有多种分词模型可选 1.分词模块包一般有哪些分词模式(比如py ...
- Python从入门到精通
最近研究了一下Python,名不虚传,确实挺精彩. 学习一门新的语言,我认为从入门到精通的做法是:下SDK.装IDE.练教程.结合工作应用.不断踩坑进阶.梳理总结 1.下SDK(2.7.15) 下载地 ...
随机推荐
- 人脸照片自动生成游戏角色_ICCV2019论文解析
人脸照片自动生成游戏角色_ICCV2019论文解析 Face-to-Parameter Translation for Game Character Auto-Creation 论文链接: http: ...
- MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral)
MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral) Tracking by Instance Detection: A Meta-Learning Approach 论文链接:h ...
- TVM源码框架安装方法
TVM源码框架安装方法 本文提供如何在各种系统上从零构建和安装TVM包的说明.它包括两个步骤: 首先从C++代码中构建共享库(linux的libtvm.so,macOS的libtvm.dylib和wi ...
- 使用JavaScript获取url(request)中的参数
这次是使用JavaScript来获取url(request)中的参数 在日常页面编写的过程中为了方便操作在<script>中通过使用window.location.href="要 ...
- HAL库与Cubemx系列|Systick-系统滴答定时器详解
Systick是什么? 关于Systick,在Context-M3权威指南中如此描述: SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15).在以前,大多操作系统需要一 ...
- flume采集MongoDB数据到Kafka中
环境说明 centos7(运行于vbox虚拟机) flume1.9.0(自定义了flume连接mongodb的source插件) jdk1.8 kafka(2.11) zookeeper(3.57) ...
- 总结springboot开启mybatis驼峰命名自动映射的三种方式
方式一:通过springboot的配置文件application.yml mybatis: configuration: map-underscore-to-camel-case: true 此方式是 ...
- [USACO3.1]最短网络 Agri-Net
题目背景 Farmer John 被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 FJ 已经给他的农场安排了一条高速的网络线路,他想 ...
- VNC 相关
vncserver启动报错root A VNC server is already running as :1 [root@42 ~]# service vncserver startStarting ...
- 【NX二次开发】NX对象类型及基本操作
说明:NX中的所有对象都是通过唯一的tag_t值进行标识的,这些对象大致可以分为部件对象.UF对象.表达式.链表对象和属性对象等. 部件对象的操作: 基本操作函数: 1. UF_PART_new() ...