• Python第二周之函数及其作用域


    # 函数

    定义:

      我们可以把程序中相对独立的功能模块抽取出来,这样的好处是可以减少重复代码的编写,将来可以重复使用这些功能模块,Python中的函数就是代表了这样的功能模块。

    命名:

      age_of_student(官方) 或 ageOfStudent(大部分人的习惯用法,又称驼峰命名法)

    调用:

      import 模块 (as 别名)

      函数名(参数)

    注意:二元运算符之间放空格,参数里赋值时,等号两边不加空格。例如:def f(x=2) 

    #y = x !定义求阶乘这个函数,将求阶乘这个功能抽取出来,放到函数中。
    def f(x):
        """
        求函数x的阶乘
        :param x: 任意正整数
        :return: x的阶乘
        """
        y = 1
        for z in range(1, x + 1):
            y *= z
        return y
    if __name__ == '__main__':
    m = int(input('m = '))
    n = int(input('n = '))
    # 当需要计算阶乘的时候,不用再写循环,而是直接调用已经定义好的函数就可以了。
    print(f(m) // f(n) // f(m - n))
    #可变参数的函数
    
    
    def add(*args): #*args可变参数,个数不确定。
        total = 0
        for value in args:
            total += value
        return total
    # 递归函数
     1.收敛条件 - 让递归在有限的次数内完成或者进行回溯
     如果递归无法在有限的次数内收敛,就有可能导致RecursionError
     2.递归公式
    
    #1到100递归求和
    
    def sum_(num):
        if num == 1:
            return 1
        return sum_(num - 1) + num
    
    
    if __name__ == '__main__':
        print(sum_(100))
    
    # 十级楼梯,走完十级台阶有几种走法。每次走1到3步。
    def walk(n):
        if n < 0:
            return 0
        elif n == 0:
            return 1
        return walk(n-1) + walk(n-2) + walk(n-3)
    
    
    if __name__ == '__main__':
        print(walk(25))
    # 生成器函数
    def fib(n):
        a, b = 0, 1
        for _ in range(n):
            a, b = b, a + b
            yield a
    
    
    f = fib(20)
    print(f)
    for val in fib(20):
        print(val)

    #  函数的作用域

    1.在函数外面,叫做全局变量 global variable

    2.减少全局变量的使用,尽量使用局部变量。迪米特法则:不要和陌生人说话,尽量让模块之间不要发生联系。

    3.Python搜索一个变量的方式是从局部作用域到嵌套作用域再到全局作用域,最后到内置作用域。即 local > enclose>global>built-in(l e g b)

    4.如果想改变搜索范围,可以使用global 和nonlocal关键字。

    a = 100
    def
    foo(): # 函数内的局部变量,离开foo函数时无法访问的。 local variable global a # 提升权限,变为全局变量,可以直接修改,重新定义申明的变量。 a = 200 print(a) b = 'good' def bar(): nonlocal b # 非局部作用域。 b = 'hello' print(b) print(a) bar() print(b) foo() print(a)

     # 函数的存储类型

      1.分为3大类,栈--stack,堆--heap,(数据段,只读数据段,代码段)-静态区

      2.函数调用时,变量是放在内存小,执行快的栈上面的,对象是放在内存无穷大的堆上面的。

      3.变量--对象的引用--放的是对像的地址。  对象--放在堆上面。

      4.函数调用时,会经过保存现场和恢复现场两个操作。在进入函数调用前,要保存当前的执行现场,函数的执行现场是保存在栈上,执行--先进后出的存储结构。

     

    # tips

    ctrl + q    当前位置查看注释,

    ctrl + lb    返回写注释位置查看注释

    shift + F6  重命名

    #  字符串倒过来的做法:[-1::-1]

      

  • 相关阅读:
    联赛前第五阶段总结
    陶陶摘苹果 —— 线段树维护单调栈
    联赛前第三阶段总结
    联赛前第四阶段总结
    [NOIP
    超级跳马 —— 矩阵快速幂优化DP
    我的博客园美化
    Wedding —— 2-SAT
    C++运算符优先级
    water——小根堆+BFS
  • 原文地址:https://www.cnblogs.com/zl666/p/8516465.html
Copyright © 2020-2023  润新知