函数基础
函数简介
- 定义:就是具有特定功能的一段代码
- 优点:
- 解决代码的重复书写
- 可以将功能的实现着和使用者分开,提高开发效率
- 分类:
- 库函数:print、input、abs等
- 自定义:用户自己封装的函数
函数使用
-
定义函数格式
def 函数名([参数列表]): 函数体
[]表示可选,参数可以有,也可以没有,也可以是多个。
-
函数名:
- 与变量一样,只要遵循标识符的命名规范即可。
-
函数调用:
- 函数定以后不会执行,需要调用才会执行
- 调用格式:
函数名([参数])
函数分类(参数与返回值)
-
# 无参无返回值 def print_hello(): for i in range(10): print('Hello world!') # print_hello() # 带参数无返回值 def print_n_hello(n): for i in range(n): print('Hello world!') # print_n_hello(5) # 带参有返回值 def add(m, n): c = m + n # 使用return返回需要返回的值,不返回默认为None return c print(add(3, 5))
分类的标准是按照有无参数,以及有无返回值。
函数参数
-
形参:形式参数,就是写在函数定义出的参数
-
实参:实际参数,就是在函数调用时传递的参数
-
位置参数:也叫必传参数,没有默认值的参数
-
默认参数:定义时有默认值,调用时可以不传,必须写在最后
-
关键字参数:在函数调用时指定参数名字,参数的位置就无所谓。
-
可变长度参数:函数调用时可以传递比定义处更多的参数,多出来的参数会保存在args和kwargs中
def var_len_args(a, b, name='goudan', *args, **kwargs): print(a, b) print(name) # 是一个元组,保存多传的位置参数 print(args) # 是一个字典,保存多传的关键字参数 print(kwargs) var_len_args(1, 2, 3, 4, age=10)
-
*的使用:
def show(a, b): print(a, b) lt = [1, 2] # 需要从列表根据下表获取元素,然后作为参数传递 # show(lt[0], lt[1]) show(*lt) def show2(aa=11, bb=22): print(aa, bb) d = {'aa': 123, 'bb': 456} # show2(aa=d['aa'], bb=d['bb']) # 上下等价 show2(**d)
函数进阶
- 函数的定义位置是随意的?
- 不是,一定是先定义后调用,函数的调用一定要放在定义之后。
- 函数的名字可以相同吗?
- 不可以,若出现同名函数,后者会覆盖前者。
- 函数内容能否再定义函数?
- 可以,定义在函数内部的函数叫内部函数,它是很多高级功能实现的基础。
变量的作用域
-
块级作用域
if True: name = 'guanyu' # 能够在块的外部使用,说明没有块级作用域 print(name)
-
局部作用域
- 局部变量:定义在函数内部的变量叫局部变量,只能在函数内部使用。
def test(): a = 10 # 不能再函数外部使用,此处会报错 print(a)
-
全局作用域
- 全局变量:定义在函数外部的变量叫全局变量,哪里都可以使用
num = 10 def show(): # 声明使用的时外部的同名变量 global num # 只能使用,不能修改,若想修改协议进行全局声明 num = 20 print(num) show() print(num)
- 函数内部可以使用外部变量,但是不能修改
- 若修改需要使用
global
进行全局声明 - 当函数内部与外部出现同名变量,默认使用的时内部变量
-
nonlocal使用
- 说明:内部函数使用外部函数的局部变量,需要使用nonlocal进行声明
def wai(): n = 10 def nei(): # 声明使用非本地变量,外部函数的局部变量 nonlocal n n = 20 print(n) nei() print(n) wai()
递归函数(了解)
- 定义:函数内部调用函数本身的函数叫递归函数。
- 组成:
- 函数内部调用自己
- 终止条件(停止调用自己的条件)
- 核心算法(具体功能)
- 特点:
- 代码简洁
- 可读性差(不易理解)
- 瞬间占用内存较大,没有终止条件立即崩溃
- 有些领域是禁止使用的(安全领域:汽车电子)
- 只有在不得不使用的时候才使用(遍历目录)
- 练习:(可以做个小练习来巩固)
- 求n的阶乘
- 斐波那契数列的第n项
- 前两项都为1,从第三项开始,每一项都等于前两项的和
- 如:
1,1,2,3,5,8,13,21,...
常用函数
-
内置函数(无需导入)
print:打印,输出 input:输入 abs:求绝对值 type:获取变量的类型 chr:将ASCII数值转换为字符 ord:将字符转换为对应的ASCII id:获取变量地址 len:统计元素个数 range:产生连续整数的可迭代对象 enumerate:枚举可迭代对象 强制类型转换: int float str list tuple set dict max:求多个参数的最大值,或可迭代对象中的最大元素 min:最小值 sum:求和,可迭代对象元素求和 pow:求幂,pow(2, 3)等价于2 ** 3 round:四舍五入,可以指定保留位数 hex:16进制 oct:8进制 bin:2进制
-
模块函数(需要导入)
time: sleep:休眠指定的秒数,可以是小数 math: e:自然对数 pi:圆周率 ceil:向上取整 floor:向下取整 sqrt:开方(请平方根) degrees:弧度转换为度 radians:度转换为弧度 sys: argv:运行程序时所有的命令行参数列表,第一个是程序文件名 练习:完成一个计算器,支持加、减、乘、除运算