生成器 三元表达式 列表生成式 匿名函数 内置函数

生成器

1.什么是生成器?

? -生成的工具

? -生成器是一个自定义的迭代器,本质上是一个迭代器。

2.如何实现生成器?

    -但凡在函数内定义的yield

? -调用函数时,函数体代码不会执行

? 会返回一个结果,这个结果就是生成器。

3.yield

? -每一次的yield都会往生成器对象中添加一个值。

? -yield只能在函数内定义

? -yield可以保存函数的暂停状态

yield和return的对比

? -相同点:

? 返回值的是不限制的;

? -不同点

? return一次只可以返回一次值,yield可以返回多个值juli

自定义的迭代器
def func():
    print('from func')
    yield 'tank'

res = func()
print(res)
>>>>>>>
<generator object func at 0x000001C66A88BA98>####生成器

# 当我们通过__next__取值时,才会执行函数体代码。
def func():
    print('from func')
    yield 'tank'

res = func()
print(res.__next__())
>>>>>>>>>
from
('tank', 'asss')

举例

def func():
    print('开始准备下蛋')
    print('1---火鸡蛋1')
    yield '火鸡蛋1'######yield具有暂停函数的状态,打印一次,执行一次,最后一次打印完报错
    print('2---火鸡蛋2')
    yield '火鸡蛋2'
    print('3---火鸡蛋3')
    yield '火鸡蛋3'
    print('取最后一个蛋, 查看是否有')
res = func()
print(res.__next__())
>>>>>>>>>>
开始准备下蛋
1---火鸡蛋1
火鸡蛋1

python2: range(1, 5) ---> [1, 2, 3, 4]
python3: range(1, 5) ---> range对象 ---> 生成器 ---> 迭代器

三元表达式

可以将if....else.....的分支变成一行

语法:

? -条件成立返回左边的值 if 判断条件 else 条件不能成立 返回右边的值

比较2个值的大小
def max2(num1, num2):
    if num1 > num2:
        return num1
    else:
        return num2
max2(2,3)
print(max2(2,3))
>>>>>>>>
3
可以用下面的方法代替
三元表达式
def max2(num1, num2):
    res = num1 if num1 > num2 else num2
max2(2,3)
>>>>>>>>
3

列表表达式

-可以一行实现生成列表。

? -语法:

 list = [取出的每一个值、任意值 for 可迭代对象中取出的每一个值 in 可迭代对象]
         for的右边是循环次数,并且可以取出可迭代对象中每一个值
         for的左边可以为当前列表添加值
        list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]
        list = [值 for 可迭代对象中取出每一个值in 可迭代对象]
        list = [任意的值 for 可迭代对象中取出每一个值in 可迭代对象]
l1 = [1,2,3,4,5]
这个列表做成一个新的列表
普通的方法
l1 = [1,2,3,4,5]
new_l1 = []
for i in l1:
    new_l1.append(i)
print(new_l1)
>>>>>
[1, 2, 3, 4, 5]

列表的表达式
l1 = [1,2,3,4,5]

l2 = [i for i in l1]
print(l2)
>>>>>
[1, 2, 3, 4, 5]

#把一个列表的后缀都加上一个2
l1 = [1,2,3,4,5]
l2 = [i + 2 for i in l1 ]
print(l2)
>>>>>>
[3, 4, 5, 6, 7]

#把一个列表的后缀都加上'dsb'
l1 = ['david','jacon','jackson']
l2 = [name + 'dsb' for name in l1]
print(l2)
>>>>>>>
['daviddsb', 'jacondsb', 'jacksondsb']

生成器的表达式

-生成一个生成器的的对象---->生成一个迭代器对象

语法:

? (line for line in 可迭代对象)

? -g = (任意值 for in line in 可迭代对象)

? - print(g)#生成器对象

