首页 > 其他分享 >2-4 匿名函数、生成器、内置函数、推导式

2-4 匿名函数、生成器、内置函数、推导式

时间:2023-11-28 22:33:48浏览次数:32  
标签:内置 函数 生成器 v1 num print data

 概要:

  • 匿名函数

  • 生成器

  • 内置函数

  • 推导式

 

1. 匿名函数

传统的函数的定义包括了:函数名 + 函数体。

def send_email():
    pass
​
# 1. 执行
send_email()
# 2. 当做列表元素
data_list = [send_email, send_email, send_email ]
# 3. 当做参数传递
other_function(send_email)

 

匿名函数,则是基于lambda表达式实现定义一个可以没有名字的函数,例如:

data_list = [ lambda x:x+100,  lambda x:x+110, lambda x:x+120 ]
​
print( data_list[0] )
f1 = lambda x:x+100
​
res = f1(100)
print(res)

 

基于Lambda定义的函数格式为:lambda 参数:函数体

  • 参数,支持任意参数。

    lambda x: 函数体
    lambda x1,x2: 函数体
    lambda *args, **kwargs: 函数体

     

  • 函数体,只能支持单行的代码。

    def xxx(x):
        return x + 100
        
    lambda x: x + 100

     

  • 返回值,默认将函数体单行代码执行的结果返回给函数的执行这。

    func = lambda x: x + 100
    ​
    v1 = func(10)
    print(v1) # 110

     

def func(a1,a2):
    return a1 + a2 + 100
​
foo = lambda a1,a2: a1 + a2 + 100

匿名函数适用于简单的业务处理,可以快速并简单的创建函数。

 

 

扩展:三元运算

简单的函数,可以基于lambda表达式实现。

简单的条件语句,可以基于三元运算实现,例如:

num = input("请写入内容")

if "苍师" in num:
    data = "臭不要脸"
else:
    data = "正经人"
    
print(data)
num = input("请写入内容")
data = "臭不要脸" if "苍师" in num else "正经人"
print(data)

# 结果 =  条件成立时    if   条件   else   不成立

lambda表达式和三元运算没有任何关系,属于两个独立的知识点。

 

掌握三元运算之后,以后再编写匿名函数时,就可以处理再稍微复杂点的情况了,例如:

func = lambda x: "大了" if x > 66 else "小了"

v1 = func(1)
print(v1) # "小了"

v2 = func(100)
print(v2) # "大了"

 

 

2. 生成器

生成器是由函数+yield关键字创造出来的写法,在特定情况下,用他可以帮助我们节省内存。

  • 生成器函数,但函数中有yield存在时,这个函数就是生产生成器函数。

    def func():
        print(111)
        yield 1
    def func():
        print(111)
        yield 1
    
        print(222)
        yield 2
    
        print(333)
        yield 3
    
        print(444)

     

  • 生成器对象,执行生成器函数时,会返回一个生成器对象。

    def func():
        print(111)
        yield 1
    
        print(222)
        yield 2
    
        print(333)
        yield 3
    
        print(444)
        
    data = func()
    # 执行生成器函数func,返回的生成器对象。
    # 注意:执行生成器函数时,函数内部代码不会执行。
    def func():
        print(111)
        yield 1
    
        print(222)
        yield 2
    
        print(333)
        yield 3
    
        print(444)
        
    data = func()
    
    v1 = next(data)
    print(v1)
    
    v2 = next(data)
    print(v2)
    
    v3 = next(data)
    print(v3)
    
    v4 = next(data)
    print(v4)  # 结束或中途遇到return,程序爆:StopIteration 错误
    data = func()
    
    for item in data:
        print(item)

     

生成器的特点是,记录在函数中的执行位置,下次执行next时,会从上一次的位置基础上再继续向下执行。

 

应用场景

  • 假设要让你生成 300w个随机的4位数,并打印出来。

    • 在内存中一次性创建300w个

    • 动态创建,用一个创建一个。

        
    import random
    
    
    def gen_random_num(max_count):
        counter = 0
        while counter < max_count:
            yield random.randint(1000, 9999)
            counter += 1
    
    
    data_list = gen_random_num(3000000)
    # 再使用时,去 data_list 中获取即可。
  • 假设让你从某个数据源中获取300w条数据(后期学习操作MySQL 或 Redis等数据源再操作,了解思想即可)。

image-20201230174253215

编辑

所以,当以后需要我们在内存中创建很多数据时,可以想着用基于生成器来实现一点一点生成(用一点生产一点),以节省内存的开销。

 

扩展

def func():
    print(111)
    v1 = yield 1
    print(v1)

    print(222)
    v2 = yield 2
    print(v2)

    print(333)
    v3 = yield 3
    print(v3)

    print(444)


data = func()

n1 = data.send(None)
print(n1)

n2 = data.send(666)
print(n2)

n3 = data.send(777)
print(n3)

n4 = data.send(888)
print(n4)

 

3.内置函数

