python的第六节课笔记(基础提升)
函数:一个可以重复使用的,用于实现单一或者相关功能的代码块。
|
语法结构:
1 2 3 4
| def 函数名(): 函数体代码块(你想要完成的具体功能) 函数名() # 函数的调用
|
注意:
- def 用于定义函数的关键字
- 函数只有在调用了之后才会执行
- 函数名和变量名一样都是标识符,命名规则一致
- 函数名和变量名一样,可以进行互相传递
- 变量名重复会覆盖掉原来的值
1 2 3 4 5
|
a = 10 wy = a print(wy)
|
1 2 3 4 5 6 7 8 9 10
| def qc(): print("今天在上课")
print(qc) xq = qc print(xq)
qc() xq()
|
这是一个判断是不是手机号的代码:
1 2 3 4 5 6 7 8 9 10 11
| while True: number = input("请输入一个电话号码:") if number[0] != "1": print("不是1开头") elif len(number) != 11: print("长度不是11位") elif not number.isdigit(): print("不是纯数字") else: print("是一个手机号!!") break
|
现在把它定义为一个判断电话号码的函数;
1 2 3 4 5 6 7 8 9 10 11 12 13
| def is_tel(): number = input("请输入一个电话号码:") if number[0] != "1": print("不是1开头") elif len(number) != 11: print("长度不是11位") elif not number.isdigit(): print("不是纯数字") else: print("是一个手机号!!")
is_tel()
|
返回值:
语法 |
关键字 |
解释 |
return 想要返回的值 |
return |
回函数体里面的值 |
注意:
- 返回的位置: 函数的调用处
- 返回值可以使用变量接收。 变量 = 函数名()
1 2 3 4 5 6 7 8 9 10 11
| def my_sum(): """ 求和函数 """ he = 4 + 28 return he
res = my_sum() print(res) print(my_sum())
|
上面存在的BUG: 只能求固定值的和
目的:让函数变得更加灵活,可以求任意两个数的和
方法:给函数增加参数
必备参数:
形参:变量的名字写在函数定义处
实参:变量的值写在函数的调用处
1 2 3 4 5 6 7
| def my_sum(a, b): he = a + b return he
res = my_sum(4, 28) print(res)
|
1 2 3 4 5 6 7 8 9
| def my_sum(a, b): he = a + b return he
c = float(input("请输入一个数:")) d = float(input("请输入一个数:")) res = my_sum(c, d) print(res)
|
注意:
- 形参与实参是一一对应原则
- 用实参给形参传递具体的值的过程称为–>传参
默认值参数:
BUG: 在必备参数中,形参和实参个数不一致,会报错
需求:定义一个函数,将两数之和默认增加100(可以指定增加的值)之后返回 |
1 2 3 4
| print(1, 2, 3) print(1, 2, 3, end="_") print(1, 2, 3, sep="$")
|
1 2 3 4 5 6
| def my_sum(a, b, c =100): he = a + b + c return he
print(my_sum(10,20)) print(my_sum(10,20,30))
|
不定长参数:
不定长参数: 可以传入也可以不传入,不传入时默认为空元组和空字典
没有指定名称的参数 |
*args |
以元组的形式进行接收 |
指定了名称的参数 |
**kwargs |
以字典的形式接收多余的参数 |
指定名称:在函数的调用处以【变量名 = 值 】形式进行传参就叫做指定参数的名称。 |
1 2 3 4 5 6 7 8
| def my_sum(a, b, *args, **kwargs): print("a的值", a) print("b的值", b) print("args的值", args) print("kwargs的值", kwargs)
res = my_sum(1, 2, 3, 4, 5, jy="小鲸鱼", gq="搞钱小秘书") print(res)
|
运行结果为:
1 2 3 4 5 6 7 8 9 10 11 12
| def my_sum(*args): print(args) he = 0 for i in args: he += i return he
r = my_sum(1,2,3,4,5,6) print(r)
|
参数的顺序:
定义函数参数的时候,参数优先级: 必备参数 > 默认值参数 > 不定长参数
注意:
- 指定名称的放在没有指定名称的后面
- 不要和默认值参数名字一致
return 函数补充:
return 具有结束函数的功能,return后面的代码不再执行。 |
1 2 3 4 5
| def fun1(): return 1 return 2
print(fun1())
|
作用域:
1 2 3 4 5 6
| def fun2(): a = 10
fun2() a += 10 print(a)
|
1 2 3 4
| if True: a = 10
print(a)
|
函数作用域:
local |
局部作用域,即函数中定义的变量 作用范围小 优先级越高 |
enclosing |
嵌套的父级函数的局部作用域 相对外面来说是局部 相对嵌套的子函数来说,是一个全局 |
global |
全局作用域 自己定义的,写在最外面的变量 作用范围大 优先级越小 |
build-in |
内建作用域,不需要定义,可以直接拿来用的; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| QuanJu = 100
def func3(): JuBu = 200 QuanJu = 1000 print("局部",JuBu) print("全局", QuanJu) print("局部2号", QuanJu)
def func4(): juBu_jubu = 10 print(QuanJu) print(JuBu)
func4()
func3() print(QuanJu)
|
运行结果为:
在函数里面更改外面的值:
声明全局变量 |
global |
声明局部变量 |
nonlocal |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| QuanJu = 100
def func3(): global QuanJu JuBu = 200 QuanJu += 100 print(QuanJu) def fun4(): nonlocal JuBu JuBu += 300 print(JuBu)
fun4()
func3() print(QuanJu)
|
运行结果为:
闭包:
闭包最直接的作用就是可以访问外层的变量,因此可以起到函数内外沟通的桥梁。
注意:
- 存在于嵌套关系的函数中
- 嵌套的内部函数引用了外部函数的变量
- 嵌套的外部函数会将内部函数名作为返回值放回
- 把调用变成了返回函数名
1 2 3 4 5 6 7 8 9 10 11 12 13
| def func5(): Jubu = 200 def func6(): nonlocal Jubu Jubu += 100 print(Jubu) return func6
func5() a = func5() a()
|
递归函数:
1 2 3 4 5 6
| i = 5 j = 1 while i >= 1: j *= i i -= 1 print(j)
|
1 2 3 4 5 6 7 8
| def f7(n): print(n) if n == 0: return 1 else: return n * f7(n-1)
f7(5)
|
运行结果为:
匿名函数:
注意:
- lambda是定义匿名函数的关键字
- 参数:个数不一致
- 表达式:你希望这个函数要达到的目的
- 特点:不需要返回值,直接在调用的时候返回表达式的结果
需求:定义一个函数,传入两个参数a b,完成次方的计算,a ** b |
普通函数的定义及调用:
1 2 3 4 5 6 7 8 9 10
| def cif(a, b): """ 这是一个求次方的函数 :return: """ mi = a ** b return mi
mi = cif(5, 4) print(mi)
|
匿名函数的定义及调用:
1 2
| cif2 =lambda x, y: x ** y print(cif2(2, 4))
|