生成器表达式(生成器生成式):
    - 列表生成式:  若数据量小时采用
        [line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
        优点:
            可以依赖于索引取值,取值方便

        缺点:
            浪费资源

    - 生成器生成式:  若数据量过大时采用
        () ---> 返回生成器
        (line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)

        优点:
            节省资源

        缺点:
            取值不方便

 #生成一个新的列表
l1 = [line for line in range(1,6)]
print(l1)
>>>>>>>
[1, 2, 3, 4, 5]
生成器的表达式

l2 = (line for line in range(1,6))
print(next(l2))
print(next(l2))
print(next(l2))
print(next(l2))
>>>>>>>>>>
1
2
3
4

内置函数

python内部提供的内置方法

range() print() len()

我们重点学习的是max min sorted map filter

max求可迭代对象最大值
max内部会将list1中的通过for取出每一个值,并且进行判断
min是求可迭代对象的最小值 

#求一个列表专中的最大值和最小值
l1 = [2,3,4,6,7]
print(max(l1))
print(min(l1))
>>>>>>>>
7
2

sorted 对可迭代对象中的数据进行排序,默认的是升序

reverse = True :降序

#把一个列表里面的值排序 升序和降序   reverse:反转 reverse默认是False
l1 = [9,3,4,6,7]
# print(max(l1))
# print(min(l1))
print(sorted(l1))
print(sorted(l1,reverse = True))
>>>>>>>>>>
[3, 4, 6, 7, 9]
[9, 7, 6, 4, 3]

#求一个字典里面的key 和 value 的排序
d1 = {
    'name': 'david',
    'age': 'twenty',
    'hobby': 'basketball'
}
new_dic = sorted(d1, key=lambda x: d1[x])
print(new_dic)

print(sorted(d1))
>>>>>>>>>>
['hobby', 'name', 'age']
['age', 'hobby', 'name']

map:映射

? -map(函数的地址,可迭代对象)——>map对象

? -map会将可迭代对象中的每一个值进行修改,然后映射到一个map对象中,再将map对象转变成列表/元组

name_list = ['egon', 'david', 'jackson', 'alex']
map_obj = map(lambda name:name + '喜欢吃生蚝' if name == 'egon' else name + '喜欢打球',name_list)
print(list(map_obj))
>>>>>>>>>
['egon喜欢吃生蚝', 'david喜欢打球', 'jackson喜欢打球', 'alex喜欢打球']
另外一种方法
name_list = ['egon', 'david', 'jackson', 'alex']
list_obj = [name + 'a'if name == 'david'else name +'打篮球' for name in name_list]
print(list_obj)
>>>>>>>>>>>>>
['egon打篮球', 'davida', 'jackson打篮球', 'alex打篮球']

reduce:合并

? reduce(函数的地址,可迭代对象,默认值为0)

? reduce(函数地址,可迭代地址,初始值)

? 不能单独使用

? from functools import reduce

? 每次从可迭代对象中获取2个值进行合并

? 初始值:执行reduce 函数时,都是从初始值开始合并的

求1到100的之和
j = 0

for i in range(1,101):
    j += i
print(j)
>>>>>>>>>
5050

用reduce的方法
res = reduce(lambda x,y: x+y ,range(1,101),0) ###最后面的0可以改为                                                  其他
print(res)
>>>>>>>>>
5050

res = reduce(lambda x,y: x+y ,range(1,101),2)##默认值改为2
print(res)
>>>>>>>>>
5052

filter:过滤

? filter(函数地址,可迭代对象)----->filter 对象

name_list = ['egon_dd', 'david_dd', 'jackson_dd', 'alex']
l1 = filter(lambda name:name.endswith('_dd'),name_list)
print(tuple(l1))
>>>>>>>>
('egon_dd', 'david_dd', 'jackson_dd')

匿名函数

-定义:没有名字函数。

-lambda x : x+x ——>内存地址

? 第一个 x :是参数

? 第二个x+x 是返回值

? 都是以:为分界线

? func = lambda : 这样的函数有名字了 就是有名函数了

有名函数:

? -def 名字(x):#名字——>内存地址

? 函数名字+()调用,执行函数体代码

? 匿名函数名字,不能单独使用,应该要配合内置函数使用

d1 = {
    'name': 'david',
    'age': 'twenty',
    'hobby': 'basketball'
}
d2 = [max(d1, key=lambda x:d1[x])]
print(d2)
>>>>>>>>>
['age']

原文地址:https://www.cnblogs.com/bs2019/p/11867794.html

时间: 2024-08-26 14:01:43

生成器 三元表达式 列表生成式 匿名函数 内置函数的相关文章

day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数

本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印的就是装饰器函数的信息了,如何做呢? from functools import wraps def logger(f): @wraps(f) def inner(*args, **kwargs): """ :param args: 函数名,密码 :param kwargs: 备

递归/匿名函数/三元表达式/列表生成式/字典生成式/二分算法

让在下揭开尔等的面纱,一探究竟:) >>>递归: 递归是一个往复的过程,也就是由两个过程组成,一个是计算过程,一个是将值层层返回的过程,递归的奇妙之处,就在于自身调用自身,然后,过程遵循由复杂到简单,最终满足相应条件后,退出,返回结果.说了一大堆,不过直接上代码: test_list = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]] res = 0 def sum_list(test_list, res): f

4/2 三元表达式/函数递归/匿名函数/内置函数

三元表达式 def max2(x,y) if x > y: return x else return y res=max2(10,11) 三元表达式仅应用于: 1 条件成立返回一个值 2 条件不成功返回一个值 def max2(x,y): return x if x>y else y print (max2(2,10)) 10 函数递归:函数的递归调用,即在函数调用的过程中,又直接或间接地调用了函数的本身. 直接调用 def foo(): print ('fffff') foo() 间接调用

装饰器、生成器、迭代器、及python中内置函数的使用

一. 装饰器 1. 装饰器的概述 (1)概述:装饰器本质就是函数,主要用来装饰其他函数,为其他函数添加附加功能. (2)使用装饰器的原则 1)不能修改被装饰的函数的源代码 2)不能修改被装饰的函数的调用方式 (3)装饰器原理:函数即"变量".高阶函数.嵌套函数 2.使用装饰器的原因 (1)传统的多个函数模块修改需要同时修改多个函数.如果函数过多,则修改不方便. 如下,如果想要在每个函数中开头结尾分别输入内容,则需要在每个函数开头结尾加入需要输出的内容. def f1():     pr

函数-内置函数,匿名函数,嵌套函数,高阶函数,序列化

函数简单说明 # 函数即"变量" # 高阶函数 # a.把一个函数名当做实参传给另一个函数(在不修改被装饰函数的源代码的情况下,为其添加功能) # b.返回值中包含函数名(不修改函数的调用方式) ''' import time def bar(): print("in the bar!") time.sleep(2) def foo(func): start_time = time.time() func() #根据内存地址,执行代码 stop_time = tim

python基础12_匿名_内置函数

一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, 66] def binary_search(dataset, find_num): print(dataset) if len(dataset) > 1: mid = int(len(dataset) / 2) if dataset[mid] == find_num: # find it print

函数递归+匿名函数+内置函数day15

一.函数递归 什么是函数递归: 函数递归调用是一种特殊的嵌套调用,在调用一个函数的过程中,又直接或间接地调用了该函数本身. 其中,函数的递归有明确的结束条件,不能无限制的调用,否则会撑破内存,在Python中限定递归最多调用1000层. 1000层这个值是大概的数值,这个数值可以通过Python内置的功能进行更改. 递归必须要有两个明确的阶段: 递推:一层层递归调用下去,强调每次进入下一次递归,问题规模都在减小 回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推,开始一层层回溯 其中,

学习python的第十七天(二分法,有名函数,匿名函数,内置函数)

06.04 学习总结 一.二分法 二分法个人理解是一种算法的方式在一个有序的序列,区中间值,把中间值与想要的值进行对比从而一次一次的减少搜索范围举例 #给与一个列表1-100, num_list = [num fornum in range(1,101)] #给予一个num让你在列表中寻找他 mid_num_index = int(len(num_list)/2) mid_num = num_list[mid_num_index] if len(num_list)==1: if num_list

pythopn 函数(内置函数)

内置函数(Py3.5) 重要的内置函数: 1. filter(function, sequence) # 描述: filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判, 然后返回 True 或 False,最后将返回 True 的元素放到新列表中. # 语法: 以下是 filter() 方法的语法: filter(function,sequence) # 参数: funct