Learn Day5

1.迭代器

# ### 迭代器
"""能被next调用,并不断返回下一个值的对象"""
"""
特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据
优点:需要数据的时候,一次取一个,可以大大节省内存空间.而不是一股脑的把所有数据放进内存.
"""
# 1.可迭代对象
"""
如果一个数据类型其中的成员包含了__iter__方法,这个数据类型就是可迭代对象
dir 这个函数可以获取该数据类型的成员结构
"""
setvar = {1,2,"a","b"}
print(setvar)
for i in setvar:
    print(i)

res = dir(setvar)
print(res)


# 2.迭代器
"""
for循环在迭代数据的时候,内部先转化成迭代器,然后通过next方法来进行调用,形成迭代效果

可迭代对象 -> 迭代器 从不可被直接调用 -> 可被直接调用的过程

变成迭代器:
    (1) iter (2) __iter__()
遍历迭代器:
    (1) next (2)__next__()
判断迭代器:
    (1)该数据含有__iter__ 和 __next__ 两个方法,
    就说该数据类型是迭代器
    (2)from collections import Iterator,Iterable

如果是一个迭代器,一个是一个可迭代对象
如果是一个可迭代对象,不一定是迭代器.
"""
# 变成迭代器
res1 = iter(setvar)
print(res1) #iterator
res2 = setvar.__iter__()
print(res2)

# 遍历迭代器
res = next(res2)
res = next(res2)
res = next(res2)
print(res)

lst = dir(res2)
print(lst)
# 判断可迭代对象
print("__iter__" in dir(setvar))
# 判断迭代器 方法一
print("__iter__" in dir(res2) and "__next__" in dir(res2))


# 判断迭代器 方法二
# from 从哪里.. collections模块 import 引入 Iterator迭代器 Iterable可迭代对象
from collections import Iterator,Iterable
listvar = [1,2,3,4,5]
# listvar 是否是一个迭代器
res = isinstance(listvar,Iterator)
print(res) # False
# listvar 是否是一个可迭代对象
res = isinstance(listvar,Iterable)
print(res) # True

# 判断range的可迭代属性
res = isinstance(range(10) , Iterator)
print(res)
res = isinstance(range(10) , Iterable)
print(res)

# 遍历range对象
for i in range(10):
    print(i)
# 能被next调用的,一定是一个迭代器
# next(range(10))  error

# 变成迭代器
it = iter(range(10))
print(it)
# 判断类型:isinstance
print(isinstance(it,Iterator))

# 调用range转换的迭代器
"""如果在调用时,超出了原有的数据个数,直接越界报错.
next在调用数据的时,是单向不可逆的.(一条路走到黑,一次性)
"""
# 遍历方法一
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
res = next(it)
# res = next(it) error 越界报错
print(res)

print("<====>")
# 重置迭代器
it = iter(range(10))
# 遍历方法二,通过for和next 配合调用
for i in range(3):
    res = next(it)
    print(res)
    
# 遍历方法三,也可以通过for 一次性遍历所有迭代器中数据
print("<====>")
for i in it:
    print(i)
# next(it) error
"""
用法1:isinstance(要判断的数据,数据类型) 返回True或者返回False
用法2:isinstance(要判断的数据,(数据类型1,数据类型2,数据类型3.....) ) 如果有一个条件满足,就返回真
int float bool complex str list tuple dict set
"""
"""
lst = [1,2,3]
res = isinstance(lst,list)
res = isinstance(lst,tuple)
# 有一个数据类型满足条件,就返回真
res = isinstance(lst, (list,tuple,set,str) )
print(res)
"""

 2.高阶函数

2.1 map函数

# ### 高阶函数:能够把函数当成参数传递的就是高阶函数
"""
map reduce sorted filter
"""
# map
"""
map(func,iterable)
功能:把iterable里面的数据,一个一个扔到func函数中进行处理,把处理的结果放到迭代器中,最终返回迭代器
参数:
    (1)func :内置函数 或 自定义函数
    (2)iterable: 可迭代对象 容器类型数据,range对象,迭代器
返回值:
    迭代器
"""
# 例子1: ["1","2","3","4"] => [1,2,3,4]
lst = ["1","2","3","4"]
lst2 = []
for i in lst:
    res = int(i)        
    # print(res,type(res))
    lst2.append(res)
print(lst2)

from collections import Iterator,Iterable
it = map(int,lst)
print( isinstance(it,Iterator) )
# (1)可使用next进行调用
res = next(it)
res = next(it)
res = next(it)
res = next(it)
print(res)

# (2)可使用for进行调用
it = map(int,lst)
for i in it:
    print(i)

# (3) for 配合 next 进行调用迭代器
it = map(int,lst)
for i in range(2):
    res = next(it)
    print(res)

# (4) 使用list瞬间强转成列表.
it = map(int,lst) # 重置迭代器
lst = list(it)
print(lst)


# 例子2 [1,2,3,4] [3,6,9,12]
lst = [1,2,3,4]
lst2 = []
for i  in lst:
    res = i*3
    lst2.append(res)
print(lst2)

"""
第一次把lst中的1拿出来,扔到func当中进行处理,返回3,放到迭代器中
第二次把lst中的2拿出来,扔到func当中进行处理,返回6,放到迭代器中
第三次把lst中的3拿出来,扔到func当中进行处理,返回9,放到迭代器中
第四次把lst中的4拿出来,扔到func当中进行处理,返回12,放到迭代器中
到此iterable中的数据已经没有,终止函数,返回迭代器.
"""
def func(n):
    return n * 3
