函数

所谓函数,就是把一个具有独立功能的代码块组织成一个整体,在需要的时候调用。

函数的使用一般包含两个步骤:

  1. 定义函数:在函数中编写代码、实现功能
  2. 调用函数:执行编写的代码

好的函数,可以提高代码编写的效率,以及代码的复用性。

函数的定义

1
2
def 函数名():
执行的代码

函数的定义规范:

  1. defdefine的缩写
  2. 函数的名称应该能简单明确的表明函数的功能,比如 min()很清晰的表达了该函数就是用来求最小值的
  3. 函数名称的命名应该符合标识符的命名规则:
    • 只能由字母数字下划线组成
    • 不能以数字开头
    • 不能跟关键字重名

函数的执行过程

  1. 代码执行到函数定义时,不会走到函数的内部,只是将该函数名作为一个标识符,添加到内存中
  2. 当调用函数时,才会从内存中去查询该函数,并执行函数内部的相关代码

函数的参数

函数的参数,可以在调用函数时传递给函数内部进行使用,参数的作用就是为了增加函数的通用型,增强函数的功能。

参数的定义以及调用格式

1
2
3
4
5
6
# 函数的定义
def 函数名(参数):
执行的代码

# 函数的调用
函数名(参数)

函数参数可以用多个

在函数定义的时候,可以有多个参数传递,同时也接收多个参数

形参和实参

形参的全称为“形式参数”,由于它不是实际存在的变量,所以又称为虚拟变量。形参就是在函数被调用的时候用来接收实参的数据的变量

实参全称为“实际参数”,是在调用时传递给函数的参数。

  1. 在调用函数时,实参将赋值给形参。因而,必须注意实参的个数、类型与形参一一对应,并且实参必须要有确定的值
  2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型,在函数进行调用的时候,它们都必须有一个具体确定的值。
形参的作用域

​ 作用域,通常来说,一段程序代码中所用到的名字并不中是有效、可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域

  • 形参的作用域只在定义函数的代码块中,一旦超出该范围就不能继续使用了
  • 不同的函数中,可以使用相同的形参名,不会相互影响
  • 作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突
  • 函数间的形参是不能相互使用的

函数的返回值

在实际开发中,有时候我们希望一段函数在执行结束后,能告诉调用者一个结果,以便调用者根据这个结果进行下一步的处理。

在函数中我们使用 return 关键字来返回结果,调用函数的一方,可以使用变量来接收函数的返回结果

函数的四种类型

  1. 无参数,无返回值
  2. 无参数,有返回值
  3. 有参数,无返回值
  4. 有参数,有返回值

函数的嵌套调用

在一个函数内,我们又调用了另一个函数,这就是函数的嵌套调用。

局部变量和全局变量

局部变量
  • 局部变量就是定义在函数内部的变量
  • 在不同的函数中,可以定义相同的名字的局部变量,但是各用个的不会产生影响
  • 局部变量的作用域只在该函数内部
  • 局部变量的目的是为了存储需要临时保存的数据
全局变量
  • 全局变量是定义在所以函数外的变量
  • 全局变量在整个 py 文件中都可以访问的
  • 函数内修改全局变量之前需要用 global进行声明,否则会出错

模块

  • 模块是 Python 程序框架中一个核心概念
  • 模块就好比是工具包,要想使用该工具包中的工具,就需要用 import来导入整个模块
  • 每一个以.py 结尾的 Python 源代码文件都是一个模块
  • 在模块中定义的全局变量、函数都是模块能提供给外界直接使用的工具

模块的命名规则

  1. 只能由字母、数字和下划线组成
  2. 不能以数字开头
  3. 不能以关键字重名

函数式编程

函数可以作为函数的参数,也可以作为函数的返回值,这就是函数式编程。

常见的编程范式:

  1. OOP 面向对象编程
  2. FP 函数式编程
  3. POP 面向过程编程

Python支持函数式编程,支持高阶函数和 lambda 表达式

lambda 表达式

lambda也称为匿名函数,这种函数得名于省略了用 def 声明函数的标准步骤

用法:

lambda 参数: 表达式

高阶函数

高级函数的意思就是把函数当成参数传递的一种函数。

Python 系统内置的高阶函数有:

  1. sort()
  2. map()
  3. filter()
  4. reduce()

sort

定义:

sort(*, key=None, reverse=False)

该函数根据 key 中的函数来进行排序

eg:

q:元素按长度从小到大排序

a:

1
2
3
4
5
6
l = ["abd", "dsad", "ds", "fafas","dasdsad"]
l.sort(key=lambda item: len(item))
print(l)

# 控制台打印如下
['ds', 'abd', 'dsad', 'fafas', 'dasdsad']

map

定义:

map(function, iterable, ...)

该函数将每个 iterable 进行 funtion 中的操作

q:将列表中的元素编程它的平方

a:

1
2
3
4
5
6
l = [1, 2, 3, 4, 5, 7, 8, 9]
l = map(lambda item: item ** 2, l)
print(list(l))

# 控制台打印如下
[1, 4, 9, 16, 25, 49, 64, 81]

filter

定义:

filter(function, iterable)

该函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

q:找出列表中所有的 1

a:

1
2
3
4
5
6
l = [1, 2, 1, 4, 5, 1, 8, 9]
l = filter(lambda item: item == 1, l)
print(list(l))

# 控制台打印如下
[1, 1, 1]

reduce

定义:

reduce(function, iterable[, initializer])

该函数会对参数序列中元素进行累积

q:求列表所有元素的和

a:

1
2
3
4
5
6
7
from functools import *
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l = reduce(lambda x, y: x + y, l)
print(l)

# 控制台打印如下
45

注意在 Python3 中移除了 reduce,需要在 functools 包中导入才能使用

切片

  • 切片就是根据步长从原序列中取出一部分元素组成的新序列

  • 切片只适用于字符串、列表、元组

  • 切片的格式:需要切片的元素[开始索引:结束索引:步长]

  • 切片的注意事项:

    1. 指定的区间属于左闭右开区间,包括开始索引,不包括结束索引
    2. 步长默认为 1,可以省略
    3. 步长也可以是负数,代表了逆序切片
    4. 从头开始,开始索引可以省略,冒号不能省略
    5. 到末尾结束,结束索引可以省略,冒号不能省略

🌰:

1
2
3
4
5
6
7
# 将 123456789 切出 123
str1 = "123456789"
str1 = str1[0:3]
print(str1)

# 打印
123

我们正常使用的即为正序索引,倒序索引指的是从右往左计算索引,最右边的索引值为-1,依次递减

推导式

列表的推导式

所谓列表的推导式,就是指轻量级循环创建列表

列表推导式的格式如下:

l = [计算公式 for 循环 if 判断]

🌰:

1
2
# 创建一个1 到 100 数据的数组
l = [item for item in range(1, 101)]

集合的推导式

所谓集合的推导式,就是指轻量级循环创建集合

列表推导式的格式如下:

l = {计算公式 for 循环 if 判断}

🌰:

1
2
# 创建一个1 到 100 数据的集合
l = {item for item in range(1, 101)}

字典的推导式

所谓字典的推导式,就是指轻量级循环创建字典

列表推导式的格式如下:

l = {key: value for 循环 if 判断}

🌰:

1
2
# 创建一个 {1:1, 2:2, ..., 100,100} 的字典
l = {item:item for item in range(1, 101)}

数据类型之间的转换

函数 描述
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 进制字符串

评论