文章目录
2020-09-27 Day_6
一、函数
1.函数的内存分析
(1)代码执行 def 时,系统中会创建函数对象,并通过函数名这个变量进行引用。若x = Pstar()则内存分析如下图:
Python 中,圆括号意味着调用函数。在没有圆括号的情况下,Python会把函数当做普通对象。
2. 全局变量和局部变量
1. 全局变量
- 全局变量降低了函数的通用性和可读性,
应尽量避免全局变量的使用。
- 全局变量一般做
常量
使用。 - 函数内要改变全局变量的值,使用
global
声明一下
2. 局部变量
- 局部变量比全局变量快
- 如果同名,函数只使用局部变量
3.局部变量与全局变量效率
import math
import time
def test01():
start = time.time()
for i in range(10000000):
math.sqrt(30)
end = time.time()
print("耗时{0}".format((end-start)))
def test02():
b = math.sqrt
start = time.time()
for i in range(10000000):
b(30)
end = time.time()
print("耗时{0}".format((end-start)))
test01()
test02()
3. 参数的传递
- 对
可变对象
如:字典、列表、集合、自定义的对象等,进行写操作,直接作用于原对象本身。 - 对
不可变对象
如:数字、字符串、元组、function等进行写操作,会产生一个新的“对象空间”,并将新的值写入空间。
4.浅拷贝和深拷贝
#浅拷贝,右侧为浅拷贝示意图,a,b在栈中,其余在堆中。
#浅拷贝只拷贝一层关系,深拷贝所有关系都拷贝。
import copy
a = [10, 20, [5, 6]]
b = copy.copy(a)
b.append(30)
b[2].append(7)
a= [10, 20, [5, 6, 7]]
b =[10, 20, [5, 6, 7], 30]
#深拷贝
a = [10, 20, [5, 6]]
b = copy.deepcopy(a)
b.append(30)
b[2].append(7)
a= [10, 20, [5, 6]]
b =[10, 20, [5, 6, 7], 30]
传递不可变对象时,里面包含可变对象。例如:a = (10,20,[5,6]) 如果在函数内修改[5,6]的值,变量a中列表内的值也会发生相应改变。
5.参数的类型
1.位置参数 例如def f1(a,b,c):
2.默认参数 例如 def f1(a,b,c=10,d=20):
3.命名参数:按照形参的名称传递参数,称为“命名参数
4. 可变参数:
*param(一个星号),将多个参数收集到一个“元组”对象中。
**param(两个星号),将多个参数收集到一个“字典”对象中。
5.强制命名参数:在带星号的“可变参数”后面增加新的参数,必须在调用的时候强制命名参数
6. lambda表达式和匿名函数
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))
7.eval()函数
作用:将字符串str当成有效的表达式来求值并返回计算结果
语句:eval(source[, globals[, locals]]) -> value
参数:
source:一个 Python表达式或函数 compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意映射对象
8.递归函数
最典型题目:阶乘
def factorial(n):
if n == 1: return 1
return n*factorial(n-1)
for i in range(1,6):
print("{0}! = {1}".format(i,factorial(i)))