一、匿名函数
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 语句的注释就能解决这个问题。