python开发 day15 迭代器 生成器

Day15 笔记

迭代器 Itreator

  迭代器是访问可迭代对象的工具(对象)

什么是迭代器

迭代器是只用iterobj) 函数返回的对象(示例)

迭代器可以用nextit) 函数获取可迭代对象的数据

迭代器相关函数

Iteriterable)  从可迭代对象中返回一个迭代器,

Iteralble        必须是一个能提供一个迭代器的对象

Nextiterable) 从迭代器iterable 自中获取下一个记录,如果无法获取下一条记录,则触发stopIteretion 异常通知

说明:

迭代器只能往前,不能后退

示例:

L = [2357]

it = iterL)  #让可迭代对象L提供一个迭代器

nextit#2

nextit#3

nextit#5

nextit#7

nextit#StopIteration 异常通知

 

 

It = iterrange1,10,3))

nextit#1

nextit#4

nextit#7

nextit#StopIteration 异常通知

 

示例:

whine 语句遍历列表L中的全部元素

L = [2357]

# L = [2,3,5,7]

# it = iter(L) #先拿到用于访问L的迭代器

# while True:

#     try:

#         x = next(it)

#         print(x)

#     except StopIteration:

#         break

 

 

练习:

有一个集合:

xiyou = {'唐僧','悟空','八戒','沙僧'}

for语句来遍历所有元素如下:

    for x in xiyou:

        print(x)

    else:

        print("遍历结束")

   请将上面的for语句改写为whint语句及迭代器实现

 

解:

# xiyou = {'唐僧','悟空','八戒','沙僧'}

# it = iter(xiyou)

# while True:

#     try:

#         x = next(it)

#         print(x)

#     except StopIteration:

#         print("遍历结束")

#         break

 

 

生成器 Generator 

  什么是生成器:

生成器是能够动态提供数据的对象,生成器也是可迭代对象

 

 生成器有两种:

1. 生成器函数

2. 生成器表达式

 

生成器函数定义:

含有yield 语句的函数是生成器函数,此函数被调用将返回一个生成器对象

注:yield 翻译为:(产生或生成)

 

 

yield  语句

语法:

yield  表达式

说明:

yield 用于def 函数中,目的是将此函数作为生成器函数使用

yield 用来生成数据,供迭代器的nenxit)函数使用

示例:

def myyield():

    '''此函数因为含有yield语句,所以是生成器函数'''

    print("即将生成1")

    yield 1

    yield 3

    yield 5

    yield 7

gen = myyield()

#绑定的是生成器,生成器是可迭代对象

it = iter(gen)

 

x = next(it)

#next(it)开始执行生成器函数的语句,直到遇见yleid语句为止

print(x)

说明:

1、生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象

2、生成器函数调用 return 会触发一个stopIteration 异常

 

  用生成器生成一系列0开始的整数:

  示例

def myinteger(n):

    i = 0

    while i < n:

        yield i

        i += 1

 

for x in myinteger(4):

    print(x)        

 

 

练习:

1、写一个生成器函数myeven(start,Stop): #不包含stop

用来生成从start开始,到stop结束区间内的一系列偶数

def myeven(start,Stop):

    x = start

    while x < Stop:

        if x % 2 == 0:

            yield x

        x += 1

 

it = iter(myeven(5,10))

print(next(it))  #6

print(next(it))  #8

evens = list(myeven(10,20))

print(evens)  #[10,12,14,16,18]

for x in myeven(21,30):

    print(x)  #22 24 26 28

生成器表达式:

语法:

(表达式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

 

  迭代工具函数:

作用:

生成一个个性化的可迭代对象

函数名                   

Zipiter1iter2iter3…)

      函数说明

返回一个zip 对象,此对象用于生成一个元组,此元组中的元素分别有iter1iter2,可迭代对象中的元组构成(元组个数由最小的可迭代对象决定)

函数名

Enumerateiterablestart = 0

函数说明

