函数的存储
1、函数的存储方式
python中使用def进行函数名 的标识。在Python中, 任何变量都是对象,函数也是对象,所以在创建函数的时候,在堆中开辟一块儿内存,存放是放函数的语句、函数内部的变量,而函数的名称则是放入栈中。所以 在定义好函数的时候,函数就在内存中已经存储好了。而不是我们调用一次函数就创建一次函数对象。
2、弱复制与强复制
在copy库里面copy方法和deepcopy方法分别对应着浅拷贝与深拷贝。下面程序说明什么是深拷贝、什么是浅拷贝。
浅拷贝:
import copy as cp
a = [1,2,[3,4]]
b = cp.copy(a)
b.append(7)
b[2].append(8)
print(a) # [1, 2, [3, 4, 8]]
print(b) # [1, 2, [3, 4, 8], 7]
本例子中为浅拷贝,变量b只是拷贝了变量a的对象,但并没有拷贝a对象的内存对象,如图所示:
在进行浅拷贝的时候,b只是拷贝了a里面所指向的内存单元,但是更深层次的拷贝copy无法进行。
深拷贝:
import copy as cp
a = [1,2,[3,4]]
b = cp.deepcopy(a)
b.append(7)
b[2].append(8)
print(a) # [1, 2, [3, 4]]
print(b) # [1, 2, [3, 4, 8], 7]
与浅拷贝不同,深拷贝时b会把a的所有内容都拷贝过来。
3、eval函数
描述
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
语法
以下是 eval() 方法的语法:
eval(expression[, globals[, locals]])
参数:
expression,表达式。globals ,变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。locals,变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
返回表达式计算结果。
实例
>>>x = 7
>>> eval( '3 * x' )
21
>>> eval('pow(2,2)')
4
>>> eval('2 + 2')
4
>>> n=81
>>> eval("n + 4")
85
4、变量的作用域
在Python中没有常量,只不过我们会使用大写的标识符来表明这个是“规定”的常量。Python中的变量跟其它语言一样,分为全局变量和局部变量。之前我们提到过,如果要提高Python的运行效率,那么我们最好用局部变量而不是全局变量,这是因为在写函数的时候,函数的代码块放于堆中,而函数名被放于栈中,同样,全局变量放于栈中,局部变量跟函数代码块放于堆中。
a = 3
def f(b):
a = 9
print(a)
f(a) # 9
print(a) # 3
如果我们在函数中要使用全局变量,可以使用global关键字,如果不声明,则默认为局部变量。
a = 3
def f(b):
global a
a = 9
print(a)
f(a) # 9
print(a) # 9
函数的参数
1、必需参数
必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
def f( str ):
print (str)
return
#调用 f 函数
f('123') # '123'
2、关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def f( str ):
"打印任何传入的字符串"
print (str)
return
#调用f函数
f( str = "123") # 123
对于有多个参数:
#可写函数说明
def f( name, age ):
"打印任何传入的字符串"
print ("名字: ", name,end=',')
print ("年龄: ", age)
return
#调用f函数
f( age=15, name="XiaoMing" ) # 名字: XiaoMing,年龄: 15
3、默认参数
调用函数时,如果没有传递参数,则会使用默认参数。
def f( name, age = 10 ):
"打印任何传入的字符串"
print ("名字: ", name,end=',')
print ("年龄: ", age)
return
#调用f函数
f( age=15, name="XiaoMing" ) #名字: XiaoMing,年龄: 15
print ("------------------------")
f( name="XiaoMing" ) #名字: XiaoMing,年龄: 10
lambda表达式与匿名函数
python 使用 lambda 来创建匿名函数。所谓匿名,即不再使用 def 语句这样标准的形式定义一个函数。lambda的主体是一个表达式,而不是一个代码块。
sum = lambda a,b:a+b
print(sum(3,4)) # 7
print(sum) # at 0x000002110ED6E510>
f = [lambda a:a+1,lambda b:b**2,lambda c:c*2]
print(f[0](4),f[1](4),f[2](4)) # 5 16 8
递归函数
递归函数就是自己调用自己,满足结束条件。python中写函数方便了很多。
def f(a):
if(a==1):
return 1
else:
return a*f(a-1)
print(f(3)) # 6