内置函数和推导式(匿名函数,三元运算,生成器)

本文介绍了Python中的匿名函数,详细讲解了lambda表达式的使用及其限制。接着讨论了生成器的概念,强调了它们在节省内存方面的优势,并给出了实际应用案例。此外,还系统地梳理了36个内置函数,分为多个类别,并提到了推导式在列表、集合、字典和元组初始化中的应用。
摘要由CSDN通过智能技术生成

一、匿名函数

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

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 参数:函数体

1.参数,支持任意参数。

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

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

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

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

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

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

练习题

根据函数写写出其匿名函数的表达方式

def func(a1,a2):
    return a1 + a2

func = lambda a1,a2: a1+a2
def func(data):
    return data.replace("张三","***")

func= lambda data: data.replace("张三","***")
def func(data):
    name_list = data.replace(".")
    return name_list[-1]

func = lambda data: data.replace(".")[-1]

在编写匿名函数时,由于受限 函数体只能写一行,所以匿名函数只能处理非常简单的功能。

扩展:三元运算

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

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

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

if "你好" in num:
    data = "hello"
else:
    data = "world"
    
print(data)
num = input("请写入内容")
data = "hello" if "你好" in num else "world"
print(data)

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

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

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

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

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

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

二、生成器(面试常用)

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

1. 生成器函数与生成器对象

【1】生成器函数,但函数中有yield存在时,这个函数就是生产生成器函数。
  def func():
      print(111)
      yield 1
  def func():
      print(111)
      yield 1
  
      print(222)
      yield 2
  
      print(333)
      yield 3
  
      print(444)
【2】生成器对象,执行生成器函数时,会返回一个生成器对象。(函数是不会执行的)
def func():
    print(123)
    print(123)
    yield 1234  # 有点像return,执行到这个位置之后,就不再执行。
    print(456)
    yield 666  # 有点像return,执行到这个位置之后,就不再执行。
    print(789)
    # return None # 程序就会报错,生成器中的代码执行完毕了 StopIteration1】生成器使用功能方法举例:
data = func()
# 基于for循环执行生成器对象
for item in data:
    # 本质为执行next(data)
    print(item)    #使用for循环最后的return不会报错2】生成器原理:
# 执行生成器函数时,函数体默认不会被执行;返回的是一个生成器对象。
v1 = func()
print(v1) # <generator object func at 0x7fd0280f75f0>

# next里面放生成器对象,进入生成器函数并执行其中的代码
n1 = next(v1)
print(n1)

# next里面放生成器对象,进入生成器函数并执行其中的代码(从上次yield返回位置继续向下)
n2 = next(v1)
print(n2)

# next里面放生成器对象,进入生成器函数并执行其中的代码(从上次yield返回位置继续向下)
n3 = next(v1)
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时,会从上一次的位置基础上再继续向下执行。

2.应用场景

【1】假设要让你生成 300w个随机的4位数,并打印出来。
  • 在内存中一次性创建300w个
  • 动态创建,用一个创建一个。
    旧的实现方法:
import random

val = random.randint(1000, 9999)
print(val
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值