it = map(func,lst)
print(list(it))

# 例子3 {97:"a",98:"b",99:"c"} ["a","b","c"] => [97,98,99]
# dic = {"a":97,"b":98,"c":99}
dic = {97:"a",98:"b",99:"c"}
dic2 = {}
res = dic.items()

print(res)
print(isinstance(res,Iterator)) # False
print(isinstance(res,Iterable)) # True
# 反转字典中的键值对
for k,v in res:
    print(k,v)
    dic2[v] = k
print(dic2)

# 同过字典的键,获取值,插入到新列表中.
print("---------")
lst = ["a","b","c"]
lst2 = []
for i in lst:
    res = dic2[i]
    lst2.append(res)
print(lst2)

# map自定义函数,需要一个参数,必须写一个返回值
def func(n):
    dic = {97:"a",98:"b",99:"c"}
    # 反转字典中的键值对
    for k,v in dic.items():
        print(k,v)
        dic2[v] = k
    print(dic2) #{'a': 97, 'b': 98, 'c': 99}
    return dic2[n]

it = map(func,["a","b","c"])
print(list(it))

2.2 reduce

# ### reduce
"""
reduce(func,iterable)
功能:计算
先从iterable拿出2个数据,放到func中进行计算,得到的结果和iterable中的第三个元素,
在扔到func中做计算,依次类推,最终返回计算结果
参数:(1)func 内置函数 或 自定义函数
(2)iterable 可迭代对象 (容器类型数据,range对象,迭代器)
返回值: 计算出来的最终结果
"""
# 方法一
# lst = [5,4,8,8] => 5488
lst = [5,4,8,8]
strvar = ''
for i in lst:
strvar += str(i)
print(strvar,type(strvar))
print(int(strvar))

# 方法二
"""
5 * 10 + 4 = 54
54 * 10 + 8 = 548
548 * 10 + 8 = 5488
"""
it = iter(lst)
res1 = next(it) # 5
res2 = next(it) # 4
res = res1 * 10 + res2
print(res)

for i in it:
res = res * 10 + i
print(res,type(res))

# 使用reduce 进行改写
print("<============>")
"""
首先把5和4扔到func当中 5* 10 + 4 = 54
然后把54和iterable中的8,这两个参数扔到func中,
54 * 10 + 8 = 548
然后把548和iterable中的最后一个8两个参数扔到func中,
548 * 10 + 8 = 5488
计算完毕返回6=5488 结束.
"""
from functools import reduce
lst = [5,4,8,8]
def func(x,y):
return x*10 + y
res = reduce(func,lst)
print(res,type(res))


# "789" => 789 在不使用int强转的前提下完成
"""
"789" => [7,8,9]
list("789") = > ['7','8','9']
list("789") = > [7,8,9]
map(int,"789") error 不让用int
"""
strvar = "789"
def func1(n):
dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
return dic[n]


def func2(x,y):
return x*10 + y

it = map(func1,strvar)
# print(list(it))
# 开始计算
res = reduce(func2,it)
print(res,type(res))

# error
# res = reduce(func2,strvar)
# print(res)

3. sorted

# ### sorted 
"""
sorted(iterable,reverse=False,key=函数)
功能:
排序
参数:
iterable 可迭代对象 (容器类型数据 range对象 迭代器)
reverse 控制正序或者倒序 reverse=True 倒序
key:可自定义排序的规则
返回值:
排序后的结果
"""
# 默认从小到大排序
lst = [88,31,-90,0]
res = sorted(lst)
print(res)

# 从大到小排序
lst = [88,31,-90,0]
res = sorted(lst,reverse=True)
print(res)

# 按照绝对值排序(使用内置函数)
lst = [-99,-2,45,1]
res = sorted(lst,key=abs)
print(res) #[1, -2, 45, -99]
"""
1 => 1
-2 => 2
45 => 45
-99 => 99
"""
"""
abs 获取一个数的绝对值
print(abs(-80.34))
print(abs(90))
"""
# 按照余数排序(使用自定义函数)
def func(n):
return n % 10
lst = (19,24,91,36)
"""
91 % 10 => 1
24 % 10 => 4
36 % 10 => 6
19 % 10 => 9
"""
res = sorted(lst,key=func)
print(lst)
print(res)

# 如果排序字符串,按照ascii编码来排序.
strvar = "cba"
res = sorted(strvar)
print(res)
"""
sort 基于原有列表进行修改
sorted 会产生一个新列表,原来的数据不动.
其余的用法一模一样.
只不过sort只能用在列表中
sorted可以用在所有容器类型数据中.
"""

4.fliter
# ### filter
"""
filter(func,iterable)
功能:过滤
在自定义的函数中,如果
return True 代表保留该数据
return False 代表舍弃该数据
参数:
1.func 自定义函数
2.iterable 可迭代对象 (容器类型数据 range对象 迭代器)
返回值:
迭代器
"""
# 1.基本写法
listvar = [24,234,23,423,4,234,1,23,12,31,231,2,3]
for i in listvar:
if i % 2 == 0:
print(i)
else:
pass

# 2.filter写法
def func(n):
if n % 2 == 0:
# 保留该数据
return True
else:
# 舍弃该数据
return False
it = filter(func,listvar)
print(list(it))

# 3.优化版
func = lambda n : True if n % 2 == 0 else False
it = filter(lambda n : True if n % 2 == 0 else False,listvar)
print(list(it))

猜你喜欢

转载自www.cnblogs.com/NGU-PX/p/11256686.html