函数
所谓函数,就是把一个具有独立功能的代码块组织成一个整体,在需要的时候调用。
函数的使用一般包含两个步骤:
- 定义函数:在函数中编写代码、实现功能
- 调用函数:执行编写的代码
好的函数,可以提高代码编写的效率,以及代码的复用性。
函数的定义
1 |
def 函数名(): |
函数的定义规范:
def
是define
的缩写- 函数的名称应该能简单明确的表明函数的功能,比如
min()
很清晰的表达了该函数就是用来求最小值的 - 函数名称的命名应该符合标识符的命名规则:
- 只能由
字母
、数字
和下划线
组成 - 不能以数字开头
- 不能跟关键字重名
- 只能由
函数的执行过程
- 代码执行到函数定义时,不会走到函数的内部,只是将该函数名作为一个标识符,添加到内存中
- 当调用函数时,才会从内存中去查询该函数,并执行函数内部的相关代码
函数的参数
函数的参数,可以在调用函数时传递给函数内部进行使用,参数的作用就是为了增加函数的通用型,增强函数的功能。
参数的定义以及调用格式
1 |
# 函数的定义 |
函数参数可以用多个
在函数定义的时候,可以有多个参数传递,同时也接收多个参数
形参和实参
形参的全称为“形式参数”,由于它不是实际存在的变量,所以又称为虚拟变量。形参就是在函数被调用的时候用来接收实参的数据的变量
实参全称为“实际参数”,是在调用时传递给函数的参数。
- 在调用函数时,实参将赋值给形参。因而,必须注意实参的个数、类型与形参一一对应,并且实参必须要有确定的值
- 实参可以是常量、变量、表达式、函数等,无论实参是何种类型,在函数进行调用的时候,它们都必须有一个具体确定的值。
形参的作用域
作用域,通常来说,一段程序代码中所用到的名字并不中是有效、可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域
- 形参的作用域只在定义函数的代码块中,一旦超出该范围就不能继续使用了
- 不同的函数中,可以使用相同的形参名,不会相互影响
- 作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突
- 函数间的形参是不能相互使用的
函数的返回值
在实际开发中,有时候我们希望一段函数在执行结束后,能告诉调用者一个结果,以便调用者根据这个结果进行下一步的处理。
在函数中我们使用 return
关键字来返回结果,调用函数的一方,可以使用变量来接收函数的返回结果
函数的四种类型
- 无参数,无返回值
- 无参数,有返回值
- 有参数,无返回值
- 有参数,有返回值
函数的嵌套调用
在一个函数内,我们又调用了另一个函数,这就是函数的嵌套调用。
局部变量和全局变量
局部变量
- 局部变量就是定义在函数内部的变量
- 在不同的函数中,可以定义相同的名字的局部变量,但是各用个的不会产生影响
- 局部变量的作用域只在该函数内部
- 局部变量的目的是为了存储需要临时保存的数据
全局变量
- 全局变量是定义在所以函数外的变量
- 全局变量在整个 py 文件中都可以访问的
- 函数内修改全局变量之前需要用
global
进行声明,否则会出错
模块
- 模块是 Python 程序框架中一个核心概念
- 模块就好比是工具包,要想使用该工具包中的工具,就需要用
import
来导入整个模块 - 每一个以.py 结尾的 Python 源代码文件都是一个模块
- 在模块中定义的全局变量、函数都是模块能提供给外界直接使用的工具
模块的命名规则
- 只能由字母、数字和下划线组成
- 不能以数字开头
- 不能以关键字重名
函数式编程
函数可以作为函数的参数,也可以作为函数的返回值,这就是函数式编程。
常见的编程范式:
- OOP 面向对象编程
- FP 函数式编程
- POP 面向过程编程
Python支持函数式编程,支持高阶函数和 lambda 表达式
lambda 表达式
lambda也称为匿名函数,这种函数得名于省略了用 def 声明函数的标准步骤
用法:
lambda 参数: 表达式
高阶函数
高级函数的意思就是把函数当成参数传递的一种函数。
Python 系统内置的高阶函数有:
- sort()
- map()
- filter()
- reduce()
sort
定义:
sort(*, key=None, reverse=False)
该函数根据 key 中的函数来进行排序
eg:
q:元素按长度从小到大排序
a:
1 |
l = ["abd", "dsad", "ds", "fafas","dasdsad"] |
map
定义:
map(function, iterable, ...)
该函数将每个 iterable 进行 funtion 中的操作
q:将列表中的元素编程它的平方
a:
1 |
l = [1, 2, 3, 4, 5, 7, 8, 9] |
filter
定义:
filter(function, iterable)
该函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
q:找出列表中所有的 1
a:
1 |
l = [1, 2, 1, 4, 5, 1, 8, 9] |
reduce
定义:
reduce(function, iterable[, initializer])
该函数会对参数序列中元素进行累积
q:求列表所有元素的和
a:
1 |
from functools import * |
注意在 Python3 中移除了 reduce,需要在 functools 包中导入才能使用
切片
-
切片就是根据步长从原序列中取出一部分元素组成的新序列
-
切片只适用于字符串、列表、元组
-
切片的格式:
需要切片的元素[开始索引:结束索引:步长]
-
切片的注意事项:
- 指定的区间属于左闭右开区间,包括开始索引,不包括结束索引
- 步长默认为 1,可以省略
- 步长也可以是负数,代表了逆序切片
- 从头开始,开始索引可以省略,冒号不能省略
- 到末尾结束,结束索引可以省略,冒号不能省略
🌰:
1 |
# 将 123456789 切出 123 |
我们正常使用的即为正序索引,倒序索引指的是从右往左计算索引,最右边的索引值为-1,依次递减
推导式
列表的推导式
所谓列表的推导式,就是指轻量级循环创建列表
列表推导式的格式如下:
l = [计算公式 for 循环 if 判断]
🌰:
1 |
# 创建一个1 到 100 数据的数组 |
集合的推导式
所谓集合的推导式,就是指轻量级循环创建集合
列表推导式的格式如下:
l = {计算公式 for 循环 if 判断}
🌰:
1 |
# 创建一个1 到 100 数据的集合 |
字典的推导式
所谓字典的推导式,就是指轻量级循环创建字典
列表推导式的格式如下:
l = {key: value for 循环 if 判断}
🌰:
1 |
# 创建一个 {1:1, 2:2, ..., 100,100} 的字典 |
数据类型之间的转换
函数 | 描述 |
---|---|
int(x, [base]) | 将 x按照 base 进制转换为整型,默认 10 进制 |
float(x) | 将 x转换为一个浮点数 |
str(x) | 将 x 转换为一个字符串 |
tuple(s) | 将序列 s 转换为一个元组 |
list(s) | 将序列 s 转换为一个列表 |
set(s) | 将序列 s 转换为一个可变集合 |
dict(d) | 创建一个字典 |
frozenset(s) | 将序列 s 转换为一个不可变集合 |
chr(x) | 将一个整数转换为一个字符 |
ord(x) | 将一个字符转换为一个整数 |
hex(x) | 将一个整数转换为一个 16 进制字符串 |
oct(x) | 将一个整数转换为一个 8 进制字符串 |