zoukankan      html  css  js  c++  java
  • 匿名函数

     匿名函数

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数

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

    上面是我们对calc这个匿名函数的分析,下面给出了一个关于匿名函数格式的说明

    函数名 = lambda 参数 :返回值
    
    #参数可以有多个,用逗号隔开
    #匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
    #返回值和正常的函数一样可以是任意数据类型

    们可以看出,匿名函数并不是真的不能有名字。

    匿名函数的调用和正常的调用也没有什么分别。 就是 函数名(参数) 就可以了~~~

    练一练:

    请把以下函数变成匿名函数
    def add(x,y):
        return x+y

     用到匿名函数的内置函数

    上面是匿名函数的函数用法。除此之外,匿名函数也不是浪得虚名,它真的可以匿名。在和其他功能函数合作的时候

    常见的内置函数能够添加内置函数的:  max(可迭代对象或几个数据,key=(lambda x:x*2))    min()  注意  key=func  函数名  不带括号的

                                          sorted(对象,key=func)序列排序函 数    有返回值  返回值是一个新列表 

        特殊的两个         filter(函数名,可迭代对象  )  map(函数名,可迭代对象  )    

    这个可以将后边的数据依次传到匿名函数中去   然后返回一个迭代器,
     可以依次将值取出   用for循环,或者用list强转列表 ,都是迭代器取值的方法

     常见的带key的内置函数:   min  max   sort  sorted map  filter

     
    l=[3,2,100,999,213,1111,31121,333]
    print(max(l))
    
    dic={'k1':10,'k2':100,'k3':30}
    
    
    print(max(dic))
    print(dic[max(dic,key=lambda k:dic[k])])   这里注意对字典的键值比较时,用这个方法来处理  
    res = map(lambda x:x**2,[1,5,7,4,8])
    for i in res:
        print(i)
    这个可以将后边的数据依次传到匿名函数中去   然后返回一个迭代器,
     可以依次将值取出   用for循环,或者用list强转列表 ,都是迭代器取值的方法

     filter()

    #取出例表中的所有的奇数,
    li=[12,44,6,7,33,2,1]
    #这里用到filter  它跟
    print(list(filter(lambda x:x if x%2==1 else None,l)))
    这个可以将后边的数据依次传到匿名函数中去   然后返回一个迭代器,
     可以依次将值取出   用for循环,或者用list强转列表 ,都是迭代器取值的方法

     

    day17 python 常见的内置函数 和匿名函数

     .把任意数值转化为字符串有两种方法。

    (1)str()用于将数值转化为易于人读的形式。print(str("我是中国人"))>>>我是中国人

    (2)repr()用于将数值转化为易于解释器读的形式输出的是字符串的官方标准。str出来的值是给人看的字符串,repr出来的值是给机器看的,括号中的任何内容出来后都是在它之上再加上一层引号。
    print(repr("我是中国人"))>>>"我是中国人" 。Python中出现的任何中文,虽然我们在编辑器里看到的是中文,但是背地里全是一串编码。千万不要轻易信任print!print xx给你显示出来的,
    其实并不是xx的真实面貌!

    .内建函数:

    list(iterable)把可迭代对象转换成列表

     tuple(iterable)把可迭代对象转换成元组

    str(obj)把对象转化为字符串(对象的字符串表示法)


    zip()拉链函数:函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个的元组,然后返回由这些元组组成的迭代器。

    如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组迭代器。

    复制代码
    l1=[1,2,3]
    l2=[4,5,8,3]
    print(list(zip(l1,l2)))
    print(*(zip(l1,l2)))
    结果:
    
    [(1, 4), (2, 5), (3, 8)]
    (1, 4), (2, 5), (3, 8)
    复制代码

    .数据函数:

    divmod()函数: 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。
    print(divmod(3,2))
    结果:

    (1, 1)
    min()函数:

    min(iterable, *[, key, default])

    min(arg1, arg2, *args[, key])

     函数功能为取传入的多个参数中的最小值,或者传入的可迭代对象元素中的最小值。默认数值型参数,取值小者;字符型参数,取字母表排序靠前者。还可以传入命名参数key,其为一个函数,用来指定取最小值的方法。default命名参数用来指定最小值不存在时返回的默认值。功能与max函数相反。

    print(min(26,7,8,9))
    结果

    同类型之间可以进行比较

    print(min([1,2],[1,3]))
    [1, 2]
    key参数的另外一个作用是,不同类型对象本来不能比较取最小值的,传入适当的key函数,变得可以比较能取最小值了。

    print(min(1,2,'3',key = int))
    结果:

    1

    callable()

    #判断是否可调用的

    a='s'
    def func():
        print(a)
    print(callable(a))#不可调用   False
    print(callable(print))#可以调用  True
    print(callable(func))#可以调用  True

    #ctrl + 左键单击 :pycharm
    #help:包含所有方法名以及他的使用方法 —— 不知道用法
    #dir:只包含方法名 —— 想查看某方法是否在这个数据类型中


    # f = open('文件名','w',encoding='utf-8')
    #打开模式:r、w、a、rb、wb,ab     文件的操作最好不要用  带+ 号的操作方法,  就是不要同时读写,这样会容易造成光标混乱
    #编码 utf-8/GBK

    复制代码
    哈希  
    # print(id(1))
    # print(id(2))
    # print(hash('sajghfj;eyrwodnvjnz,.jifupwk'))  #算法
    # print(hash(125342))
    # print(hash((1,2,3,4)))
    
    #数据的存储和查找
    #模块:hashlib
    # {'k':'v'}
    # [1,2,3,4,5,6,]
    
    # hash([1,2,3,4,5,6,])
    #hash 判断一个数据类型是否可以hash
    #在一个程序执行的过程中,对同一个值hash的结果总是不变
    #多次执行,对同一个值的hash结果可能改变
    复制代码

    print的用法

    def print(self, *args, sep=' ', end='
    ', file=None)
    end='
    '  这里用户不设置的话会默认为打印完成后回车下一行
    sep=' '  在值之间插入字符串,默认空格
    复制代码
    #打印进度条
    import time
    for i in range(0,101,2):
    
        mun=i//2  #要打印的星号的数量  # 
     默认表示将输出的内容返回到第一个指针,这样的话,后面的内容会覆盖前面的内容
        to_print ='
    %s%%:%s
    '%(i,'*'*mun) if i==100 else '
    %s%%:%s'%(i,'*'*mun)#这里当i=100时 
      才换行   #还有这句话的用法  记住
        print(to_print,sep='--',end='',flush=True)# 这里end  要设置成“”否则打印一行,会换行一次
        time.sleep(0.2)
    复制代码
    复制代码
    # print(1,2,3,4,5,sep='*')  #sep是指定多个要打印的内容之间的分隔符
    li=[1,2,3,5]
    print(li,sep='//')
    print(1,2,3,4,sep='*')
    print('aa','bb',sep='122')
    #打印的结果
    # [1, 2, 3, 5]
    # 1*2*3*4
    # aa122bb
    复制代码
    复制代码
    #简单求值表达式用eval
    # code2 = '1 + 2 + 3 + 4'
    # compile2 = compile(code2,'','eval')
    # print(eval(compile2))
    
    # code3 = 'name = input("please input your name:")'
    # compile3 = compile(code3,'','single')
    # # name #执行前name变量不存在
    # exec(compile3)
    # print(name)
    
    #exec
    #eval
    #compile
    复制代码

     常见的带key的内置函数

    min  max   sort  sorted map  filter

    eval() 将字符串类型的代码执行并返回结果

    print(eval('1+2+3+4'))

    exec()将自字符串类型的代码执行

    print(exec("1+2+3+4"))
    exec("print('hello,world')")

    compile  将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求值。

    参数说明:   

    1. 参数source:字符串或者AST(Abstract Syntax Trees)对象。即需要动态执行的代码段。  

    2. 参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可。  

    3. 参数model:指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。

    复制代码
    复制代码
    >>> #流程语句使用exec
    >>> code1 = 'for i in range(0,10): print (i)'
    >>> compile1 = compile(code1,'','exec')
    >>> exec (compile1)
    1
    3
    5
    7
    9
    
    
    >>> #简单求值表达式用eval
    >>> code2 = '1 + 2 + 3 + 4'
    >>> compile2 = compile(code2,'','eval')
    >>> eval(compile2)
    
    
    >>> #交互语句用single
    >>> code3 = 'name = input("please input your name:")'
    >>> compile3 = compile(code3,'','single')
    >>> name #执行前name变量不存在
    Traceback (most recent call last):
      File "<pyshell#29>", line 1, in <module>
        name
    NameError: name 'name' is not defined
    >>> exec(compile3) #执行时显示交互命令,提示输入
    please input your name:'pythoner'
    >>> name #执行后name变量有值
    "'pythoner'"
    复制代码
    复制代码

    老师的博客:

    内置函数

    接下来,我们就一起来看看python里的内置函数。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使用的所有函数。这些函数有些我们已经用过了,有些我们还没用到过,还有一些是被封印了,必须等我们学了新知识才能解开封印的。那今天我们就一起来认识一下python的内置函数。这么多函数,我们该从何学起呢?

      Built-in Functions  
    abs() dict() help() min() setattr()
    all() dir() hex() next() slice()
    any() divmod() id() object() sorted()
    ascii() enumerate() input() oct() staticmethod()
    bin() eval() int() open() str()
    bool() exec() isinstance() ord() sum()
    bytearray() filter() issubclass() pow() super()
    bytes() float() iter() print() tuple()
    callable() format() len() property() type()
    chr() frozenset() list() range() vars()
    classmethod() getattr() locals() repr() zip()
    compile() globals() map() reversed() __import__()
    complex() hasattr() max() round()  
    delattr() hash() memoryview() set()  

    上面就是内置函数的表,68个函数都在这儿了。这个表的顺序是按照首字母的排列顺序来的,你会发现都混乱的堆在一起。比如,oct和bin和hex都是做进制换算的,但是却被写在了三个地方。。。这样非常不利于大家归纳和学习。那我把这些函数分成了6大类。你看下面这张图,你猜咱们今天会学哪几大类呀? 

    我猜你们都猜对了。我们今天就要学习用粉红色标注出来的这四大块——56个方法。还有12个方法欠着怎么办呢?我们讲完面向对象这剩下的12个会在两周之内陆续还给你们的,我保证(认真脸)。那这样,我们今天就主要关注我们要学习的这56个方法。

    那要学的一共4块,咱们从哪儿开始学起呢?

    作用域相关

    基于字典的形式获取局部变量和全局变量

    globals()——获取全局变量的字典

    locals()——获取执行本方法所在命名空间内的局部变量的字典

    其他

    字符串类型代码的执行

    http://www.cnblogs.com/Eva-J/articles/7266087.html

    输入输出相关:

    复制代码
    def print(self, *args, sep=' ', end='
    ', file=None): # known special case of print
        """
        print(value, ..., sep=' ', end='
    ', file=sys.stdout, flush=False)
        file:  默认是输出到屏幕,如果设置为文件句柄,输出到文件
        sep:   打印多个值之间的分隔符,默认为空格
        end:   每一次打印的结尾,默认为换行符
        flush: 立即把内容输出到流文件,不作缓存
        """
    复制代码

    数据类型相关:

    type(o) 返回变量o的数据类型

    内存相关:

    id(o) o是参数,返回一个变量的内存地址

    hash(o) o是参数,返回一个可hash变量的哈希值,不可hash的变量被hash之后会报错

    查看参数所属类型的所有内置方法

    dir() 默认查看全局空间内的属性,也接受一个参数,查看这个参数内的方法或变量

    和数字相关

    数字——数据类型相关:bool,int,float,complex

    数字——进制转换相关:bin,oct,hex

    数字——数学运算:abs,divmod,min,max,sum,round,pow

    和数据结构相关

    序列——列表和元组相关的:list和tuple

    序列——字符串相关的:str,format,bytes,bytearry,memoryview,ord,chr,ascii,repr

     匿名函数

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数

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

    上面是我们对calc这个匿名函数的分析,下面给出了一个关于匿名函数格式的说明

  • 相关阅读:
    socket套接字通信和粘包问题
    TCP协议
    网络编程
    单例模式
    类的内置方法(魔法方法)
    反射(hasattr和getattr和setattr和delattr)
    isinstance与issubclass
    绑定方法与非绑定方法
    鸭子类型
    类的多态和抽象类
  • 原文地址:https://www.cnblogs.com/wangkun122/p/8278643.html
Copyright © 2011-2022 走看看