您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python之路,Day4

5b51 2022/1/14 8:24:05 python 字数 19099 阅读 619 来源 www.jb51.cc/python

本节大纲迭代器&生成器装饰器基本装饰器多参数装饰器递归算法基础:二分查找、二维数组转换正则表达式常用模块学习作业:计算器开发实现加减乘除及拓号优先级解析用户输入1 - 2 * ( (60-30

概述

本节大纲

迭代器

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

特点:

生成一个迭代器:

Repeated calls to the iterator’s  method (or passing it to the built-in function ) return successive items in the stream. When no more data are available a  exception is raised instead. At this point,the iterator object is exhausted and any further calls to its  method just raise  again.

生成器generator

定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 

代码

0:
        amount -= 1
        yield 1        print("擦,又来取钱了。。。败家子!")

ATM = cash_out(5)

print("取到钱 %s 万" % ATM.next())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next()) #到这时钱就取没了,再取就报错了
print("取到钱 %s 万" % ATM.next())

ATM = cash_out(5)

print("取到钱 %s 万" % ATM.next())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next()) #到这时钱就取没了,再取就报错了
print("取到钱 %s 万" % ATM.next())

ATM = cash_out(5)

print("取到钱 %s 万" % ATM.next())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next())
print("花掉花掉!")
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next())
print("取到钱 %s 万" % ATM.next()) #到这时钱就取没了,再取就报错了
print("取到钱 %s 万" % ATM.next())

作用:

这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。

另外,还可通过yield实现在单线程的情况下实现并发运算的效果

<div class="cnblogs_Highlighter">
<pre class="brush:python;collapse:true;;gutter:true;">import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield

   print("包子[<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>]来了,被[<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>]吃了!" %(baozi,name))

def producer(name):
c = consumer('A')
c2 = consumer('B')
c.next()
c2.next()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)

producer("alex")

  

装饰器

直接 看银角大王写的文档 http://www.cnblogs.com/wupeiqi/articles/4980620.html  

递归

else:
    print("cannot find [%s] in data_list" %find_num)

if name == 'main':
primes = [2,97]
binary_search(primes,67)

  在后面的故事我就编不下去啦,哈哈!but anyway,以上就是典型的递归用法,在程序里自己调用自己。

for row in array: #旋转前先看看数组长啥样
print(row)

print('-------------')
for i,row in enumerate(array):

for index in range(i,len(row)):
    tmp = array[index][i] #get each rows' data by column's index
    array[index][i] = array[i][index] #
    print tmp,array[i][index]  #= tmp
    array[i][index] = tmp
for r in array:print r

print('--one big loop --')

  

冒泡排序

将一个不规则的数组按从小到大的顺序进行排序

previous = data[0]
for j in range(len(data)):
tmp = 0
for i in range(len(data)-1):
if data[i] > data[i+1]:
tmp=data[i]
data[i] = data[i+1]
data[i+1] = tmp
print(data)

print("after sort:",data)

  

n

一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。

若对于一个算法,

T(n)

O(1)一个例子是访问

O(n)数量并假设数量保持不变,则该操作也可被称为具有常数时间。

对数时间 

若算法的T(n) = O(log n),则称其具有对数时间

常见的具有对数时间的算法有的相关操作和

对数时间的算法是非常有效的,因为每增加一个输入,其所需要的额外计算时间会变小。

递归地将字符串砍半并且输出是这个类别函数一个简单例子。它需要O(log n)的时间因为每次输出之前我们都将字符串砍半。 这意味着,如果我们想增加输出次数,我们需要将字符串长度加倍。

如果一个算法的时间复杂度为O(n),则称这个算法具有线性时间,或O(n)时间。非正式地说,这意味着对于足够大的输入,运行时间增加的大小与输入成线性关系。例如,一个计算列表所有元素的和的程序,需要的时间与列表的长度成正比。

p = re.compile("^[0-9]")  #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表匹配上了

m = p.match('14534Abc') #按上面生成的正则对象 去匹配 字符串, 如果能匹配成功,这个m就会有值, 否则m为Noneif m: #不为空代表匹配上了
  print(m.group())    #m.group()返回匹配上的结果,此处为1,因为匹配上的是1这个字符else:  print("doesn't match.")

m = p.match('14534Abc') #按上面生成的正则对象 去匹配 字符串, 如果能匹配成功,这个m就会有值, 否则m为Noneif m: #不为空代表匹配上了
  print(m.group())    #m.group()返回匹配上的结果,此处为1,因为匹配上的是1这个字符else:  print("doesn't match.")

m = p.match('14534Abc') #按上面生成的正则对象 去匹配 字符串, 如果能匹配成功,这个m就会有值, 否则m为Noneif m: #不为空代表匹配上了
  print(m.group())    #m.group()返回匹配上的结果,此处为1,因为匹配上的是1这个字符else:  print("doesn't match.")

上面的第2 和第3行也可以合并成一行来写:

效果是一样的,区别在于,第一种方式是提前对要匹配的格式进行了编译(对匹配公式进行解析),这样再去匹配的时候就不用在编译匹配的格式,第2种简写是每次匹配的时候 都 要进行一次匹配公式的编译,所以,如果你需要从一个5w行的文件中匹配出所有以数字开头的行,建议先把正则公式进行编译再匹配,这样速度会快点。

匹配格式

re.match(pattern,string)     # 从头匹配

re.search(pattern,string)    # 匹配整个字符串,直到找到一个匹配

re.split()            # 将匹配到的格式当做分割点对字符串分割成列表

>>m = re.split("[0-9]","alex1rain2jack3helen rachel8")
>>>print(m)

输出: ['alex','rain','jack','helen rachel','']

re.findall()          # 找到所有要匹配的字符并返回列表格式

>>m = re.findall("[0-9]","alex1rain2jack3helen rachel8")
>>>print(m)

输出:['1','2','3','8']

re.sub(pattern,repl,string,count,flag)    # 替换匹配到的字符

输出:alex|rain|jack3helen rachel8  

 

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

Regular Expression Modifiers: Option Flags

Regular expression literals may include an optional modifier to control varIoUs aspects of matching. The modifiers are specified as an optional flag. You can provide multiple modifiers using exclusive OR (|),as shown prevIoUsly and may be represented by one of these ?

匹配手机号

m = re.search("(1)([358]\d{9})",phone_str2)
if m:
print(m.group())

匹配IP V4

m = re.search("\d{1,3}.\d{1,3}",ip_addr)

print(m.group())

print(m.group())

print(m.group())

分组匹配地址  

>> match.group(1)
  'Doe'
  >>> match.group(2)
  'John'
  >>> match.group(3)
  '555-1212'
"""
match = re.search(r'(?P
 
  \w+),(?P
  
   \w+): (?P
   
    \S+)',contactInfo)
"""
 >>> match.group('last')
  'Doe'
  >>> match.group('first')
  'John'
  >>> match.group('phone')
  '555-1212'
"""

   
  
 

匹配email

m = re.search(r"[0-9.a-z]{0,26}@[0-9.a-z]{0,20}.[0-9a-z]{0,8}",email)
print(m.group())

json 和 pickle 

用于序列化的两个模块

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

 其它常用模块学习

http://www.cnblogs.com/wupeiqi/articles/4963027.html 

  

总结

以上是编程之家为你收集整理的Python之路,Day4全部内容,希望文章能够帮你解决Python之路,Day4所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