生成带索引的枚举对象,返回的迭代类型为索引-值对(index-value)对,默认索引从零开始,也也用start 指定

示例:

 numbers = [10086,10000,10010,95588]

names =['中国移动','中国电信','中国联通']

for t in zip(numbers,names):

print(t)

结果:

(10086, '中国移动')

(10000, '中国电信')

(10010, '中国联通')

 

示例  numbers = [10086,10000,10010,95588]

names =['中国移动','中国电信','中国联通']

for t in zip(numbers,names):

    print(t)

 

for a,n in zip(names,numbers):

    print(a,"客服号码是:", n)

结果:

中国移动 客服号码是: 10086

中国电信 客服号码是: 10000

中国联通 客服号码是: 10010

 

 

练习:

    写一个程序,读入任意行文字,当输入空行时结束输入

        打印带有行号的输入结果

         如:

            请输入:hello

            请输入:world

            请输入:<回车>

        输入如下:

            第1行 hello

            2行  world

            第3行 <回车>

 

解:

# L = []

# while True:

#     dr = input("请输入文字:" )

#     if not dr:

#         break

#     else:

#         L.append(dr)

# for t in enumerate(L,1):

#     print('%d行:%s'%t)

  第二种方法  

# L = []

# def read_lines():

#     while True:

#         dr = input("请输入文字:" )

#         if not dr:

#             break

#         L.append(dr)

#     return L

# read_lines()

# print(L)

# for t in enumerate(L,1):

#     print('%d行:%s'%t)

 

 

 

 

  字节串 bytes(也叫字节序列)

 作用:

存储以字节为单位的数据

 说明:

字节串是不可变的字节序列

字节是0~255的整数

 

创建空字节串的字面值

b = b '''     b绑定空字符串

b = b ""

b = b ''''''

b = b """"""

 

创建非空字节串的字面值:

b = b 'ABCD'

b = b '\x41\x42'

 

 字节串的构造函数bytes

bytes()                      生成一个字的字节串,等同于b

bytes(整数可迭代对象)        用可迭代对象初始化一个字符串

bytes(整数n)  n个值为0的字节串

bytes(字节串,encoding='utf-8') 用字符串的转换编码生成一个字节

示例:

b = bytes()

b = bytes(range(0,255))

b = bytes(10)

b = bytes('您好')

 

 

字节串的运算:

 +  +=  *  *=

<  <=  >  >=  ==  !=

 in   not  in

索引和切片

函数:

Lenxmaxxminxsumxanyxallx

 

Bytes str 的区别:

Bytes 储存字节(0~255

Str 储存unicode 字符(0~65535或更大)

 

Str bytes 转换

编码(encode

  Str-----------------à bytes

  b = s.encode(encoding=’utf-8’)

 

解码(decode

Bytes----------à str

   S = b. encode(encoding=’utf-8’)

 

字节数组 bytearray

可变的字节序列

创建函数bytearray

bytearray()       创建字节数组

bytearray(可迭代对象) 同bytes(可迭代对象)

bytearray(整数n   …

bytearray(字符串,encoding=ntf-8’)

 

运算操作:

+  +=  *  *=

比较运算:

<  <=  >  >=  ==  !=

索引:

Index/切片 slice

(字节数组支持索引和切片赋值,规则同列表的索引和切片赋值规则)

 

 

字节数组的方法:

详见:

Heipbytearray

 

 

练习:

输入一个字符串用s绑定

:

  1. 写一个生成器函数myodd(x) 来生成一系列奇数

    :

      myodd(10) 可以生成1, 3, 5, 7, 9

 

  2. 写一个生成器函数primes(n) 来成生成n以内的所有素数

     1) 打印100 以内的全部素数

     2) 打印100 以内的全部素数的和

  3. 写一个生成器函数 myrange([start, ]stop[, step]) 来生成一系列整数

     要求:

       myrange功能与range功能完全相同

       不允许调用range(函数)

     用自己写的myrange结合生器表达式求1~10内奇数的平方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值