Python内部为我们提供了很多方便的内置函数,在此整理出来36个给大家。

  • 第1组(5个)

    • abs,绝对值

      v = abs(-10)
    • pow,指数

      v1 = pow(2,5) # 2的5次方  2**5
      print(v1)
    • sum,求和

      v1 = sum([-11, 22, 33, 44, 55]) # 可以被迭代-for循环
      print(v1)
    • divmod,求商和余数

      v1, v2 = divmod(9, 2)
      print(v1, v2)
    • round,小数点后n位(四舍五入)

      v1 = round(4.11786, 2)
      print(v1) # 4.12
  • 第2组:(4个)

    • min,最小值

      v1 = min(11, 2, 3, 4, 5, 56)
      print(v1) # 2
      v2 = min([11, 22, 33, 44, 55]) # 迭代的类型(for循环)
      print(v2)
      v3 = min([-11, 2, 33, 44, 55], key=lambda x: abs(x))
      print(v3) # 2
    • max,最大值

      v1 = max(11, 2, 3, 4, 5, 56)
      print(v1)
      
      v2 = max([11, 22, 33, 44, 55])
      print(v2)
      v3 = max([-11, 22, 33, 44, 55], key=lambda x: x * 10)
      print(v3) # 55
    • all,是否全部为True

      v1 = all(   [11,22,44,""]   ) # False
    • any,是否存在True

      v2 = any([11,22,44,""]) # True
  • 第3组(3个)

    • bin,十进制转二进制

    • oct,十进制转八进制

    • hex,十进制转十六进制

  • 第4组(2个)

    • ord,获取字符对应的unicode码点(十进制)

      v1 = ord("武")
      print(v1, hex(v1))
    • chr,根据码点(十进制)获取对应字符

      v1 = chr(27494)
      print(v1)
  • 第5组(9个)

    • int

    • foat

    • str,unicode编码

    • bytes,utf-8、gbk编码

      v1 = "ayden"  # str类型
      
      v2 = v1.encode('utf-8')  # bytes类型
      
      v3 = bytes(v1,encoding="utf-8") # bytes类型
    • bool

    • list

    • dict

    • tuple

    • set

  • 第6组(13个)

    • len

    • print

    • input

    • open

    • type,获取数据类型

      v1 = "123"
      
      if type(v1) == str:
          pass
      else:
          pass
    • range

      range(10)
    • enumerate

      v1 = ["ayden", "alex", 'root']
      
      for num, value in enumerate(v1, 1):
          print(num, value)
    • id

    • hash

      v1 = hash("ayden")
    • help,帮助信息

      • pycharm,不用

      • 终端,使用

    • zip

      v1 = [11, 22, 33, 44, 55, 66]
      v2 = [55, 66, 77, 88]
      v3 = [10, 20, 30, 40, 50]
          
      result = zip(v1, v2, v3)
      for item in result:
          print(item)
    • callable,是否可执行,后面是否可以加括号。

      v1 = "ayden"
      v2 = lambda x: x
      def v3():
          pass
      
      
      print( callable(v1) ) # False
      print(callable(v2))
      print(callable(v3))
    • sorted,排序

      v1 = sorted([11,22,33,44,55])

       

      info = {
          "wupeiqi": {
              'id': 10,
              'age': 119
          },
          "root": {
              'id': 20,
              'age': 29
          },
          "seven": {
              'id': 9,
              'age': 9
          },
          "admin": {
              'id': 11,
              'age': 139
          },
      }
      
      result = sorted(info.items(), key=lambda x: x[1]['id'])
      print(result)

 

4.推导式

推导式是Python中提供了一个非常方便的功能,可以让我们通过一行代码实现创建list、dict、tuple、set 的同时初始化一些值。

请创建一个列表,并在列表中初始化:0、1、2、3、4、5、6、7、8、9...299 整数元素。

data = []
for i in range(300):
    data.append(i)
  • 列表

    num_list = [ i for i in range(10)]
    
    num_list = [ [i,i] for i in range(10)]
    
    num_list = [ [i,i] for i in range(10) if i > 6 ]

     

  • 集合

    num_set = { i for i in range(10)}
    
    num_set = { (i,i,i) for i in range(10)}
    
    num_set = { (i,i,i) for i in range(10) if i>3}

     

  • 字典

    num_dict = { i:i for i in range(10)}
    
    num_dict = { i:(i,11) for i in range(10)}
    
    num_dict = { i:(i,11) for i in range(10) if i>7}

     

  • 元组,不同于其他类型。

    # 不会立即执行内部循环去生成数据,而是得到一个生成器。
    data = (i for i in range(10))
    print(data)
    for item in data:
        print(item)

     

