函数的存储

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无法进行。

pythoninput两个变量 python函数输出两个变量_字符串

深拷贝:

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的所有内容都拷贝过来。

pythoninput两个变量 python函数输出两个变量_python中递归函数两个变量_02

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