zoukankan      html  css  js  c++  java
  • python基础之函数式编程、匿名函数、内置函数

    一 函数式编程

    1. 不修改外部状态。
    2. 模仿数学里得函数进行编程。
    3. 用函数编程写出得代码相当精简。
    4. 可读性比较差。

    例子:

    y=2*x+1
    
    x=1
    def test(x):
    	return 2*x+1
    test(x)

    一 匿名函数

    • 匿名函数就是不需要显式的指定函数。
    • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lamba表达式中封装有限的逻辑进去。

    注:匿名函数引用计数为0,lambda经常和内置函数一起使用

      lambda/filter/map/reduce这些都是函数式编程的风格。

    语法:
    lambda函数的语法只包含一个语句,如下:

    lambda [arg1 [,arg2,.....argn]]:expression

    先来个简单得:

    #这段代码
    def calc(n):
        return n**n
    print(calc(10))
    
    #换成匿名函数
    calc = lambda n:n**n
    print(calc(10))
    

     换个高级点得:

    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':250
    }
    
    def get_value(k):
        return salaries[k]
    
    #换成匿名函数:
    lambda k:salaries[k]
    f=lambda k:salaries[k] #匿名函数也可以赋值一个名字,但是这便违反了匿名的初衷
    print(f)
    print(f('egon'))
    
    print(max(salaries))
    print(max(salaries,key=get_value))
    print(max(salaries,key=lambda k:salaries[k]))
    print(min(salaries,key=lambda k:salaries[k]))

    二 内置函数

     

    官方文档,内置参数详解:

    https://docs.python.org/3/library/functions.html?highlight=built#ascii

    数据类型内置函数,又称为工厂函数。

    函数是个具体的对象,谁来调用都可以用。方法需要绑定到具体对象。

    l1=[]
    l1.append('aaaa')
    
    def test(x,item):
         x.append(item)
    test(b,'bbbbb')
    函数例子

    内置函数使用示例:

    1、abs绝对值

    print(abs(-1))
    print(abs(0))
    

    执行结果:

    1
    0
    

    2、all所有的都为真,它才为真

    print(all(' '))  #注意all(' ')和all('')的区别,一个是空字符串,一个是空  
    print(all(''))  #如果可迭代对象是空,就返回True。
    print(all((1,' ',2)))
    print(all((1,'',2)))
    print(all((1,' ',2,None)))
    print(all(i for i in range(1,10)))
    

    执行结果:

    True
    True
    True
    False
    False
    True
    

    3、any集合中的元素有一个为真的时候为真,特别的,若为空串返回为False

    print(any([]))
    print(any([0,'',None,{},1]))
    

    执行结果:

    False
    True
    

    4、bin把十进制转成二进制

    print(bin(3))
    

    执行结果:

    0b11
    

    5、bool布尔值 空,None,0的布尔值为False

    print(bool(0))
    print(bool(None))
    print(bool(''))
    print(bool([]))
    

    执行结果:

    False
    False
    False
    False
    

    6、bytes把字符串转成字节

    ps1:

    name='你好'
    print(bytes(name,encoding='utf-8'))
    print(bytes(name,encoding='utf-8').decode('utf-8'))
    

    执行结果:

    b'xe4xbdxa0xe5xa5xbd'
    你好
    

    ps2:

    name='你好'
    print(bytes(name,encoding='gbk'))
    print(bytes(name,encoding='gbk').decode('gbk'))
    

    执行结果:

    b'xc4xe3xbaxc3'
    你好
    

    ps3: #ascll不能编码中文,会报错

    name='你好'
    print(bytes(name,encoding='ascii')) #ascii不能编码中文,会报错
    

    执行结果:

    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled/day25/test.py", line 21, in <module>
        print(bytes(name,encoding='ascii')) #ascii不能编码中文,会报错
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    

    7、ASCII码对应的编码:

    ps1:

    print(chr(66))   #ascll 码对应的编码
    

    执行结果:

    B
    

    ps2:

    print(ord("B"))   #ascll 码对应的编码
    

    执行结果:

    66
    

    8、数据类型:

    int #整型

    num=1 #num=int(1)
    print(type(num)) #查看num的类型
    print(isinstance(num,int)) #判断num是否为int类型
    

    执行结果:

    <class 'int'>
    True
    
    print(num is 1) #is 是身份运算,根据id去判断身份
    

    执行结果:

    True
    

    其他数字类型:

    float #浮点
    bool #布尔
    complex #复数

    str #字符串

    x='money' #x=str('money')
    print(str(1))
    print(str({'a':1}))
    

    执行结果:

    1
    {'a': 1}
    

    list #列表

    x=[]
    x=list(i for i in range(10))
    print(x)
    

    执行结果:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    tuple #元组
    dict #字典

    d={'a':1}
    d=dict(x=1,y=2,z=3)
    print(d)
    

    执行结果:

    {'x': 1, 'y': 2, 'z': 3}
    

    set #集合

    s={1,2,3,4,4}
    print(s)
    s.add(5)
    print(s)
    

    执行结果:

    {1, 2, 3, 4}
    {1, 2, 3, 4, 5}
    

    frozenset #不可变集合

    f=frozenset({1,2,3,4})
    print(type(f))
    

    执行结果:

    <class 'frozenset'>
    

    complex #复数

    x=complex(1-2j)
    print(x.real)
    print(x.imag)
    

    执行结果:

    1.0
    -2.0
    
    x=1-2j
    print(x.real)
    print(x.imag)
    

    执行结果:

    1.0
    -2.0
    

    9、dir显示函数内置属性和方法:

    print(dir(dict))  #打印内置属性和方法
    

    执行结果:

    ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
    
    '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', 
    
    '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', 
    
    '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
    
    l=[]
    print(dir(l))
    

    执行结果:

    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
    
    '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', 
    
    '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', 
    
    '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 
    
    'insert', 'pop', 'remove', 'reverse', 'sort']
    

    10、help 查看函数用法的说细信息

    print(help(sum))
    

    执行结果:

    Help on built-in function sum in module builtins:
    
    sum(iterable, start=0, /)
        Return the sum of a 'start' value (default: 0) plus an iterable of numbers
        
        When the iterable is empty, return the start value.
        This function is intended specifically for use with numeric values and may
        reject non-numeric types.
    
    None
    

    11、divmod 取商得余数,用于做分页显示功能

    print(divmod(10,3)) #取商得余数,用于做分页显示
    

    执行结果:

    (3, 1)
    

    12、enumerate返回一个可枚举的对象,该对象的next()方法将返回一个tuple

    for i in enumerate(['a','b','c','d']):
        print(i)
    for i in enumerate({'x':1,'y':2}):
        print(i)
    

    执行结果:

    (0, 'a')
    (1, 'b')
    (2, 'c')
    (3, 'd')
    (0, 'x')
    (1, 'y')
    

    13、hash 可hash的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型

    print(hash('123abc'))
    print(hash('123abcd'))
    name='alex'
    print(hash(name))
    print('--->before',hash(name))
    name='sb'
    print('--->after',hash(name))
    

    执行结果:

    1142581611408458944
    5571539217676805375
    2895136519908427636
    --->before 2895136519908427636
    --->after -2600704963542853119
    

    14、bin、hex、oct进制转换

    print(bin(10))   #10进制->2进制
    print(hex(12))   #10进制->16进制
    print(oct(12))   #10进制->8进制
    

    15、id 返回对象的唯一标识id(object)

    print(id('abc'))
    a=1
    b=2
    print(id(a))
    print(id(b))
    x='a'
    y='b'
    print(id(x))
    print(id(y))
    print(x is y)
    

    执行结果:

    31023032
    1589421152
    1589421184
    30945832
    30931800
    False
    

    16、max和min 最大值和最小值

    print(max(1,2,3,4,10,3))
    print(min(1,2,3,4,10,3))
    

    执行结果:

    10
    1
    

    17、zip拉链,将对象逐一配对

    l1=[1,2,3,4]
    s='hel'
    for i in zip(l1,s):
        print(i)
    print(max((1,'a'),(1,'b')))
    
    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':250
    }
    print(salaries.keys(),salaries.values())
    z=zip(salaries.values(),salaries.keys())
    print(z)
    for i in z:
        print(i)
    

    执行结果:

    (1, 'h')
    (2, 'e')
    (3, 'l')
    (1, 'b')
    dict_keys(['egon', 'alex', 'wupeiqi', 'yuanhao']) dict_values([3000, 100000000, 10000, 250])
    <zip object at 0x00000000021BCF88>
    (3000, 'egon')
    (100000000, 'alex')
    (10000, 'wupeiqi')
    (250, 'yuanhao')
    

    18、sorted排序

    l={3,4,1,0,9,10}
    print(sorted(l)) #返回值是列表,默认是升序
    print(sorted(l,reverse=True)) #降序排列
    s='hello abc'
    print(sorted(s))
    
    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':250
    }
    print(sorted(salaries)) #默认是按照字典salaries的key去排序的
    print(sorted(salaries,key=lambda x:salaries[x]))
    print(sorted(salaries,reverse=True,key=lambda x:salaries[x]))
    

    执行结果:

    [0, 1, 3, 4, 9, 10]
    [10, 9, 4, 3, 1, 0]
    [' ', 'a', 'b', 'c', 'e', 'h', 'l', 'l', 'o']
    
    ['alex', 'egon', 'wupeiqi', 'yuanhao']
    ['yuanhao', 'egon', 'wupeiqi', 'alex']
    ['alex', 'wupeiqi', 'egon', 'yuanhao']
    

    排序且修改:

    l=[3,2,0,10]
    l=sorted(l)
    print(l)
    

    执行结果:

    [0, 2, 3, 10]
    

    19、map映射,map(function,iterable,...)遍历每个元素,执行function操作

    l=[1,2,3,7,5]
    x={i**2 for i in l}
    print(x)
    iterm=2
    m=map(lambda item:item**2,l)
    print(m)
    for i in m:
        print(i)
    print(list(m))
    
    name_1=['alex','yuanhao','wupeiqi']
    m=map(lambda name:name+'SB',name_1)
    print(list(m))
    

    执行结果:

    {1, 4, 9, 49, 25}
    <map object at 0x00000000028099B0>
    1
    4
    9
    49
    25
    []
    ['alexSB', 'yuanhaoSB', 'wupeiqiSB']
    

    20、reduce 合并操作,从第一个开始是前两个参数,然后是前两个的结果与第三个合并进行处理,以此类推。

    reduce(function,iterable[,initializer]) 

    from functools import reduce #合并
    l=list(range(100))
    print(l)
    print(reduce(lambda x,y:x+y,l,100))
    i=iter(l)
    # 100 next(i) --->100,0----->x,y-x+y-->100
    # 100 next(i)---->100,1----->x,y--x+y-->101
    # 101 next(i)----->101,2
    

    执行结果:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
    
    35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
    
    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
    5050
    

    21、filter过滤

    name_l=[
        {'name':'egon','age':18},
        {'name':'alex','age':1000},
        {'name':'wupeiqi','age':9000},
        {'name':'yuanhao','age':10000},
    ]
    
    f=filter(lambda d:d['age'] > 100,name_l)
    print(f)
    for i in f:
        print(i)
    

    执行结果:

    <filter object at 0x00000000027A9BA8>
    {'name': 'alex', 'age': 1000}
    {'name': 'wupeiqi', 'age': 9000}
    {'name': 'yuanhao', 'age': 10000}
    

    22、pow 几的几次方

    print(pow(3,2,2)) #3**3%2 3的3次方,取余
    print(pow(3,3)) #3**3 几的几次方,相当于3的3次方
    

    执行结果:

    1
    27
    

    23、reversed 反转

    print(list(reversed([1,5,3,9])))
    

    执行结果:

    [9, 3, 5, 1]
    

    24、round  四舍五入

    当数字n是两个相邻整数的中间值(例如 1.5、2.5、3.5和4.5)时,round函数将返回与其最为接近的偶数。
    例如,round(2.5)的结果是2,而round(3.5)的结果是4。
    decimal的默认context是"四舍六入五留双"。(只针对python3.x)

    print(round(2.6))
    print(round(2.5))
    print(round(3.4))
    print(round(3.5))

    执行结果:

    3
    2
    3
    4

    25、slice 切片

    l=[1,2,3,4,5,6]
    print(l[2:5:2])
    s=slice(2,5,2)
    print(l[s])
    

    执行结果:

    [3, 5]
    [3, 5]
    

    26、vars跟一个列表或多个字典

    print(vars())
    print(vars() is locals())
    

    执行结果:

    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 
    
    0x000000000068A358>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 
    
    'C:/Users/Administrator/PycharmProjects/untitled/day25/test.py', '__cached__': None}
    True
    

    27、import模块

    1、先创建一个test.py文件
    写入内容如下:

    def say_hi():
        print('你好啊egon')
    

    2、再调用这个模块

    import test #写入一个模块,模块就是一个py文件
    test.say_hi()
    

    执行结果:

    你好啊egon
    

    28、__import__: 导入一个字符串类型模块,就要用__import__

    1、先创建一个test.py文件
    写入内容如下:

    def say_hi():
        print('你好啊egon')
    

    2、再调用这个模块

    module_name='test'
    m=__import__(module_name)
    m.say_hi()
    

    执行结果:

    你好啊egon
    

    其他内容,在面向对象里讲:

    classmethod
    staticmethod
    property
    
    delattr
    hasattr
    getattr
    setattr
    
    issubclass
    super
    其他内置函数

    练习题:

    作业一、

    1、用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb

      name=['alex','wupeiqi','yuanhao']

    m=map(lambda name:name+'_sb',name)
    print(list(m))
    

    2、用map来处理下述l,然后用list得到一个新的列表,列表中每个人的名字都是sb结尾

      l=[{'name':'alex'},{'name':'y'}]

    print(list(map(lambda i:{'name':i['name']+"sb"},l)))

    作业二:

    1、用filter来处理,得到股票价格大于20的股票名字

    shares={
    'IBM':36.6,
    'Lenovo':23.2,
    'oldboy':21.2,
    'ocean':10.2,
    }

    res=filter(lambda x:shares[x]>20,shares)
    print(list(res))
    或者
    for i in res:
        print(i)

    作业三:

    如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格

    portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
    ]

    1、map来得出一个包含数字的迭代器,数字指的是:购买每支股票的总价格

    res=map(lambda x:x['shares']*x['price'],portfolio)
    print(list(res))
    或者
    for i in res:
        print(i)
    

    2、基于1的结果,用reduce来计算,购买这些股票总共花了多少钱

    l1=[]
    res=map(lambda x:x['shares']*x['price'],portfolio)
    print(list(res))
    或者
    for i in res:
        l1.append(i)
    
    res=reduce(lambda x,y:x+y,l1)
    print(res)
    

    3、用filter过滤出,单价大于100的股票有哪些

    res=filter(lambda x:x["price"]>100,portfolio)
    for i in res:
        print(i)
    
  • 相关阅读:
    大道至简 读后感01
    《人月神话》读后感
    水王继续
    软工大作业DB天气项目风险评估
    自我调查 使用输入法
    课堂练习之找“水王”
    浪潮之巅阅读笔记之三
    浪潮之巅阅读笔记之二
    浪潮之巅阅读笔记之一
    课程改进意见
  • 原文地址:https://www.cnblogs.com/luchuangao/p/6703864.html
Copyright © 2011-2022 走看看