Python基础-函数/函数式编程/lambda表达式/装饰器(5)

函数:

函数也是一个对象,函数可以用来保存一些可以执行的代码,并且可以进行多次调用。

函数创建:

def 函数名([形参...])

def fun():
    print('进来了')
print('要调用了')
fun()

当函数有返回值时:

def fun(a,b,**c):
    return 'rel'
print(fun(a=1,b=3,c=2,e=4,h=6)) #rel
python是值传递还是引用传递

值传递就是函数调用时用的变量,函数内值发生变化时,函数外变量值不发生变化。
引用传递就是,函数内值发生变化时,函数外变量值也发生变化。
通过下面例子,我们可以得出,py的变量是普通变量时,其传递为值传递。如果变量是list,元组,dict,set等时,其为引用传递

a=2
def fun(a):
    a=3
    print(a) #3
fun(a) 
print(a) #2

a=[1,3,4]
def fun(a):
    a.pop()
    print(a) #[1, 3]
fun(a)
print(a) #[1, 3]

函数的参数:

在定义函数时,可以在函数名后面的()中定义数量不等的形参。

  • 形参,定义形参相当于在函数内部声明了变量,但是并不赋值
  • 实参,如果在函数定义时,指定了形参,那么在调用函数时也必须传递实参,实参将赋值给对应的形参。
函数参数:
  • 普通函数参数: fun(a,b,c)
  • 指定形参默认值:fun(a=1,b=3,c=5)
    函数调用时,如果传递了参数,则默认值无用,如果没有传递,则使用默认值,如果传递的参数不够,则按顺序赋值
def fun(a=2,b=3,c=10):
    print(a) #1
    print(b) #3
    print(c)#10
fun(1)
  • 关键字参数: 可以不按照形参定义的顺序去传递,直接根据参数名去传递
def fun(a=2,b=3,c=10):
    print(a) #6
    print(b) #3
    print(c)#1
fun(c=1,b=3,a=6)

位置参数和关键字参数可以混用,混用时,必须将位置参数写到前面,并且位置参数和关键字参数传值不能针对同一个变量,否则会报错


def fun(a=2,b=3,c=10):
    print(a) #1
    print(b) #6
    print(c)#3
fun(1,c=3,b=6)
不定长参数
  • def fun(*num): 实际就是可变参数,实际上就是一个元组。
    函数的参数中,带星号的形参只能传递一个,可以和其它参数配合使用,需要注意的是,带星号的形参并不需要是最后一个形参,只不过它后面的形参在传值时,必须以关键字参数形式传递。如果后面的参数没有指定,则会报错
def fun(a,*b,c):
    print(a) #1
    print(b) #(3, 5, 6, 3)
    print(c)#2
fun(1,3,5,6,3,c=2)
  • 如果在形参的开头直接写一个*,则要求所有参数必须关键字传参

def fun(*,a,b,c):
    print(a) #1
    print(b) #3
    print(c)#2
fun(a=1,b=3,c=2)
  • ** 形参可以接收其它关键字参数,并会将其保存在dict中国,key为参数名字,value就是参数的值
def fun(a,b,**c):
    print(a) #1
    print(b) #3
    print(c)#{'c': 2, 'e': 4, 'h': 6}
fun(a=1,b=3,c=2,e=4,h=6)
help()函数
  • help()函数是py中的内置函数,可以通过help(fun)来查看函数的用法
  • 文档字符串: 在定义函数时,可以在函数内部编写文档字符串。当我们调用help() 查看函数时,就可以看到文档字符串,也就是说明书。
def fun(a,b,**c):
    '''
    文档说明书
    :param a:
    :param b:
    :param c:
    :return:
    '''
    return 'rel'

help(fun)
在这里插入图片描述
命名空间(namespace)/locals()

命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名空间当中,每一个作用域都会有一个对应的命名空间。函数的namespace实际上就是一个存储变量的字典

def fun(a,b,**c):
    print(locals()) #函数
