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))      
   |