python基础入门---10认识函数(3)

一、匿名函数

python中使用lambda关键字来声明一个匿名函数
格式: lambda 参数列表:返回值

参数列表: 多个参数之间用逗号隔开  

【例】下面分别用两种方式实现一下函数求和

def func1(num1, num2):
    return num1 + num2
print(func1(10, 20))

用匿名函数

func2 = lambda num1, num2: num1 + num2
print(func2(10,20))

【变式提升】使用匿名函数求指定列表中,指定的两个下标对应的元素的和

func3 = lambda list1, index1, index2: list1[index1]+list1[index2]
print(func3([11, 4, 8, 9, 20], 0, 2))

输出:19

【例】使用指定的功能去计算num1和num2

def calculate(num1, num2, fn):
    return fn(num1, num2)


sum1 = calculate(10, 20, lambda a, b: a-b)
print(sum1)

输出-10

二、递归函数


1.递归函数: 在函数的声明中调用函数本身

def func1()
    print('aaa')
    func1()

func1()

这里的func就是自己调用自己


2.递归作用:

理论上循环能够做到的事情递归都可以做(但实际除非是非用不可的情况,一般不用递归)

3.递归步骤


递归函数:f(n)
a. 确定临界值(结束函数的时刻)  
b. 假设函数的功能已经实现,然后找到f(n)和f(n-1)关系  
c. 使用f(n-1)与f(n)的关系去实现f(n)的功能

【例】分别用循环来求1-100的和1+2+3+4+5+......100

方法一:使用循环

ef func1(n):
    sum1 = 0
    for x in range(1, n+1):
        sum1 += x
    return sum1


print(func1(100))

方法二:使用递归

def func2(n):
    # 1.确定临界值
    if n == 1:
        return 1
    # 2.假设func2功能实现了,找func2(n-1), func2(n)的关系
    # func2(n-1) = 1+2+3+...+n-1
    # func2(n) = 1+2+3+...+n-1+n = func2(n-1)+n
    # 3.通过func2(n-1)去实现func2(n)的功能
    return func2(n-1)+n


print(func2(100))

首先确定临界值然后通过func2(n-1)去实现func2(n)的功能

【例】用递归实现:2*4*6*...*n(要求n是偶数)

ef func3(n):
    if n % 2 != 0:
        print('n必须是偶数')
        return None
    # 1.确定临界值
    if n == 2:
        return 2
    # 2.找规律
    # f(n) = 2 * 4 * 6*...*n-2*n
    # f(n-2) = 2 * 4 * 6*...* n-2
    # f(n) = f(n-2)*n
    return func3(n-2)*n


print(func3(6))

首先确保输入的数应该是偶数,然后根据规律找到临界值

【例】打印倒三角星号

*****  
****   
***    
**     
*  

分析:首先我们先看一下规律,每行有几颗星星,并且递减递增规律 0  5*
****   1  4*
***    2  3*
**     3  2*
*      4  1*
依然采用两种方法====方法一:用循环

def print_star(n):
    # x = (0,1,2,3,4)
    for x in range(n):
        print('*'*(n-x))

print_star(5)

方法二--使用递归

def print_star2(n):
    # 1. 确定临界值(一定要让函数结束)
    if n == 1:
        print('*')
        return None
    # 2. 找关系f(n)和f(n-1)
    """
    n = 5 ,打印:
    *****
    ****
    ***
    **
    *
    n=5-1,打印:
    ****
    ***
    **
    *
    f(n)和f(n-1)关系:打印一行n个*,在执行f(n-1)
    """
    print('*'*n)
    print_star2(n-1)

4.函数调用过程

函数调用的过程是一个压栈的过程:

a.调用函数的时候,首先会在栈中开辟一块内存空间,
用来保存函数调用过程中产生的数据(包括函数的参数和在函数中声明的变量)
b.当函数执行完成后,被调用函数对应的内存空间会被回收(释放)

栈:是内存中的一块特殊的区域。数字和字符串的值是存在栈里面的
堆:对象是存在堆里面的

总结: 递归要慎用!(能用循环做的,就不要用递归。递归消耗内存也消耗CPU资源)

三、使用模块

1.什么是模块

模块就是指一个.py文件(一个.py文件就是一个模块),可以在一个模块中使用其他模块的函数和类。

模块让你能够有逻辑地组织你的 Python 代码段。把相关的代码分配到一个模块里能让你的代码更好用,更易懂。模块能定义函数,类和变量,模块里也能包含可执行的代码。

2.模块的使用方法

怎么使用其他模块中的函数?
1) 通过import关键字导入模块,然后通过 模块名.函数 的方法去使用模块中的函数

比如要引用模块 math,就可以在文件最开始的地方用 import math 来引入。在调用 math 模块中的函数时,必须这样引用

模块名.函数名

 方案1:通过 import 模块名
# 导入qf_math模块

 import qf_math

result = qf_math.sum(1, 3, 5)
print(result)


注意: 当我们导入其他的模块的时候,会将其他模块中的所有的内容都会导入到当前文件中
2) 通过from-import直接导入指定的函数。导入后就可以直接调用函数(可以导入多个函数名)
格式: from 模块名 import 函数名1, 函数名2

【例】方案2: from 模块名 import 函数名


from qf_math import sum as my_sum
result = sum(10, 2)
print(result)
重命名后使用新的函数名调用函数
print(my_sum(10, 3))

(3)通过 as关键字给导入模块或者函数重命名

# 通过as给模块重新命名
import qf_math as my_math

# 重命名后可以使用新的模块名去调用函数
print(my_math.sum(1, 3, 5))

3.关于__name__属性:


__name__是每个模块都有的属性,作用是用来存储模块的名字。
当模块不是正在执行的模块,__name__属性的值是模块对应的文件的文件名;
当模块正在执行的时候,__name__的值就是一个固定值'__main__'

4.PYTHONPATH 变量

作为环境变量,PYTHONPATH 由装在一个列表里的许多目录组成。PYTHONPATH 的语法和 shell 变量 PATH 的一样。

在 Windows 系统,典型的 PYTHONPATH 如下:

set PYTHONPATH=c:\python27\lib;

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  • 1、当前目录
  • 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
  • 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。

模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

5.命名空间和作用域

量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。

一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。

每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。

Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。

因此,如果要给函数内的全局变量赋值,必须使用 global 语句。

global VarName 的表达式会告诉 Python, VarName 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。

例如,我们在全局命名空间里定义一个变量 Money。我们再在函数内给变量 Money 赋值,然后 Python 会假定 Money 是一个局部变量。然而,我们并没有在访问前声明一个局部变量 Money,结果就是会出现一个 UnboundLocalError 的错误。取消 global 语句的注释就能解决这个问题。

猜你喜欢

转载自blog.csdn.net/ZZQHELLO2018/article/details/81261327