python 函数关键

避免可变参数修改

如果不想要函数内部在原处的修改影响传递给它的对象,那么我们可以建立一个明确的拷贝。

L = [1,2]
charger(x,L[:])

也可以把L强制转换成tuple

参数匹配原则

  • 在函数调用种,参数必须按照:位置参数,后面跟任何关键字参数和*sequence形式的组合,后面跟 **dict形式。
  • 在函数头部,参数必须按照:任何一般参数,默认参数(name = value),*name形式,后面跟着任何name = value keyword-only参数,之后再跟 **name形式

无论是函数调用还是函数定义,** 必须放在最后面

从语法上讲,keyword-only参数跟在name 后面。也可以在参数中直接放置 , 表示函数不会接受一个变长长度的参数列表。

func(a ,* ,b,c)
func(1 , b = 1 ,c =2 )

也可以对keyword-only参数添加默认值,这样在调用的时候就可以不用写参数,如果要写的话必须用keyword-only形式。

在调用中,keywork-only必须在之前,也可以在 里面,如:

def func(a,*b ,c = 7, **d ): pass
func(1,*(2,3),**{c = 5, x = 3, e = 6})

函数间接调用

函数可以作为参数,可以放置入container里面,也可以作为返回值,工厂模式就是一个典型的函数作为返回值。

函数注解

python为声明注解提供了特殊的语法,但是它本身不做任何事情;注解完全是可选的,并且,出现的时候只是直接附加到函数对象的annotatiaons属性以供其他用户使用

对于参数,它们的出现紧随参数名之后的==冒号==之后;对于返回值,它们紧随参数列表之后的 ==->== 之后,eg:

def func(a:'span',b:(1,10))-> int:
    return a+b
print(func.__annotations__)
{'a': 'span', 'b': (1, 10), 'return': <class 'int'>}

注意:注解里面也可以添加默认值,这个时候:出现在默认值之前,eg:
def func(a:'span' = 10 ,b:(1,10) = 2)-> int

lambda表达式

syntax:
lambda:arg1, arg2,…argn:expression using arguments

lambda与函数的用法是相同的,但是也有区别

  • lambda能够出现在def不能出现的地方,比如在列表常量中或者函数调用的参数中,另外lambda返回了一个值,可以选择性的赋值给变量,def总是在头部将新的函数赋值给一个变量,而不是作为返回值。
  • lambda的功能比def小,它只是一个表达式而不是代码块,仅仅能够在lambda主题中封装有限的逻辑,if语句不能够在里面使用。他是一个为编写简单的函数而设计的,def用来处理更大的任务。

在lambda中也支持默认参数

map、filter函数

map函数会对一个序列对象中的每一个元素应用被传入函数,,并返回一个迭代器(在3.x),这样会减少for循环的使用。

它也有更高级的用法,对于多个序列,

pow(3,4)
81
list(map(pow, [1,2],[2,3])
1  8
list(filter(lambda x:x>0),range(-5,5))
[1,2,3,4]

迭代器之生成器

首先得理解生成器的作用,是在需要的时候才产生结果,而不是直接产生结果,也就是延迟结果的创建。有两种方式:
- 生成器函数:使用yield语句一次返回一个结果,在每个结果之间挂起和继续他们的状态。
- 生成器表达式,类似列表解析,但是它返回是按需产生结果的一个对象,而不是构建整个列表。

生成器表达式
g = (x for x in range(6))这就是一个生成器表达式,与list不同的是它用()表示。

列表解析和生成器是比较常见的,在python3中还可以有:集合解析和字典解析
- 对于集合,{1,2,3}等同于set([1,2,3]),并且新的集合解析语法{f(x) for x in S if p(x)}就像生成器表达式set(f(x) for x in S if p(x)),其中f(x)是一个任意表达式。
- 对于字典,新的字典解析语法{key:val for (key,val) in zip(keys ,vals)}像dict{zip(keys,vals)}形式一样工作,并且{x:f(x) for x in items}像生成器表达式dict((x,f(x)) for x in items)一样工作。

默认参数和可变对象

默认参数是在def语句运行时评估并保存的,而不是在函数调用时。从内部来讲,python会将每一个默认参数保存成一个对象,并附加在这个函数本身。如果有必要的话,它能够在整个作用域内保存值,默认参数在调用之间都保存了一个对象,必须对修改可变的默认参数十分小心。eg:

def f(x = []):    #save away a list object
    x.append(1)   #changes same object each time 
    print(x)

saver([2])    #default not used
[2,1]

saver()    #default used
[1]

saver()   #grows on each call
[1,1]

saver()
[1,1,1]

如果不需要这种行为可以

def f(x = None):    #save away a list object
    if x is None:
        x = []     #same as x = x or []
    x.append(1)   
    print(x)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值