Python3之内建模块itertools
python的内建模块itertools提供了非常有用的用于操作迭代对象的函数
首先,我们看看itertools提供的几个无限迭代器
>>> import itertools
>>> natuals=itertools.count(1)
>>> for n in natuals:
... print(n)
...
1
2
3
...
因为count()会创建一个无限迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+c退出
cycle()
会把传入的一个序列无限重复下去:
>>> cs=itertools.cycle('abc')
>>> for c in cs:
... print(c)
...
a
b
c
a
b
c
...
同样停不下来
repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数
>>> ns=itertools.repeat('A',3)
>>> for n in ns:
... print(n)
...
A
A
A
无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。
无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据调校判断来截取出一个有限序列
>>> natuals=itertools.count(1)
>>> ns=itertools.takewhile(lambda x:x<=10,natuals)
>>> list(ns)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
itertools
提供的几个迭代器操作函数更加有用:
chain()
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器
>>> for c in itertools.chain('ABC','XYZ'):
... print(c)
...
A
B
C
X
Y
Z
groupby()
groupby()
把迭代器中相邻的重复元素挑出来放在一起:
>>> for key,group in itertools.groupby('AAABBBCCAAA'):
... print(key,list(group))
...
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']
实际上挑选规则是通过函数完成的,只要作用于函数的的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数的返回值作为组的key。如果我们要忽略大小写分组,就可以让元素'A'和‘a'都返回相同的key
>>> for key,group in itertools.groupby('AaaBBbcCAAa',lambda c:c.upper()):
... print(key,list(group))
...
A ['A', 'a', 'a']
B ['B', 'B', 'b']
C ['c', 'C']
A ['A', 'A', 'a']
练习
计算圆周率可以根据公式
#step1 创建一个奇数序列 1,3,5,7,9,...
#step2 取该序列的前N项 1,3,5,7,9,。。。 2*N-1
#step添加正负符号并用4除
pi.py
import itertools
def pi(N):
# step 1: 创建一个奇数序列: 1, 3, 5, 7, 9, ...
odd = itertools.count(1,2)
# step 2: 取该序列的前N项: 1, 3, 5, 7, 9, ..., 2*N-1.
odd_n = itertools.takewhile(lambda x: x<2*N, odd)
# step 3: 添加正负符号并用4除: 4/1, -4/3, 4/5, -4/7, 4/9, ...
result = map(lambda x: 4/x if x%4==1 else -4/x, odd_n)
# step 4: 求和:
return sum(result) print(pi(10))
print(pi(20))
print(pi(100))
print(pi(9999999999))
Python3之内建模块itertools的更多相关文章
- Python3之内建模块collections
collections是python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不可变集合,例如,一个点的二维坐标可以表示成 >>> ...
- Python3之内建模块datetime
datetime datetime是python处理日期和时间的标准库 获取当前日期和时间 >>> from datetime import datetime #获取当前的datet ...
- Python3之内建模块hashlib
摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串( ...
- Python3之内建模块base64
Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的 ...
- Python3 内建模块 hashlib、itertools、HTMLParser、urllib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...
- 四十六 常用内建模块 itertools
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertools提供的几个“无限”迭代器: >>> import itertools ...
- Python3 内建模块 datetime/collections/base64/struct
datetime 我们先看如何获取当前日期和时间: >>> from datetime import datetime >>> now = datetime.now ...
- python基础之内建模块base64
一.Base64概念 什么是Base64? 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base6 ...
- python常用内建模块 collections,bs64,struct,hashlib,itertools,contextlib,xml
# 2 collections 是Python内建的一个集合模块,提供了许多有用的集合类. # 2.1 namedtuple #tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: p ...
随机推荐
- Kubernetes 学习3 kubeadm初始化k8s集群
一.k8s集群 1.k8s整体架构图 2.k8s网络架构图 二.基于kubeadm安装k8s步骤 1.master,nodes:安装kubelet,kubeadm,docker 2.master: k ...
- 1.6synchronized代码块
1.synchronized可以使用任意的Object进行加锁,用法比较灵活 ============================================================= ...
- fft相关的复习
任意长度卷积 CZT 就是一波推导 \[ \begin{aligned} b_i &= \sum_{j=0}^{n-1} \omega^{ij}a_j \\ &= \sum_{j=0} ...
- 深入基础(二)练习题,REPL交互解析器
NPM 关于npm命令其实不算很多很多,起码比dos命令少不少呢废话少说npm命令大全and各个命令用处持续更新中..来自园子内另外一位大神~:http://www.cnblogs.com/P ...
- AtCoder Grand Contest 019 题解
传送门 \(A\) 咕咕 int a,b,c,d,n,t; int main(){ scanf("%d%d%d%d%d",&a,&b,&c,&d,& ...
- We found potential security vulnerabilities in your dependencies. Only the owner of this reposito...
删除package-lock.json并同步到git 定义的依赖项./package-lock.json具有已知的安全漏洞 找到一个叫做.gitignore,把package-lock.json贴在这 ...
- cometoj---contest#3 棋盘
棋盘:(状压dp) 传送门:https://www.cometoj.com/contest/38/problem/B?problem_id=1535 题目描述 小猫有一个 2×N 的棋盘,每一个格子放 ...
- ICEM-hollow
原视频下载地址: http://yunpan.cn/cumt7U7ufYfA3 访问密码 a46d
- VirtualAlloc加载shellcode免杀一点记录
一个很好的学习网站 推荐一下: https://docs.microsoft.com/zh-cn/windows/win32/api/ 0x01 VirtualAlloc VirtualAlloc: ...
- scala_基础
笔记前言:本笔记为scala的入门基础和scala基础使用.主要参考为书籍和推荐较高的博客.主要目的为供个人总结学习. 所有来自网络参考内容不一一列出. 一.面向过程 1.变量体 val 标识符:声 ...