day11-Python运维开发基础(迭代器与可迭代对象、高阶函数)
1. 迭代器与可迭代对象
# ### 迭代器
"""
迭代器: 能被next方法调用,并且不断返回下一个值的对象,是迭代器(对象) 特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据
优点:需要数据的时候,一次取一个,可以大大节省内存空间.而不是一股脑的把所有数据放进内存.
总结:
1.惰性序列,节省内存空间
2.遍历获取值得时候使用next,方向不可逆
3.迭代器可以遍历无限量大的数据
""" # 可迭代对象
"""
如果该数据成员当中含有__iter__方法,就是可迭代对象
dir 查看该数据的内部成员
"""
setvar = {"a","b","c","d"}
lst = dir(setvar)
print(lst)
res = "__iter__" in lst
print(res) for i in setvar:
print(i) # 迭代器
"""
# (1) 如何定义一个迭代器
1.iter(可迭代对象) (推荐)
2.可迭代对象.__iter__() # (2) 如何判断一个迭代器
1.内部成员中,含有__iter__ 和 __next__ 两个方法
2.from collections import Iterator,Iterable # (3) 如何调用一个迭代器
使用next方法可以调用迭代器,返回里面的内容 可迭代对象 -> 迭代器
不可直接调用 -> 可直接调用
如果是一个可迭代对象,不一定是迭代器
入股是一个迭代器,就一定是可迭代对象
""" # (1)定义一个迭代器
setvar = {"a","b","c","d"}
it = iter(setvar) # (2)判断一个迭代器
lst = dir(it)
print(lst)
# 方法一
res = "__iter__" in lst and "__next__" in lst
print(res)
# 方法二
# from 从... collections import 引入 Iterator 迭代器类型 Iterable可迭代对象类型
from collections import Iterator,Iterable
res = isinstance(it,Iterator)
print(res) # (3)调用迭代器
"""next方法 ,调用迭代器 是单项不可逆的过程,(一条路走到黑)"""
res = next(it)
res = next(it)
res = next(it)
res = next(it)
# res = next(it) error
print(res) # (4)重置迭代器
it = iter(setvar)
print( next(it) ) # (5)把range对象变成迭代器
it = range(10).__iter__()
# 判断迭代器
res1 = isinstance(it,Iterator)
res2 = isinstance(it,Iterable)
print(res1 , res2) # 获取迭代器中数据
# 方法一 next
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res) # 方法二 for
print("<===============>")
for i in it:
print(i) print("<===============>")
# 方法三 for + next
# print(next(it)) # StopIteration
it = range(10).__iter__()
for i in range(5):
res = next(it)
print(res)
迭代器与可迭代对象 示例代码
2. 高阶函数(map / reduce / sorted / filter)
# ### 高阶函数 : 能够把函数当成参数传递的就是高阶函数
"""map reduce sorted filter""" # map
"""
map(func,Iterable)
功能:
把Iterable中的值,一个一个拿出来放到func函数中进行处理,把处理的结果扔到迭代器中,最后返回迭代器
参数:
func : 自定义函数 或者 内置函数
Iterable : 可迭代对象(容器类型数据 range对象 迭代器)
返回值:
迭代器
"""
from collections import Iterator,Iterable
# ### (1) ["1","2","3","4"] => [1,2,3,4]
lst = ["","","",""]
lst_new = []
for i in lst:
print(i,type(i))
lst_new.append( int(i) )
print(lst_new) # map改写
it = map(int,lst)
res = isinstance(it,Iterator)
print(res) """
代码解析:
首先从列表里拿出第一个数据 "1" 扔到int方法中进行强转,把强转的结果扔给迭代器
然后从列表里拿出第二个数据 "2" 扔到int方法中进行强转,把强转的结果扔给迭代器
然后从列表里拿出第三个数据 "3" 扔到int方法中进行强转,把强转的结果扔给迭代器
然后从列表里拿出第四个数据 "4" 扔到int方法中进行强转,把强转的结果扔给迭代器 最后返回迭代器
""" # (1)next获取迭代器中的数据
res= next(it)
print(res)
res= next(it)
print(res)
res= next(it)
print(res)
res= next(it)
print(res)
# res= next(it) error # StopIteration
# print(res) print("<===========>")
# (2)for 循环遍历
it = map(int,lst)
for i in it :
print(i) # (3)list 强制转换
it = map(int,lst)
lst = list(it)
print(lst) # ### (2) [1,2,3,4] => [1,4,9,16]
lst = [1,2,3,4]
lst_new = []
for i in lst:
res = i ** 2
lst_new.append(res)
print(lst_new) # map改写
def func(n):
return n ** 2 # 方法一
"""
it = map(func,lst)
# list强转迭代器 变成列表
lst = list(it)
print(lst)
"""
# 方法二
it = map(lambda n : n ** 2 , lst)
lst = list(it)
print(lst) # ### {97:"a",98:"b",99:"c"} => 给你["a","b","c"] => [97,98,99]
# 原型
# dic = {"a":97,"b":98,"c":99}
# res = dic["a"]
# print(res) # 反转字典
dic = {97:"a",98:"b",99:"c"}
dic_new = {}
# 把字典的键和值对换
for k,v in dic.items():
print(k,v)
dic_new[v] = k
print(dic_new)
# 通过字典拿到对应的值,插入到列表中
lst = ["a","b","c"]
lst_new = []
for i in lst:
res = dic_new[i]
lst_new.append(res)
print(lst_new) # 用map进行改写
lst = ["a","b","c"]
def func(n):
dic = {97:"a",98:"b",99:"c"}
dic_new = {}
for k,v in dic.items():
dic_new[v] = k
# {'a': 97, 'b': 98, 'c': 99}
return dic_new[n] it = map(func,lst)
lst = list(it)
print(lst)
map高阶函数 示例代码
# ### reduce
"""
reduce(func,Iterable)
功能:
从iterable中一次性拿出2个数据,扔到func函数进行运算,
然后将运算的结果和Iterable中的第三个数据在放到func中进行运算
以此类推...
最后返回计算的结果
参数:
func : 自定义函数 或者 内置函数
iterable : 可迭代对象(容器类型数据 range对象 迭代器)
返回值:
最后计算的结果
"""
# (1) [5,4,8,8] => 5488
lst = [5,4,8,8]
# 方法一 .字符串的拼接
strvar = ""
for i in lst:
strvar += str(i)
print(strvar,type(strvar))
res = int(strvar)
print(res,type(res)) # 方法二 用算数来做
"""
5 4 8 8
5*10 + 4 = 54
54 * 10 + 8 = 548
548 * 10 + 8 = 5488
"""
lst = [5,4,8,8]
# (1) 变成迭代器
it = iter(lst) # (2) 获取前两个元素
num1 = next(it)
num2 = next(it)
total = num1 * 10 + num2
print(total) # (3) 计算剩余的数据
for i in it:
total = total * 10 + i
print(total,type(total)) # reduce 改写
lst = [5,4,8,8]
from functools import reduce
def func(x,y):
return x*10+y
print(func(5,4)) res = reduce(func,lst)
print(res,type(res))
"""
拿出5 和 4 两个元素 扔到自定义的func函数中
x 接受 5 y 接受 4
return 5*10 + 4 => return 54 然后拿出54 和 8 两个元素 扔到自定义的func函数中
x 接受54 y 接受 8
return 54 * 10 + 8 => return 548 然后拿出548 和 8 两个元素 扔到自定义的func函数中
x 接受548 y 接受 8
return 548 * 10 + 8 => return 5488 返回5488 结束
""" # "678" => 整型 678 (不让使用int)
def func(x,y):
return x*10+y def func2(n):
dic = {"":0,"":1,"":2,"":3,"":4,"":5,"":6,"":7,"":8,"":9}
return dic[n]
strvar = ""
it = map(func2,strvar) res = reduce(func,it)
print(res,type(res))
reduce高阶函数 示例代码
# ### sorted
"""
sorted(iterable,key=函数,reverse=False)
功能:排序
参数:
iterable(容器类型数据,range对象,迭代器)
key = 函数 自定义 或者 内置函数
reverse = False 从小到大排序 reverse = True 从大到小排序
返回值:
排序后的结果
""" # (1) 默认从小到大排序
tup = (1,15,-18,12,0)
lst = sorted(tup)
print(lst) # (2) 从大到小排序
tup = (1,15,-18,12,0)
lst = sorted(tup,reverse=True)
print(lst) # (3) 使用绝对值进行排序
# res = abs(10)
# print(res)
tup = (1,15,-18,12,0)
lst = sorted(tup,key=abs)
print(lst)
"""
0 => abs(0) => 0
1 => abs(1) => 1
12 => abs(12) => 12
15 => abs(15) => 15
-18 => abs(-18) => 18
""" # (4) 使用自定义函数进行排序 -> 按照余数大小排序
tup = (19,23,32,35,67)
def func(n):
return n % 10
lst = sorted(tup,key=func)
print(lst)
"""
32 func => 2
23 func => 3
35 func => 5
67 func => 7
19 func => 9
""" # 字符串排序
strvar = "zfacd"
lst = sorted(strvar)
print(lst) # 集合排序
setvar = {"z","f","a","c","d"}
lst = sorted(setvar)
print(lst) """
总结:
sort 只能针对列表进行排序,直接修改原有列表
sorted 容器类型数据都可以排序,产生一个新的副本,数据类型是列表
"""
sorted高阶函数 示例代码
# ### filter
"""
filter(func,iterable)
功能: 过滤
在自定义函数中:
如果返回True , 代表保留该数据
如果返回False , 代表舍弃该数据
参数:
func 自定义函数
iterable 可迭代对象(容器类型数据 range对象 迭代器)
返回值:
迭代器
"""
from collections import Iterator lst = [1,2,3,4,5,6,7,8]
lst_new = []
for i in lst:
if i % 2 == 0:
lst_new.append(i) print(lst_new) # 用filter改写
def func(n):
if n % 2 == 0:
return True
else:
return False
it = filter(func,lst)
res = isinstance(it,Iterator)
print(res) # next 获取迭代器中的数据
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res) # for 获取迭代器中的数据
it = filter(func,lst)
for i in it:
print(i) # for + next 获取迭代器中的数据
it = filter(func,lst)
for i in range(3):
res = next(it)
print(res) # list 强转迭代器变成列表
it = filter(func,lst)
lst = list(it)
print(lst) # 匿名函数优化
it = filter(lambda n : True if n % 2 == 0 else False , lst)
for i in it:
print(i)
filter高阶函数 示例代码
day11
day11-Python运维开发基础(迭代器与可迭代对象、高阶函数)的更多相关文章
- Python运维开发基础07-文件基础【转】
一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...
- Python运维开发基础10-函数基础【转】
一,函数的非固定参数 1.1 默认参数 在定义形参的时候,提前给形参赋一个固定的值. #代码演示: def test(x,y=2): #形参里有一个默认参数 print (x) print (y) t ...
- Python运维开发基础09-函数基础【转】
上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...
- Python运维开发基础08-文件基础【转】
一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...
- Python运维开发基础06-语法基础【转】
上节作业回顾 (讲解+温习120分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 添加商家入口和用户入口并实现物 ...
- Python运维开发基础05-语法基础【转】
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...
- Python运维开发基础04-语法基础【转】
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现“简单的购物车程 ...
- Python运维开发基础03-语法基础 【转】
上节作业回顾(讲解+温习60分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen #只用变量和字符串+循环实现“用户登陆 ...
- Python运维开发基础02-语法基础【转】
上节作业回顾(讲解+温习60分钟) #!/bin/bash #user login User="yunjisuan" Passwd="666666" User2 ...
随机推荐
- BFS(广度优先搜索遍历保存全局状态,华容道翻版做法)--08--DFS--蓝桥杯青蛙跳杯子
题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...
- PyQt5控件支持拖拽方法
让控件支持拖拽动作A.setDragEnable(True) 设置A可以拖动B.setAcceptDrops(True) 设置B可以接受拖动B需要满足两个事件1.dragEnterEvent 将A拖到 ...
- ubuntu 虚拟机添加多个站点
我们安装好lamp环境,然后开始操作,比如一个站点叫test.ubuntu1.com,一个叫test.ubuntu2.com 1.修改hosts文件,路径/etc/hosts sudo vim /et ...
- 有未经处理的异常: 0xC00000FD: Stack overflow
将“项目属性.链接器.系统.堆栈保留大小”设大一点比如16000000 这是我在网上找到的答案,很好的解决了我的问题,忘了是哪位大神了,总之,向大神致敬
- CRS-1硬件维护
一.CRS-1硬件介绍CRS-1 路由器是Cisco 推出的新的大容量骨干路由器,是一个支持多机箱扩展的路由系统.其设计容量可以扩展至72 个线卡机箱.8 个矩阵机箱,总交换容量达到92Tbps,具有 ...
- [ DLPytorch ] 线性回归&Softmax与分类模型&多层感知机
线性回归 基础知识 实现过程 学习笔记 批量读取 torch_data = Data.TensorDataset(features, labels) dataset = Data.DataLoader ...
- NSObject类的API介绍
这篇文章围绕的对象就是NSObject.h文件,对声明文件中的属性.方法进行必要的“翻译”. 该文件大致由两部分组成:NSObject协议和NSObject类. (一)NSObject协议 - (BO ...
- Oracle Parallel使用方法
一. 并行查询 并行查询允许将一个sql select语句划分为多个较小的查询,每个部分的查询并发地运行,然后将各个部分的结果组合起来,提供最终的结果,多用于全表扫描,索引全扫描等,大表的扫描和连接. ...
- Activiti工作流学习笔记一
Activiti工作流 一:Activiti第一天 1:工作流的概念 说明: 假设:这两张图就是华谊兄弟的请假流程图 图的组成部分: 人物:范冰冰冯小刚王中军 事件(动作):请假.批准.不批准 工作流 ...
- JS闭包(2)
利用闭包的特点,我们可以在封装自己的模块的时候只向外暴露我们模块中的数据,而不让其修改. 1.第一中封装的方式,新建一个myModule.js文件,这个模块的作用是对外部提供明天和后天的天气. 在my ...