Python全栈工程师(迭代器、字节串)
Python人工智能从入门到精通
迭代器 Iterator:
用<>括号表示的一定是对象
什么是迭代器?
迭代器是访问可迭代对象的工具
迭代器是指用iter(obj) 函数返回的对象(实例)
迭代器可以用next(it) 函数获取可迭代对象的数据
迭代器函数iter和next
iter(iterable) 从可迭代对象中返回一个迭代器,iterable 必须是能提供一个迭代器的对象
next(iterator) 从迭代器iterator中获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常
说明:
迭代器只能向前取值,不会后退
用iter函数可以返回一个可迭代对象的迭代器
作用:
迭代器对象能用next函数获取下一个元素.
示例:
L = [2, 3, 5, 7]
it = iter(L) # 用L对象返回能访问L的迭代器, it绑定迭代器
next(it) # 2
next(it) # 3
next(it) # 5
next(it) # 7
next(it) # StopIteration 通知(没有数据)
it = iter(range(1, 10, 30))
next(it) # 1
next(it) # 4
next(it) # 7
next(it) # StopIteration
用迭代器访问可迭代对象:
L = [2, 3, 5, 7]
for x in L:
print(x)
else:
print('循环结束') it = iter(L) # 从L中获取一个迭代器
while True:
try:
x = next(it)
print(x)
except StopIteration:
print("循环结束")
break
生成器 Generator (python 2.5及之后)
什么是生成器?
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)
动态就是现用现生成数据
生成器有两种:
1. 生成器函数
2. 生成器表达式
生成器函数的定义
含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
yield 翻译为(产生或生成)
yield 语句
语法:
yield 表达式
说明:
yield 用于 def 函数中,目的是将此函数作用生成器函数使用
yield 用来生成数据,供迭代器的next(it) 函数使用
yield 单步生成数据 在函数内可以一个或多少
实例:
# 此示例示意用生成器函数生成一定范围内的自然数
def myinteger(n):
i = 0 # 自然数从0开始
while i < n:
yield i
i += 1 for x in myinteger(3):
print(x)
生成器函数说明:
生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象
在生成器函数调用return 会触发一个StopIteration异常
生成器表达式:
语法:
(表达式 for 变量 in 可迭代对象 [if 真值表达式 ])
说明:
if 子句可以省略
作用:
用推导式的形式创建一个新的生成器
示例:
gen = (x ** 2 for x in range(1, 5))
it = iter(gen)
next(it) # 1
next(it) # 4
next(it) # 9
next(it) # 16
next(it) # StopIteration
迭代工具函数
迭代工具函数的作用是生成一个个性化的可迭代对象
函数:
zip(iter1[, iter2[, ...]]) 返回一个zip对象,此对象用于生成元组,此元组的个数由最小的可迭代对象决定
enumerate(iterable[, start]) 生成带索引的枚举对象,返回迭代类型为索引-值对(index-value对),默认索引从零开始,也可以用start指定
示例:
numbers = [10086, 10000, 10010, 9558]
names = ['中国移动', '中国电信', '中国联通'] for t in zip(numbers, names):
print(t) for x, y in zip(numbers, names):
print(y, '的客服电话是:', x) x, y = (10086, '中国移动') # 序列赋值
zip函数的实现示例2:
def myzip(iter1, iter2):
it1 = iter(iter1) # 拿出一个迭代器
it2 = iter(iter2)
while True:
a = next(it1)
b = next(it2)
yield (a, b)
for t in myzip(numbers, names): #能实现与zip同样的功能
print(t)
enumerate 示例:
names = ['中国移动', '中国电信', '中国联通']
for t in enumerate(names):
print(t) enumerate 实现方法示意:
def myenum(iterable):
it = iter(iterable)
i = 0
while True:
a = next(it)
yield (i, a)
i += 1
字节串和字节数组
字节串bytes (也叫字节序列)
作用:
存储以字节为单位的数据
字节串是不可变的字节序列
字节:
字节是由8个位(bit)组成的数据单位,是计算机进行数据管理的单位
字节是用 0 ~ 255 范围内的整数表示的
创建空字节串的字面值
B = b''
B = b""
B = b''''''
B = b""""""
创建非空字节串的字面值
B = b'ABCD'
B = b"ABCD"
B = b'\x41\x42'
字节串的构造函数 bytes
bytes() 生成一个空的字节串 等同于 b''
bytes(整数可迭代对象) # 用可迭代对象初始化一个字节串
bytes(整数n) 生成n个值为0的字节串
bytes(字符串, encoding='utf-8') 用字符串转为编码生成一个字节串
示例:
b = bytes() # b = b''
b = bytes(range(65, 69)) # b = b'ABCD'
b = bytes(5) # b = b'\x00\x00\x00\x00\x00'
b = bytes('abc中文') # b=b'ABC\xe4\xb8\xad\xe6\x96\x87'
bytes 的运算:
+ += * *=
< <= > >= == !=
in / not in
索引和切片
len(x)
max(x)
min(x)
sum(x)
any(x)
all(x)
bytes 和 str 的区别:
bytes 存储字节( 通常值在 range(0, 256))
str 存储unicode字符( 通常值在0~65535)
bytes 与 str 的转换
编码(encode)
str ------------> bytes
b = s.encode(encoding='utf-8')
解码(decode)
bytes ----------> str
s = b.decode(encoding='utf-8')
字节数组 bytearray
可变的字节序列
字节数组的构造函数: bytearray
bytearray() 创建空的字节数组
bytearray(整数) 用可迭代对象初始化一个字节数组
bytearray(整型可迭代对象) 生成n个值为0的字节数组
bytearray(字符串, encoding='utf-8') 用字符串的转换编码生成一个字节数组
bytearray 的运算:
+ += * *=
< <= > >= == !=
in / not in
索引和切片
(字节数组支持索引和切片的赋值操作,规则同列表的索引和切片赋值规则)
例:
ba = bytearray(b'aBCDEfG')
ba[0] = 65
ba[-2] = 70
bytearray的方法:
BA.clear() 清空
BA.append(n) 追加一个字节(n为0~255的整数)
BA.remove(value) 删除第一个出现的字节,如果没有出现,则触发ValueError错误
BA.reverse() 字节顺序反转
BA.decode(encoding='utf-8') # 解码为字符串
BA.find(sub[, start[,end]]) # 查找 sub
练习:
有一个集合:
s = {'唐僧', '悟空', '八戒', '沙僧'}
用 for语句来遍历所有元素如下:
for x in s:
print(x)
else:
print('遍历结束')
请将上面的for语句改写为 用while语句和迭代器实现
练习:
写一个生成器函数 myeven(start, stop)
此函数用来生成从 start开始到stop结束(不包含)区间内的一系列偶数
def myeven(start, stop):
....
evens = list(myeven(10, 20))
print(evens) # [10, 12, 14, 16, 18]
for x in myeven(21, 30):
print(x) # 22, 24, 26, 28
L = [x**2 for x in myeven(3, 10)]
print(L) # 16 36 64
练习:
已知有一个列表L
L = [2, 3, 5, 7]
用生成器表达式从此列表中拿到数,生成 列表中数据的平方
gen = ...... # 此处用生成器表达式实现
L2 = list(gen) # L2 = [4, 9, 25, 49]
练习:
写一个程序,读入任意行的文字,当输入空行时结束输入
打印带有行号的输入结果:
如:
请输入: hello<回车>
请输入: world<回车>
请输入: tarena<回车>
请输入: <回车> # 直接回车结束输入
输出如下:
第1行: hello
第2行: world
第3行: tarena
练习:
写一个程序,从键盘输入一段字符串存入s变量
1. 将此字符串转为字节串用变量b绑定,并打印出b
2. 打印字符串s的长度和字节串b的长度
3. 将b字节串再转换为字符串用变量s2 绑定,判断 s2 和 s是否相同?
s = input("please input string:")
b = s.encode("utf-8")
print(s)
print(b)
print(len(s))
print(len(b))
s2 = b.decode("utf-8")
if s2 == s:
print("相等")

