Python中的普通函数、参数、lamaba表达式与匿名函数、递归函数

函数的存储

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)   # <function <lambda> 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九久呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值