python函数(三)


高阶函数

高阶函数需满足条件:

  • 函数名作为参数传入。
  • 函数名作为返回值。
闭包

闭包的定义需要满足以下三个条件:

  • 在一个外函数中定义了一个内函数。
  • 内函数里运用了外函数的临时变量。
  • 并且外函数的返回值是内函数的引用。
    示例:
def outside(age):
    print("name:kirito")
    def inside(n):
        return "age:"+str(n + age)
    return inside
a = outside(6)
print(a(10))
  # ==>name:kirito
  # ==>age:16

总结:
闭包它是一种现象。
一般情况下,函数执行完毕,临时变量将会被释放。
但此时,外函数发现自己的临时变量将来会被使用,所以外函数结束时,返回内函数引用的同时,将外函数的临时变量与内函数绑定。这也是为什么外函数结束了,内函数依然可以继续使用外函数的临时变量的原因。

装饰器

装饰器 (@) 是一种语法糖,主要用于在函数或类的基础上添加一些可重用的额外功能。从应用开发的角度来看的话,我们使用装饰器来对我们的应用代码进行功能性扩展和包装,以提高代码的可重用性和可维护性。
示例:

import time
def t(fun):
    def times():
        start = time.time()
        fun()
        end = time.time()
        print(f"所用时间:{end-start}")
    return times
@t
def kirito():
    print("蓄力中…")
    time.sleep(0.5)
    print("蓄力中……")
    time.sleep(0.5)
    print("星爆气流斩!")
    time.sleep(1)
kirito()
  # ==>蓄力中…
  # ==>蓄力中……
  # ==>星爆气流斩!
  # ==>所用时间:2.0013954639434814

推导式

Python 中有一种特有的语法,就是推导式(又称为解析式)。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
共有三种推导:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式
列表推导式
  • [out_express for out_express in input_list]
    示例:
li=[i/2 for i in range(1,21)]
print(li)  # ==>[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
  • [out_express for out_express in input_list if out_express_condition]
    示例:

非推导式写法:

l = [21,-31,24,232,-13,-12,32]
li=list(map(lambda x:x**2,filter(lambda x:x<0,l)))
print(li)  # ==>[961, 169, 144]

推导式写法:

l = [21,-31,24,232,-13,-12,32]
li=[i**2 for i in l if i<0]
print(li)  # ==>[961, 169, 144]
  • [i for row in matrix for i in row]
字典推导式
  • {out_exp_key: out_exp_value for out_exp in input_list}
    示例:
sao=["name","age","skill"]
kirito=["kirito", 16, "星爆气流斩"]
a = {i:n for i in sao for n in kirito}
print(a)  # ==>{'name': '星爆气流斩', 'age': '星爆气流斩', 'skill': '星爆气流斩'}
集合推导式
  • {out_exp_res for out_exp in input_set}
    示例:
sao=["kirito", 16, "星爆气流斩"]
a = {i for i in sao}
print(a)  # ==>{16, 'kirito', '星爆气流斩'}
注意:
  • 没有元组推导式,(i for i in range(10)) 返回的是 generator object
问题:
问题一:

过滤掉该列表names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]长度小于或等于3的字符串列表,并将剩下的转换成大写字母。

回答:
写法1:

names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]
print([i.upper() for i in names if len(i)>3])  # ==>['Jerry', 'Hansen', 'Wendy']

写法2:

names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]
print(list(map(lambda x:x.upper(),filter(lambda x:len(x)>3,names))))  # ==>['Jerry', 'Hansen', 'Wendy']
问题二:

求(x,y),其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表。
效果如下:[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

回答:

a=[(x,y+1) for x in range(0,5,2) for y in range(0,3,2)]
print(a)  # ==>[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
问题三:

[ 'Bob','JOHN','alice','bob','ALICE','James','Bob','JAMES','jAMeS' ]该列表很紊乱,实现去重,以及将名字格式统一成首字母大写(str.capitalize())。

回答:

names = [ 'Bob','JOHN','alice','bob','ALICE','James','Bob','JAMES','jAMeS' ]
print(set([i.capitalize() for i in names]))  # ==>['James', 'Alice', 'John', 'Bob']

声明:一代明君的小屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - python函数(三)


欢迎来到我的小屋