练习:
1. 写一个生成器函数primes生成素数,
此生成器函数为 primes(begin, end)
如: [x for x in primes(10, 20)] 将得到列表
[11, 13, 17, 19]
答案:
def get_ss(x):
if x <= 0:
return False
for i in range(2, x):
if x % i == 0:
return False
return True def primes(begin, end):
if begin <= 2or end <= 2:
pass
for x in range(begin, end):
if get_ss(x):
yield x
L = [x for x in primes(10, 20)] print(L)

2. 写一个生成器函数,生成斐波那契数列的前n个数
1 1 2 3 5 8 13
def fibonacci(n):
...
yield...
1) 输出前20个数:
for x in fibonacci(20):
print(x)
2) 打印前40个数的和:
print(sum(fibonacci(40)))
答案:
def fibonacci(n):
L = [1, 1]
for x in range(n):
s = L[x] + L[x + 1]
L.append(s)
return L
print(fibonacci(20))
print(sum(fibonacci(40)))

3. 写 程序打印杨辉三角(只打印6层)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
答案:
def yh_sj():
L = [1]
while True:
yield L
L.append(0)
L = [L[x - 1] + L[x] for x in range(len(L))] def lst():
i = 0
for x in yh_sj():
print(str(x).center(50))
if i == 10:
break
i += 1

