Python中的迭代器,生成器(yield语句),正则表达式,re模块

目录

一.定义一个生成器:

二.模拟range函数的功能,自己建立一个range:MyRange

三.re模块中函数的使用(正则表达式)


一.定义一个生成器:

要求:生成1-10的数字,使用next(generator)方法获取1-10,使用for循环获取.

首先我们得知道生成器函数,生成器函数就是含有yield语句的函数

而调用生成器函数的对象就是生成器

下面这个例子中,我们定义了一个叫generator的生成器函数(因为含有yield语句),最终的目的为了实现访问一次  输出一个元素,并非一下输出1-10。生成器是用来控制生成器函数的,只有在调用了生成器中的某个方法时(gen.__next__或send(value),生成器函数才开始执行。当函数执行到yield语句时,函数暂时挂起(相当于按一次暂停键)。只有当下一次生成器的某个方法执行时,函数才可以继续执行(从上次挂起的地方开始执行)。

这个例子中前面五次输出的元素,我们使用next(gen)的方法获取;后面五个元素,我们使用for循环获取。因为gen是一个生成器也是一个迭代器,更是一个可迭代对象。故我们也可以使用for循环获取元素。

def generator():        # 生成器函数
    for i in range(1, 11):
        yield i


gen = generator()     # gen为生成器
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
for j in gen:          #gen本身为一个迭代器,可以使用for循环访问
    print(j)

#执行结果
1
2
3
4
5
6
7
8
9
10

进程已结束,退出代码0

二.模拟range函数的功能,自己建立一个range:MyRange

要求:实现和range函数一样的功能

class MyRange:
    def __init__(self, start, stop=None, step=1):
        if step == 0:
            raise ValueError('range() arg 3 must not be zero')
        elif stop is None:
            start, stop = 0, start
        elif step > 0:
            self.__length = max(0, ((stop - start - 1)//step)+1)
        else:
            self.__length = max(0, ((start - stop - 1)//abs(step))+1)
        self.__start = start
        self.__stop = stop
        self.__step = step

    def __iter__(self):
        num = self.__start
        if self.__step > 0:
            while num < self.__stop:
                yield num
                num += self.__step
        else:
            while num > self.__stop:
                yield num
                num += self.__step

    def __len__(self):
        return self.__length

    def __getitem__(self, k):
        if k < 0:
            k += self.__length
        if 0 <= k < self.__length:
            return self.__start + k*self.__step
        else:
            raise IndexError('range object index out of range')

三.re模块中函数的使用(正则表达式)

正则表达式(regex expression)是一门独立的语法,在我们的各个编程语言中支持正则表达式语法就可以。

在Python使用单独的模块来支持正则表达式: re模块

在Java, javascript, C#, shell等等, 基本上都支持regex expr

正则表达式用途:

    主要是用来处理文本的。是使用正则表达式中特殊的字符去匹配文本中的内容。

参数:

pattern: 正则表达式

string: 待匹配的文本

flags: 使用的模式

要求:使用实例来使用

match:

如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象

match: 正则表达式匹配字符串的开始

返回一个Match Object

str_data = "we've come a long way."
pattern = 'w'
match_obj = re.match(pattern, str_data)
print(match_obj)

#执行结果
<re.Match object; span=(0, 1), match='w'>

进程已结束,退出代码0

fullmatch

如果整个 string 匹配到正则表达式样式,就返回一个相应的 匹配对象 。 否则就返回一个 None ;注意这跟零长度匹配是不同的。

str_data = "we've come a long way."
pattern = "we've come a long way."
match_obj = re.fullmatch(pattern, str_data)
print(match_obj)

#执行结果
<re.Match object; span=(0, 22), match="we've come a long way.">

进程已结束,退出代码0

search

def search(pattern, string, flags=0):

search: 搜索,没有指定从什么地方开始搜索, 从任意位置开始匹配,

只匹配第一次找到的。

返回值也是match object

str_data = "we've come a long way."
pattern = 'c'
match_obj = re.search(pattern, str_data)
print(match_obj)

#执行结果
<re.Match object; span=(6, 7), match='c'>

进程已结束,退出代码0

findall

def findall(pattern, string, flags=0):

findall: 查找所有

返回的是一个列表

str_data = "we've come a long way."
pattern = 'a'
match_obj = re.findall(pattern, str_data)
print(match_obj)

#执行结果
['a', 'a']

进程已结束,退出代码0

finditer

def finditer(pattern, string, flags=0):

finditer: 也是查找所有,只是将查找的结果的match object放入迭代器中

str_data = "we've come a long way."
pattern = 'a'
match_obj = re.finditer(pattern, str_data)
print(match_obj.__next__())                  #既然返回的是一个迭代器,那就可以使用next(obj)的 
                                                                     方法去获取元素

#执行结果
<re.Match object; span=(11, 12), match='a'>

进程已结束,退出代码0

split

def split(pattern, string, maxsplit=0, flags=0):

分割的意思: 按照正则表达式进行分割

返回的是一个列表

str_data = "we've come a long way."
pattern = ' '
match_obj = re.split(pattern, str_data)
print(match_obj)

#执行结果
["we've", 'come', 'a', 'long', 'way.']

进程已结束,退出代码0

sub

def sub(pattern, repl, string, count=0, flags=0):

替换: replace是一样的

    old, new, string

sub: 返回的是一个字符串

count: 替换次数

str_data = "we've come a long way."
pattern = 'a'
match_obj = re.sub(pattern, 'y', str_data, 1)
print(match_obj)

#执行结果
we've come y long way.

进程已结束,退出代码0

subn

def subn(pattern, repl, string, count=0, flags=0):

替换: replace是一样的

    old, new, string

count: 替换次数

返回一个列表

str_data = "we've come a long way."
pattern = 'a'
match_obj = re.subn(pattern, 'y', str_data, 1)
print(match_obj)

#执行结果
("we've come y long way.", 1)

进程已结束,退出代码0

complie

def compile(pattern, flags=0):

re.match, re.search, re.findall

无论执行match, search, findall等函数的时候,都要先执行操作编译,

编译之后拿到是一个编译对象,然后再调用编译对象的.findall, .match, .search

如果我现在有一个正则表达式: xxxx

我即执行match, 还要执行search, 还要执行findall, 编译三次

我先编译,拿到编译之后的对象,再去调用编译对象的match ,search, findall。获取编译对象的函数

str_data = "we've come a long way."
pattern = 'a'
match_obj = re.compile(pattern)
print(match_obj.search(str_data))

#执行结果
<re.Match object; span=(11, 12), match='a'>

进程已结束,退出代码0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shadow_58

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值