Python四级考试笔记【源源老师】
四级标准
一、 理解函数及过程、函数的参数、函数的返回值、变量作用域等概念。
二、 能够创建简单的自定义函数。
三、 理解算法以及算法性能、效率的概念,初步认识算法优化 效率的方法。
四、 理解基本算法中递归的概念。
五、 掌握自定义函数及调用,实现基本算法中的递归方法。
六、 掌握基本算法中由递归变递推的方法。
七、 理解基本算法中的分治算法,能够用分治算法实现简单的 Python程序。
八、 掌握第三方库(模块)的功能、获取、安装、调用等。
函数
1. 定义
- 函数:是组织好的,可重复使用的,用来实现特定功能的代码段。例如:
res = len('I like python')
print(res) #13
- 为什么我们随时可以使用len函数?因为len函数是python的内置函数,已经提前写好了,可以重复被使用,len函数的作用就是用来统计长度的。我们使用过的:input()、print()、str()、int()等都是Python的内置函数。
函数主要有两大作用:
- 将功能封装在函数内,可供随时随地重复利用
- 提高代码的复用性,减少重复代码,提升效率
2. 语法
def 函数名(参数):
函数体
return 返回值
注意: ① 参数如不需要,可以省略 ② 返回值如不需要,可以省略 ③ 函数必须先定义后使用
举例:
def fn():
print('我喜欢python')
#调用函数,也就是让fn函数执行
fn()
3. 参数
参数的作用是:在函数进行计算的时候,接受外部(调用时)提供的数据
有如下代码,完成了2个数字相加的功能:
def add():
sum = 1+2
print(sum)
#调用函数
add()
这个函数的功能非常局限,只能计算1 + 2。有没有可能实现:每一次使用函数,用户给出任意两个数字,都能进行相加呢?可以的,使用函数的传入参数功能,即可实现。
def add(x, y):
sum = x+y
print(sum)
add(1,2) #每次调用函数时,可以传入想要的参数
add(3,4) #每次调用函数时,可以传入想要的参数
- 形参:函数定义中,提供的x和y,称之为 形式参数(形参),表示函数声明将要使用2个参数,参数之间使用逗号进行分隔。
- 实参:函数调用中,提供的1和2,称之为 实际参数(实参),表示函数执行时真正使用的参数值。传入的时候,按照顺序传入数据,使用逗号分隔。
【注意】:在Python中,如果一个方法定义时声明了某个参数,那么在调用这个方法时就必须提供这个参数的值,否则程序会报错。
4. 返回值
- 返回值:就是程序中函数完成事情后,最后给调用者的结果
def add(x, y):
sum = x+y
return sum
res = add(1,2)
print(res) #3
以上add函数用来对两个数进行相加,最后,会将相加的结果sum返回给函数调用者res
所以,变量res接收到了函数的执行结果,也就是res = 3.
- 【扩展】:思考以下问题
5. 函数的嵌套
- 函数嵌套:指的是一个函数里面又调用了另外一个函数
def fn():
print('I like python')
def add(x, y):
sum = x+y
print(sum)
fn()
add(1,2)
6. 变量作用域
- 变量作用域指的是变量的作用范围(即变量在哪里可用,在哪里不可用)。变量作用域主要分为两类:局部变量和全局变量。
(1)局部变量
- 局部变量:定义在函数体内部的变量,即只在函数体内部生效
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/158613841fdc359b3d2c71381c7e0372.png)
变量num是定义在
testA
函数内部的变量,在函数内部访问不会报错,但在函数外部访问会报错。
(2)全局变量
- 全局变量:在函数体内、函数体外都能访问的变量
思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办?
答:将这个数据存储在一个全局变量里面
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0e9e0fc5cf1e8300788bac0eec05ed31.png)
(3)小试牛刀
举例:
num = 10
def A():
num = 20
print(num) #20
def B():
print(num) #10
A()
B()
解读代码:
- A函数中定义了一个局部变量num,输出print(num),结果是20,它访问的是离自己最近的已经被定义过的变量。
- B函数中并没有定义局部变量num,当它输出print(num),结果是10,它访问的是全局变量num,即10。
7. 递归函数
- 递归:即函数自己调用自己的特殊写法。
(1)计算n的阶乘
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
res = fact(5)
print(res) #120
我们可以拆解fact(5)计算的详细逻辑:
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
8. 递推算法
- 递推算法:通常是通过循环来实现,直接从边界出发,直到求出函数值。
(1)斐波那契数
- 斐波那契数 :该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。例如:0 1 1 2 3 5 8…
n = input('please input number: ')
n = int(n)
def fn(n):
if n==0:
return 0;
list = [0,1]
for i in range(2,n+1):
list.append(list[i-1]+list[i-2]);
return list[-1]
print(fn(n))
9. 分治算法
- 分治算法:将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将结果合并以解决原来的问题。常见的分治算法:快速排序、归并排序、二分搜索。
分治算法的基本步骤包括:
- 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
- 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题。
- 合并:将各个子问题的解合并为原问题的解。
10. 算法复杂度
-
时间复杂度:描述了一个算法执行所需的时间,随输入数据量的增长而增长的量级。通常用大O符号(O)来表示。时间复杂度越高,意味着算法运行所需的时间越长。因此,在选择算法时,我们希望选择时间复杂度较低的算法以提高效率。
-
空间复杂度:对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度越高,意味着算法运行所需的额外空间越大。因此,在选择算法时,我们也需要考虑其空间复杂度,以确保算法在运行时不会占用过多的空间资源。
11. python第三方库
Python使用import语句导入一个模块,导入官方模块,不需要考虑路径的问题,例如,导入系统自带的模块 math,直接导入即可。
import math
导入以后,你就可以认为math是一个指向已导入模块的变量,通过该变量,我们可以访问math模块中所定义的所有公开的函数、变量和类:
# 属性:圆周率
import math
print(math.pi) # 3.141592653589793
# 函数:次方
print(math.pow(2, 3)) # 8.0
如果希望导入模块的指定部分属性或函数,比如我们希望导入math模块的圆周率pi,那么可以使用from…import…语句。
# 属性:圆周率
from math import pi
print(pi) # 3.141592653589793
这个时候,由于pow()函数没有导入,所以是不能使用pow()函数的。如果希望导入模块里面的所有内容,那么使用from …import *语句。
from math import *
print(pi) # 3.141592653589793
print(pow(2, 3)) # 8.0