思考:
L = [2, 3, 5, 7]
L2 = [x ** 2 for x in L] # 列表推导式
it = iter(L2)
print(next(it)) # 4
L[1] = 10
print(next(it)) # 9
L = [2, 3, 5, 7]
G3 = (x ** 2 for x in L) # 生成器表达式
it = iter(G3)
print(next(it)) # 4
L[1] = 10
print(next(it)) # 100
生成器是动态的现用现去 跟着数据变化所变化
Python全栈工程师(迭代器、字节串)的更多相关文章
- Python全栈工程师(递归函数、闭包)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 函数式编程: 是指用一系列函数解决问题 每一个函数完成细 ...
- Python全栈工程师(装饰器、模块)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 装饰器 decorators(专业提高篇) 装饰 ...
- Python全栈工程师(Python3 所有基础内容 0-0)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python一个月的基础语法 基本就到这咯 接下来是数据 ...
- Python全栈工程师(Python3 所有基础内容 0-0)
转发:https://www.cnblogs.com/ParisGabriel/p/9388030.html statements 语句print 输出quit() 退出exit() 退出ct ...
- Python全栈工程师(每周总结:3)
ParisGabriel 每天坚持 一天一篇 点个订阅吧 灰常感谢 当个死 ...
- Python全栈工程师 (exercises)
# 1:给定一个数,判断他是正数,负数,还是0 a = int(input("请输入一该个整数")) if a == 0: print(a, "是0") eli ...
- Python全栈工程师(每周总结:2)
ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订 ...
- 【目录】python全栈工程师
第一阶段:Python 语言核心编程1. Python核心 -- 2048 游戏核心算法2. 面向对象 -- 天龙八部游戏技能系统3. Python高级 -- 集成操作框架项目:2048游 ...
- Python全栈工程师(文件操作、编码)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 最近简直要死了 发烧感冒 喉咙痛..... ...
随机推荐
- Top K问题-BFPRT算法、Parition算法
BFPRT算法原理 在BFPTR算法中,仅仅是改变了快速排序Partion中的pivot值的选取,在快速排序中,我们始终选择第一个元素或者最后一个元素作为pivot,而在BFPTR算法中,每次选择五分 ...
- vue中css动画原理
显示原理: <transition name='fade'> <div v-if='show'>hello world</div> </transition& ...
- 你不得不掌握的thinkphp5
thinkphp官网在去年的时候发布了tp的颠覆版本thinkphp5,tp5确实比之前的版本好用了很多,增加了很多的一些特性,它采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖, ...
- 共变导数(Covariant Derivative)
原文链接 导数是指某一点的导数表示了某点上指定函数的变化率. 比如,要确定某物体的速度在某时刻的加速度,就取时间轴上下一时刻的一个微小增量,然后考察速度的增量和时间增量的比值.如果这个比值比较大,说明 ...
- java设计模式——桥接模式
一. 定义与类型 定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承 类型:结构性. 二. 使用场景 (1) 抽象和具体实现之间增加更多的灵 ...
- ASP.NET中刷新分页
1,第一次全部把数据加载到内存中,然后再做分页,性能差,不推荐. 2,GridView自带分页 3,AspNetPager分页控件 这个是第三分控件需要下载,很好用 4,自己写分页 前三种就不介绍如 ...
- esdoc 自动生成接口文档介绍
原文地址:https://www.xingkongbj.com/blog/esdoc/creat-esdoc.html 官网 ESDoc:https://esdoc.org/ JSDoc:http:/ ...
- git分布式版本控制系统常用的操作
Git是一个版本控制系统,用来追踪计算机文件的变化的工具,也是一个供多人使用的协同工具.它是一个分布式的版本控制系统,本文将简单介绍如何使用.简单来说,就是你要和你的伙伴一起完成一项任务,但是你们要互 ...
- 如何在nlp问题中定义自己的数据集
我之前大致写了一篇在pytorch中如何自己定义数据集合,在这里如何自定义数据集 不过这个例子使用的是image,也就是图像.如果我们用到的是文本呢,处理的是NLP问题呢? 在解决这个问题的时候,我在 ...
- POJ:3104-Drying(神奇的二分)
Drying Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 20586 Accepted: 5186 Description I ...