生成器
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 func
'tank'
举例
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'] ####这个结果是value的大小比较后,升序排列的key的排序
['age', 'hobby', 'name']####这个结果是key的排序
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可以改为 其他 x = 0 y执行的是for循环中的值跟x相加
print(res)
>>>>>>>>>
5050
res = reduce(lambda x,y: x+y ,range(1,101),2)##默认值改为2
print(res)
>>>>>>>>>
5052
filter:过滤
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])] #z这个是max内部的原理 把di的key遍历 发给lambda 得到返回值的value 在进行比较,最后比较后,最大值的key返回出去
print(d2)
>>>>>>>>>
['age']