Python基础之yield,匿名函数,包与re模块
一.表达式形式的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模块的更多相关文章
- 『Python基础-14』匿名函数 `lambda`
匿名函数和关键字lambda 匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数 在Python中,如果要声匿名函数,则需要使用lambda关键字 使用lambda声明的匿名函数能接收任何 ...
- 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( ...
- 十六. Python基础(16)--内置函数-2
十六. Python基础(16)--内置函数-2 1 ● 内置函数format() Convert a value to a "formatted" representation. ...
- Python练习题-1.使用匿名函数对1~1000求和,代码力求简洁。
Python 练习 标签(空格分隔): Python Python练习题 Python知识点 一.使用匿名函数对1~1000求和,代码力求简洁. 答案: In [1]: from functools ...
- 初学 Python(十三)——匿名函数
初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...
- 十五. Python基础(15)--内置函数-1
十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...
- Python:lambda表达式(匿名函数)
lambda表达式: 通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中 ...
- Python技法3:匿名函数、回调函数和高阶函数
1.定义匿名或内联函数 如果我们想提供一个短小的回调函数供sort()这样的函数用,但不想用def这样的语句编写一个单行的函数,我们可以借助lambda表达式来编写"内联"式的函数 ...
- Python小世界:匿名函数、高阶函数、推导式
前言 木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握. 另外,网上关于Python基础知识的各种普及已有太多太多. 附上相关大神的 ...
随机推荐
- CocoaPods 提交自己的库
今想把自己写的一个view提交到CocoaPods时候,突然发现pull request被拒了,原来从去年开始就改用trunk了... 网上那些folk 在提交的pull request的教程都不可用 ...
- 学习typescript(二)
学习typescript(二) ts 与 js 交互 ts 调用 js module使用 分为两种情况: ts 调用自己写的 js ts 调用别人写的 js 也就通过 npm 安装的 第一种情况处理如 ...
- js js弹出框、对话框、提示框、弹窗总结
js弹出框.对话框.提示框.弹窗总结 一.JS的三种最常见的对话框 //====================== JS最常用三种弹出对话框 ======================== //弹 ...
- ES6中新增的字符串方法
实例方法:includes(), startsWith(), endsWith() 传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6 又提供 ...
- PeopleSoft FSCM Production Support 案例分析
PeopleSoft FSCM Production Support 案例分析 2010年的时候曾建言博客园开辟Oracle ERP模块供大家交流,博客园如约开辟Oracle ERP 模块,而我后来却 ...
- 项目在cocos 2.23移植到cocos 3.1.0所出现的bug
在建项目时一定要注意选择源代码!而不是预编译库 "extensions/ExtensionMacros.h”: No such file 项目右键-属性-配置属性-c/c++ - 常规-附加 ...
- KVC/KVO 本质
KVO 的实现原理 KVO是关于runtime机制实现的 当某个类的对象属性第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法.派生类 ...
- 在web应用中使用日志
Log4J是Jakarta下的一个开源代码的子项目,用Log4J,我们可以使用定制的格式,把调试信息和日志信息输出到一个或多个需要的地方. 在Web应用中一般使用一个专门的Servlet来完成Log4 ...
- 高精度A+B
#include<stdio.h> #include<string.h> int main() { int lenth1,lenth2,n,i,j,k,s; scanf(&qu ...
- 爬虫_python3_requests
Requests 网络资源(URLs)撷取套件 改善Urllib2的缺点,让使用者以最简单的方式获取网络资源 可以使用REST操作(POST,PUT,GET,DELETE)存取网络资源 import ...