一.表达式形式的yield

1.另外一种形式的yield

 def deco(func):
def wrapper(*arges, **kwargs):
res = func(*arges, **kwargs)
next(res)
return res
return wrapper @deco
def eater(name):
print("%s ready to eat" % name)
food_list = []
while True:
food = yield food_list
food_list.append(food)
print("%s start to eat %s" % (name, food))
g = eater("alex")
g.send("手指头")
g.send("脚趾头")
g.send("别人的手指头")
g.send("别人的脚趾头")
"""
输出结果:
alex ready to eat
alex start to eat 手指头
alex start to eat 脚趾头
alex start to eat 别人的手指头
alex start to eat 别人的脚趾头
"""
 def deco(func):
def wrapper(*arges, **kwargs):
res = func(*arges, **kwargs)
next(res)
return res
return wrapper @deco
def eater(name):
print("%s ready to eat" % name)
food_list = []
while True:
food = yield food_list
food_list.append(food)
print("%s start to eat %s" % (name, food))
g = eater("alex")
g.send("手指头")
g.send("脚趾头")
g.send("别人的手指头")
g.send("别人的脚趾头")
"""
输出结果:
alex ready to eat
alex start to eat 手指头
alex start to eat 脚趾头
alex start to eat 别人的手指头
alex start to eat 别人的脚趾头

2.表达式形式的yield

 # -*- coding:utf-8 -*-
# /user/bin/python
import os
def init(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
next(res)
return res
return wrapper @init # 装饰器:初始化函数
def search(target):
while True:
search_path=yield
g=os.walk(search_path) # 遍历目录
for par_dir,_,files in g: # 用_丢弃子目录
for file in files:
file_abs_path=r'%s\%s' %(par_dir,file) # 拼接文件路径file_abs_path
# print(file_abs_path)
target.send(file_abs_path) # 遍历文件路径并send给opener函数 @init
def opener(target):
while True:
file_abs_path=yield
# print('opener func==>',file_abs_path)
with open(file_abs_path,encoding='utf-8') as f:
target.send((file_abs_path,f)) # send文件路径及文件对象f,以元组的形式send数据 @init
def cat(target): # target为grep函数对象
while True:
file_abs_path,f=yield #(file_abs_path,f)
for line in f:
tag=target.send((file_abs_path,line)) # send文件路径及文件行内容line,以元组的形式send数据
if tag:
break
@init
def grep(target,pattern): # target为printer函数对象,pattern为匹配的字符串'python'
tag=False
while True:
file_abs_path,line=yield tag
tag=False
if pattern in line:
tag=True
target.send(file_abs_path) @init
def printer(): # 输出匹配成功的文件路径
while True:
file_abs_path=yield
print(file_abs_path) x=r'E:\YQLFC\study\day05\day5\a' # 查找的目录 g=search(opener(cat(grep(printer(),'python'))))
print(g) '''
#结果
<generator object search at 0x0000000000D514C0>
E:\YQLFC\study\day05\day5\a\a.txt
E:\YQLFC\study\day05\day5\a\b\b.txt
E:\YQLFC\study\day05\day5\a\b\c\d\d.txt
'''

二.匿名函数lambda

1.匿名函数

 f=lambda x,y:x+y # :...=return
print(f(1,2))

2.zip拉链函数,将keys与values转换

 salaries = {
'json':2000,
'alex':100000,
'nickle':10000,
'egon': 3000
}
res= zip(salaries.values(),salaries.keys())
print(list(res))
"""
[(3000, 'egon'), (100000, 'alex'), (10000, 'nickle'), (2000, 'json')]
"""

3.max,sorted与min函数

 salaries = {
'json':2000,
'alex':100000,
'nickle':10000,
'egon': 3000
}
print(max(salaries, key=lambda k:salaries[k]))
print(min(salaries, key=lambda k:salaries[k]))
print(sorted(salaries,key=lambda k:salaries[k])) # 默认排序从小到大
"""
alex
json
['json', 'egon', 'nickle', 'alex']
"""

三.内置函数(续)

1.global改变局部变量为全局变量

 x = 10000
def func():
global x
x = 1
func()
print(x)
"""
1
"""

2.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回

 lis = ["json", "alex","nickle"]
res = map(lambda x:x+'_sb',lis)
print(list(res))
"""
['json_sb', 'alex_sb', 'nickle_sb']
"""
 numbers = [1,2,3,4,5,3]
res = map(lambda x:x**2,numbers)
print(list(res))
"""
[1, 4, 9, 16, 25, 9]
"""

3.reduce()函数接收的参数和 map()类似,一个函数 f一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

 from functools import reduce
numbers = [1,2,3,4,5,6]
res = reduce(lambda x,y:x+y,numbers,20) # 为初始值将计算结果再与20相加
print(res)
"""
41
"""

4.filter()函数包括两个参数,分别是function和list。该函数根据function参数返回的结果是否为真来过滤list参数中的项,最后返回一个新列表。

 lis = ['json_sb', 'alex_sb', 'nickle_sb',"lyl"]
res = filter(lambda x:x.endswith("sb"),lis)
print(list(res))
"""
['json_sb', 'alex_sb', 'nickle_sb']
"""

四.递归与二分法

1.递归定义,直接或间接地调用了函数本身

 def fact(n):
if n==1:
return 1
return n * fact(n - 1)
print(fact(7))
"""
5040
"""
 def age(n):
if n == 1:
return 18
return age(n-1)+2
print(age(3))
"""
22
"""

2.通过sys模块可以指定递归次数,默认为1000次

 import sys
print(sys.getrecursionlimit())
"""
1000
"""
 import sys
print(sys.setrecursionlimit(100000))
print(sys.getrecursionlimit())
"""
None
100000
"""

3.二分法

 l = [1, 2, 10,33,53,71,73,75,77,85,101,201,202,999,11111]

 def search(find_num,seq):
if len(seq) == 0:
print('not exists')
return
mid_index=len(seq)//2
mid_num=seq[mid_index]
print(seq,mid_num)
if find_num > mid_num:
#in the right
seq=seq[mid_index+1:]
search(find_num,seq)
elif find_num < mid_num:
#in the left
seq=seq[:mid_index]
search(find_num,seq)
else:
print('find it')
search(1,l)
"""
[1, 2, 10, 33, 53, 71, 73, 75, 77, 85, 101, 201, 202, 999, 11111] 75
[1, 2, 10, 33, 53, 71, 73] 33
[1, 2, 10] 2
[1] 1
find it
"""

五.正则表达式re

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

re 模块使 Python 语言拥有全部的正则表达式功能。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换.

1.re导入模块

import re

2.正则表达式匹配规则(引于菜鸟教程)

1).正则表达式修饰符--可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

  修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

2).正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'/t',等价于'//t')匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}  
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) G匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

c.正则表达式实例

字符匹配

 实例 描述
python 匹配 "python".

字符类

 实例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符

特殊字符类

实例 描述
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

3.具体方法

1).re.match

尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。

re.match(pattern, string, flags=0)
  • pattern表示匹配的正则表达式
  • string表示要匹配的字符串
  • 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

实例1

import re
print(re.match("www","www.baidu.com").span()) # 在起始位置匹配
print(re.match("com","www.baidu.com")) # 不在起始位置匹配
"""
(0, 3)
None
"""

实例2

import re
res = re.match('\d+', '123uuasf')
if res:
print (res.group())
else:
print(None)
"""
123
"""

2).re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。函数语法同re.match方法

案例1

print(re.search('www', 'www.yaomr.com').span())  # 在起始位置匹配
print(re.search('yao', 'www.yaomr.com').span()) # 不在起始位置匹配 """
(0, 3)
(4, 7)
"""

3).re.match与re.search的区别

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

实例

import re

line = "Cats are smarter than dogs";

matchObj = re.match(r'dogs', line, re.M | re.I)
if matchObj:
print("match --> matchObj.group() : ", matchObj.group())
else:
print("No match!!") matchObj = re.search(r'dogs', line, re.M | re.I)
if matchObj:
print("search --> matchObj.group() : ", matchObj.group())
else:
print("No match!!")

4.搜索string,以列表形式返回全部能匹配的子串

语法:

re.sub(pattern, repl, string, count=0)
  • pattern,正则表达式中的字符串
  • repl,替换中的字符串也可能是一个函数
  • string,要被查找中的原始字符串
  • count,模式匹配后替换的最大次数,默认0表示替换的所有匹配
import re

phone = "2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)
"""
电话号码 : 2004-959-559
电话号码 : 2004959559
"""

Python基础之yield,匿名函数,包与re模块的更多相关文章

  1. 『Python基础-14』匿名函数 `lambda`

    匿名函数和关键字lambda 匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数 在Python中,如果要声匿名函数,则需要使用lambda关键字 使用lambda声明的匿名函数能接收任何 ...

  2. python基础一 day16 匿名函数

    def add(x,y): return x+y add = lambda x,y:x+yprint(add(1,2)) dic={'k1':10,'k2':100,'k3':30}def func( ...

  3. 十六. Python基础(16)--内置函数-2

    十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...

  4. Python练习题-1.使用匿名函数对1~1000求和,代码力求简洁。

    Python 练习 标签(空格分隔): Python Python练习题 Python知识点 一.使用匿名函数对1~1000求和,代码力求简洁. 答案: In [1]: from functools ...

  5. 初学 Python(十三)——匿名函数

    初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...

  6. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  7. Python:lambda表达式(匿名函数)

    lambda表达式: 通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中 ...

  8. Python技法3:匿名函数、回调函数和高阶函数

    1.定义匿名或内联函数 如果我们想提供一个短小的回调函数供sort()这样的函数用,但不想用def这样的语句编写一个单行的函数,我们可以借助lambda表达式来编写"内联"式的函数 ...

  9. Python小世界:匿名函数、高阶函数、推导式

    前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...

随机推荐

  1. 玲珑杯”ACM比赛 Round #4 1054 - String cut 暴力。学到了扫描的另一种思想

    http://www.ifrog.cc/acm/problem/1054 问删除一个字符后的最小循环节是多少. 比赛的时候想不出,不知道怎么暴力. 赛后看了别人代码才晓得.唉,还以为自己字符串还不错, ...

  2. SSAS中处理时经常出现的几种错误

    1.[重复属性键的错误]"处理时找到重复的属性键"   当在[属性关系]里指定属性关系后,   就出出现此错误,因为不知道Month值“1”,并不知道是属于哪一年的,   所以需要 ...

  3. Storm编程入门API系列之Storm的Topology多个Executors数目控制实现

    前期博客 Storm编程入门API系列之Storm的Topology默认Workers.默认executors和默认tasks数目 Storm编程入门API系列之Storm的Topology多个Wor ...

  4. elastcisearch中文分词器各个版本

    地址 https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.0.1

  5. okhttp使用心得(https验证不通过)(一)

    之前项目使用的是okhttp3.4版本的,tls协议支持1.0 1.2 等等 后来换成okhttp3.8.1,发现握手失败 找了好多原因之后  发现吧tls加上1.0后,就可以握手成功了,但是tls1 ...

  6. POJ 1741 Tree (树的分治,树的重心)

    题意:给一棵树,n个节点,给定一个数k,求任意满足dist(a,b)<=k的点对的数量. 思路: 这道题的思路比较简单,但是细节很多. 此题可以用分治法,如何分治? (1)如果path(a,b) ...

  7. COGS 930. [河南省队2012] 找第k小的数

    题目描述 看到很短的题目会让人心情愉悦,所以给出一个长度为N的序列A1,A2,A3,...,AN, 现在有M个询问,每个询问都是Ai...Aj中第k小的数等于多少. 输入格式 第一行两个正整数N,M. ...

  8. Mysql 主备配置

    来自:http://blog.csdn.net/u013256816/article/details/52536283 1. 了解主备配置过程原理. http://blog.csdn.net/u013 ...

  9. (十二)mybatis之动态代理

    mybatis之动态代理的应用 在前文(https://www.cnblogs.com/NYfor2018/p/9093472.html)我们知道了,Mybatis的使用需要用到Mapper映射文件, ...

  10. codeforces Gym 100338C Important Roads (重建最短路图)

    正反两次最短路用于判断边是不是最短路上的边,把最短路径上的边取出来建图.然后求割边.注意重边,和卡spfa. 正权,好好的dijkstra不用,用什么spfa? #include<bits/st ...