day10回顾
函数:
  def 语句
    作用:
      用来定义(创建一个函数)
    格式:
      def 函数名(形参列表):
          语句块


函数调用
  函数名(实参列表)


return 语句


参数传递:
  位置传参
    序列传参
  关键字传参
    字典关键字传参


缺省参数
 
函数形参的定义方法:
  位置形参
    星号元组形参
  命名关键字形参
    双星号字典形参


  def fx(*args, **kwargs):
      pass


day11 笔记:
函数变量
  函数名是变量,它在创建时绑定一个函数


示例:

def f1(lst=[]): 
 
      print("f1函数被调用") 
 
  f1() 
 
  f1 = None 
 
  f1() # 出错,f1 绑定的是None


示例:

def f1(): 
 
        print("hello") 
 

      def f2(): 
 
        print("world") 
 

      f1, f2 = f2, f1 
 
    f1()  # world


一个函数可以作为另一个函数的参数(实参)传递
示例:

def f1(): 
 
      print("f1函数被调用") 
 

    def f2(): 
 
      print("f2函数被调用") 
 
  
 
  def fx(fn): 
 
      print("fn绑定的函数是:", fn) 
 
      # 在fx内调用fn绑定的函数 
 
      fn() 
 
  fx(f1)  # 调用fx,把f1作为实参传数 
 
  fx(f2)


看懂下列代码在做什么?为什么?

def goodbye(L): 
 
    for x in L: 
 
        print("再见:", x) 
 

  def hello(L): 
 
    for x in L: 
 
        print("欢迎:", x) 
 

  def fx(fn, L): 
 
    print("fx被调用") 
 
    fn(L) 
 

  fx(hello, ['Tom', 'Jerry', 'Spike']) 
 
fx(goodbye, ['小张', '小李'])



函数可以做为另一个函数的返回值:
  函数可以返回另一个函数


示例:

def get_op(): 
 
        s = input("请输入您的操作: ") 
 
        if s == "求最大": 
 
            return max 
 
        elif s == '求最小': 
 
            return min 
 
        elif s == '求和': 
 
            return sum 
 

      L = [2,4,6,8,10] 
 
    print(L) 
 
    f = get_op() 
 
    print(f(L))


函数嵌套定义:
  def 语句的作用是用来创建一个函数
  def 语句可以写在函数内部,在函数执行时可以动态创建一个函数


示例:
 

def get_func(value): 
 
        if value == 1: 
 
            def myadd(x, y): 
 
               return x + y 
 
            return myadd 
 
        elif value == 2: 
 
            def mysub(x, y): 
 
               return x - y 
 
            return mysub 
 
    fx = get_func(1) 
 
    print(fx(400, 300))  # 700 
 
    fx = get_func(2) 
 
    print(fx(400, 300))  # 100


  


全局变量和局部变量
  局部变量:
    1. 定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
    2. 局部变量只能在函数内部使用
    3. 局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
  全局变量:
    定义在函数外部,模块内部的变量称为全局变量
    全局变量,所有函数都可以直接访问(但函数内部不能直接修改全局变量的绑定关系)


  示例:

a = 100 
 
    b = 200 
 
    def fn(c): 
 
        d = 300 
 
        print(a, b, c d) 
 

      fn(300) 
 
    print('a =', a) 
 
    print('b =', b)


局部变量说明:
  1. 在函数内首次对变量赋值是创建局部变量,再次为变量赋值是修改局部变量的绑定关系
  2. 在函数内部的赋值语句不会对全局变量造成影响


python作用域:
  作用域也叫命名空间,是访问变量时查找变量名的范围空间


python的四个作用域LEGB
     作用域            英文解释            英文简写
局部作用域(函数内)     Local(function)         L
外部嵌套函数作用域  Enclosing function locals  E
函数定义所在模块的作用域  Global(module)        G
python 内置模块的作用域  Builtin(python)       B


示例见:
  namespace.py


变量名的查找规则(顺序):
   1. 查找本地变量
   2. 查找包裹此函数的外部嵌套函数内部的变量
   3. 全局变量
   4. 内置变量


globals() / locals() 函数
  globals() 返回全局作用内变量的字典
  locals() 返回局部作用域内变量的字典


示例见: globals_locals_function.py


练习:
  1. 写一个函数 mysum 此函数的功能是返回:
     1 + 2 + 3 + 4 + 5 + ..... + n 的和
  def mysum(n):
      ....


  print(mysum(100))  # 5050


  2. 写一个函数 mysum2 此函数可以传入一个参数,两个参数和三个参数:
  1) 当传入一个参数时,这个参数代表 终止数
  2) 当传入两个参数时,第一个参数代表起始值,第二个参数代表终止值
  3) 当传入三个参数时,第三个参数代表步长
  此函数的功能是返回从开始到终止值的和
  如:

print(mysum2(5))  # 10  (0+1+2+3+4) 
 
  print(mysum2(4, 6))  # 9 (4+5) 
 
  print(mysum2(5, 10, 2))  # 21 (5+7+9)



global 语句
  作用:
    1. 告诉解释执行器,global语句声明的一个或多个变量,这些变量的作用域为模块级的作用域的变量,也称作全局变量
    2. 全局声明(global) 将赋值变量映射到模块文件内部的作用域
  语法:
    global 变量1, 变量2, ...
  示例:
    global ga, gb
    global gc
  global声明示例见:
    global_statement.py
  说明:
    1. 全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)
    2. 全局变量在函数内部不经过声明就可以直接访问
    3. 不能先声明局部变量,再用global声明为全局变量,此做法不附合规则
    4. global变量列表里的变量名不能出现在此作用域内的形参列表里



nonlocal语句
  作用:
    告诉解释器, nonloca声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
  语法:
    nonlocal 变量名1, 变量名2, ....
  示例见:
    nonlocal_statement.py
  说明:
    1. nonlocal语句只能在被嵌套函数内部进行使用
    2. 访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作
    3. 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作
    4. nonlocal语句的变量列表的变量名不能出现在此函数的参数列表里


    说明3示例:

def f1(): 
 
        v =100 
 
        def f2(): 
 
            v = 200 
 
            def f3(): 
 
                nonlocal v 
 
                v += 1 # 此时只对f2的v进行操作 
 
            f3() 
 
        f2()


练习:
  1. 创建一个列表L = []
     写一个函数 input_number读取数据放入列表L中
    程序如下:

L = [] 
 
      def input_number(): 
 
          # 此处自己加入代码 
 
          while True: 
 
              i = int(input("请输入数字(-1结束):")) 
 
          # 此处自己完成 
 
      input_number() 
 
      print("您刚才输入的整数值是:", L)


  2. 写一个函数isprime(x) 判断x是否为素数,如果为素数返回True,否则返回False
     测试代码:
     if isprime(5):
         print("5素数")
  3. 写一个函数prime_m2n(m, n) 返回从m开始,到n结束范围内素数的列表,并打印
    L = prime_m2n(10, 20)
    print(L)  # [11, 13, 17, 19]


  4. 写一个函数primes(n), 返回小于n的所有的素数的列表.
    

L = primes(10) 
 
     print(L)  # [2, 3, 5, 7]