e=2
h=1
print(locals()) #全局
fun(a=1,b=3,c=2,e=4,h=6)
#结果
{'__spec__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000220E4B76C50>, '__doc__': None, 'h': 1, '__name__': '__main__', 'fun': <function fun at 0x00000220E4D3E488>, '__builtins__': <module 'builtins' (built-in)>, 'e': 2, '__package__': None, '__cached__': None, '__file__': 'E:/python/data/01.py'}
{'c': {'c': 2, 'h': 6, 'e': 4}, 'a': 1, 'b': 3}

函数式编程

在py中,函数是一等对象。一等对象有以下特点:

  • 对象是运行时创建的
  • 能赋值给变量或者作为数据结构中的元素
  • 能作为参数传递
  • 能作为返回值返回
高阶函数:

高阶函数需要符合以下两个特点中的一个:

  • 接收一个或者多个函数作为参数
  • 将函数作为返回值返回

当我们使用一个函数作为参数时,实际上是将指定的代码传递进了目标函数。

map()函数:

常规来说,我们需要对list每一个元素进行操作,那么我们创建一个函数,里面进行循环,实际上我们可以使用map()函数。这种方法,实际上就比传统写循环快

def fun(x):
    return x*x
a=[1,3,4,5]
ll=map(fun,a)
#map()返回的是一个Itertor(迭代器),需要将其转化为list
print(list(ll))
filter()函数:过滤器

传入两个参数,一个函数和一个序列,将函数作用于序列中每一个数,用函数条件进行判断,函数返回结果为True的才进行保留

def fun(x):
    return x%2==1
a=[1,3,4,5]
ll=filter(fun,a)
#map()返回的是一个Itertor(迭代器),需要将其转化为list
print(list(ll)) #[1, 3, 5]
sort()函数:

sorted函数也是一个高阶函数,他可以额外接受一个key函数来实现自定义排序,如按照绝对值排序

>>> sorted([12,-12,32,45,67,-1212],key=abs)
[12, -12, 32, 45, 67, -1212]

如果要实现忽略大小写的排序,则可以这样写

>>> sorted(['bob','about','Zoo','Credit'],key=str.lower)
['about', 'bob', 'Credit', 'Zoo']

当要进行反向排序时,可以传入第三个参数reverse=True

>>>sorted(['bob','about','Zoo','Credit'],key=str.lower,reverse=True)
['Zoo', 'Credit', 'bob', 'about']
闭包:

当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回的函数没有被立即执行,知道调用返回的函数时才被执行。

>>> def count():
...     fs=[]
...     for i in range(1,4):
...             def f():
...                     return i*i
...             fs.append(f)
...     return fs
...
>>> f1,f2,f3=count()
>>> f1()
9
>>> f2()
9
>>> f3()
9

因为i*i是函数,因此实际上返回的是函数,此时结果并么有计算出来,并且i还被后边的循环继续使用。

  • 注意: 返回闭包时,不要让返回函数引用任何的循环变量,或者后续会发生变化的变量

lambda表达式(匿名函数)

专门用来创建一些简单的函数
语法:lambda 参数列表:返回值

a=1
b=12
print(lambda a,b:a+b)
#lambda表达式也可以进行赋值
f=lambda a,b:a+b
print(f(a,b))

装饰器

在一些情况下,希望为函数增加功能,又不想修改原函数,可以使用装饰器。

def log(old):
    '''
    :param old: 需要增强的函数
    :return:
    '''
    def new_fun(*args,**kw):
        print('开始')
        res=old(*args,**kw)
        print('结束')
        return res
    return new_fun

def log1(old):
    '''
    :param old: 需要增强的函数
    :return:
    '''
    def new_fun1(*args,**kw):
        print('log1开始')
        old(*args, **kw)
        print('log1结束')
        return old(*args,**kw)
    return new_fun1
#存在多个装饰器时,远离函数的装饰器,在最远离函数的地方执行,如log就在最远离函数的地方执行
@log
@log1
def fun(a):
    print(a)
fun('s')
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容