高级

  1. 推导式支持嵌套

    data = [ i for i in range(10)]
    data = [ (i,j) for j in range(5) for i in range(10)]
    
    data = []
    for i in range(10):
        for j in range(5):
            data.append( (i,j) )
    
    data = [ [i, j] for j in range(5) for i in range(10)]
    # 一副扑克牌
    
    poker_list = [ (color,num) for num in range(1,14) for color in ["红桃", "黑桃", "方片", "梅花"]]
    
    poker_list = [ [color, num] for num in range(1, 14) for color in ["红桃", "黑桃", "方片", "梅花"]]
    
    print(poker_list)	

     

  2. 烧脑题

    def num():
        return [lambda x: i * x for i in range(4)]
    
    
    # 1. num()并获取返回值  [函数,函数,函数,函数] i=3
    # 2. for循环返回值
    # 3. 返回值的每个元素(2)
    result = [m(2) for m in num()]  # [6,6,6,6]
    print(result)
    def num():
        return (lambda x: i * x for i in range(4))
    
    
    # 1. num()并获取返回值  生成器对象
    # 2. for循环返回值
    # 3. 返回值的每个元素(2)
    result = [m(2) for m in num()]  # [0,2,4,6 ]
    print(result)

     

总结

  1. 匿名函数,基于lambda表达式实现一行创建一个函数。一般用于编写简单的函数。

  2. 三元运算,用一行代码实现处理简单的条件判断和赋值。

  3. 生成器,函数中如果yield关键字

    • 生成器函数

    • 生成器对象

    • 执行生成器函数中的代码

      • next

      • for(常用)

      • send

  4. 内置函数(36个)

  5. 推导式

    • 常规操作

    • 高级操作

标签:内置,函数,生成器,v1,num,print,data
From: https://www.cnblogs.com/zhengyongwu/p/17863293.html

相关文章

  • Day20.匿名函数的两种调用方式_max用法_min用法_sorted用法_map用法_filter用法_reduc
    1.匿名函数的两种调用方式: 2.匿名函数求最大和求最小:3.sorted用法和map用法:4.filter的用法:5.reduce的用法:......
  • chap3 变量与函数
    变量与函数1.变量1.赋值:=2.新值数据类型不一定与旧数据相同x=10 print(x) x=true print(x)3.变量=值,变量可以理解为“标签”4.变量的命名规则:-必须以字母或下划线开头-命名可由字母数字下划线组成-大小写有区别-避免保留字命名5.保留字:查看:importkeywo......
  • quickjs调用C函数
    QuickJS调用C函数,这个可以参考官方的std、os进行实现。外部库core.h1#include<string.h>2#include"quickjs-libc.h"3#include"cutils.h"45externJSModuleDef*js_init_module_core(JSContext*ctx,constchar*module_name);core.c1#include&qu......
  • emscripten 中c 代码引用外部js 函数
    主要是一个简单的学习,webassebly支持通过import调用环境的函数(比如调用浏览器或者nodejs中的一些方法)简单说明方法很多,包含了emscripten提供的调用js的宏,但是以下使用了一个emscripten提供的--js-library功能--js-library简单说明--js-library主要是实现emcc在编......
  • 【转载】php内置服务器的使用
    参考https://www.php.net/manual/zh/features.commandline.webserver.phphttps://www.bilibili.com/video/BV1J54y1q7y3https://blog.csdn.net/shenshulong/article/details/103959756注意这个内置的Web服务器主要用于本地开发使用,不可用于线上产品环境。环境软件/......
  • Python常用的数据处理函数和模块
    Python还提供了许多其他用于数据处理和转换的内置函数和模块。以下是一些常用的数据处理函数和模块:sortedsorted(iterable,key=func,reverse=False)用于对可迭代对象进行排序。你可以指定一个可选的key函数来自定义排序规则,以及一个可选的reverse参数来控制升序或降序排......
  • day3-函数
    循环练习1、打印100以内7的倍数//需要验证的是1-100之间的数字循环计数器正好可以表示//i初始值设置为1正好可以表示出需要验证的数字for(vari=1;i<=100;i++){if(i%7==0){console.log(i)}}2、计算1~100之间所有奇数的和//计算1~100......
  • AP5192pwm调光温度保护内置mos管恒流芯片
    产品描述AP5192是一款PWM工作模式,高效率、外围简单、内置功率MOS管,适用于4.5-100V输入的高精度降压LED恒流驱动芯片。最大电流1.5A。AP5192可实现线性调光和PWM调光,线性调光脚有效电压范围0.55-2.6V.AP5192工作频率可以通过RT外部电阻编程来设定,同时内置抖频电路,可以降低对......
  • day3-函数1
    循环练习1、打印100以内7的倍数//需要验证的是1-100之间的数字循环计数器正好可以表示//i初始值设置为1正好可以表示出需要验证的数字for(vari=1;i<=100;i++){if(i%7==0){console.log(i)}}2、计算1~100之间所有奇数的和//计算1~100......
  • 无涯教程-MySQL String Functions函数
    Sr.No.Name&Description1ASCII()返回最左边字符的数值2BIN()返回参数的字符串表示形式3BIT_LENGTH()返回参数的长度(以位为单位)4CHAR_LENGTH()返回参数中的字符数5CHAR()返回传递的每个整数的字符6CHARACTER_LENGTH()CHAR_LENGTH()的同义词7......