python stringstrip方法详解_Python 的技巧和方法你了解多少?
学了这些你的python代码将会改善,你的技巧将会提高。
进群:943752371可以获取各类Python学习资料+视频资料+各类安装教程
路径操作
比起os模块的path方法,python3标准库的pathlib模块的Path处理起路径更加的容易。
获取当前文件路径
前提导入os和pathlib包。。
os版:
print(os.path.dirname(file))
print(os.getcwd())
复制代码
pathlib版:
print(pathlib.Path.cwd())
复制代码
看着好像没啥区别,然后看下面这个。
获取上两级文件目录
os版
print(os.path.dirname(os.path.dirname(os.getcwd())))
复制代码
pathlib版
print(pathlib.Path.cwd().parent.parent)
复制代码
拼接路径
os版
print(os.path.join(os.path.dirname(os.path.dirname(os.getcwd())),”yamls”,”a.yaml”))
复制代码
pathlib版
parts=[“yamls”,”a.yaml”]
print(pathlib.Path.cwd().parent.parent.joinpath(*parts))
复制代码
运行时拼接路径
os版
os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(file))), ‘yamls’,f'{site_name}.yaml’)
复制代码
pathlib版
parts=[“yamls”,”a.yaml”]
print(pathlib.Path(file).resolve().parent.parent.joinpath(*parts))
复制代码
另外pathlib生成的是个对象,在open文件操作中可以直接运行的但是如果当作字符串操作会出现错误,此时需要对其进行转换,使用os.fspath()即可,不过一般很少有操作路径字符串的习惯。
综合起来,还是pathlib拼接路径方便。
保存标准格式的yaml文件
编程免不了要写配置文件,怎么写配置也是一门学问。
YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。
YAML在python语言中有PyYAML安装包。
前提安装第三方库
pip install pyaml
pip install ruamel.yaml
复制代码
关于yaml的读取知识网上一堆了我就不说了,这里主要说写入。
from ruamel import yaml
data={“age”:23,”sex”:”男”,”name”:”牛皮”}
with open(conf_file, “w”, encoding=’utf-8′) as fs:
yaml.dump(data, fs, Dumper=yaml.RoundTripDumper, allow_unicode=True)
复制代码
yaml写文件和json一样也是使用dump。
同时迭代两个列表
以前的时候我是这么解决的
a = [“a”, “b”, “c”, “d”]
b = [1, 2, 3] # 空的补充None
for index, a_item in enumerate(a):
b_item = None
if len(b) – 1 <= index:
pass
else:
b_item = b[index]
print({a_item:b_item})
复制代码
现在我通过itertools标准库的zip升级版zip_longest解决,可以通过fillvalue参数补充缺失值。当然如果比较的元素个数相同可以直接用zip。
from itertools import zip_longest
a = [“a”, “b”, “c”, “d”,”e”]
b = [1, 2, 3] # 空的补充None
for a_item, b_item in zip_longest(a,b,fillvalue=0):
print({a_item:b_item})
复制代码
三元表达式还能这么用?
一般的我们这样写
a=”hello” if 2>1 else “bye”
print(a)
复制代码
我们知道python中false实际式0,true是1,所以对于上面的式子我们就可以这么写了。
a=[“hello”,”bye”][2<1]
print(a)
复制代码
因为2<1是false也就是0,所以输出了第一个元素hello。
5.简单的类使用namedtuple代替
先来一个简单的例子
import collections
Person=collections.namedtuple(‘Person’,’name age’)
如果使用python中的关键字会出现错误,此时使用rename字段。
按照元素在元组中的下标赋值。class就是_2,def是_3
Person = collections.namedtuple(‘Person’, [‘name’, ‘age’, ‘class’, ‘def’, ‘name’, ‘name’], rename=True)
p = Person(name=’lisa’, age=’12’, _2=”class2″, _3=”def”, _4=”name2″, _5=”name3″)
print(p)
如果出现相同的字段第二次出现的时候也是用其下标,参考上面的例子。
fields查看字段名,可以发现内置模块和重复的字段标记为加下标的形式
print(p._fields)
使用_asdict将namedtuple转为OrderedDict。
od = p._asdict()
print(od)
然后可以转为字典
print(dict(od))
_replace()方法构建一个新实例,因为namedtuple是不可变类型所以这个方法可以返回一个新的对象。
new_p = p._replace(name=”samJ”)
print(new_p)
print(new_p is p) # 可以看到不是同一个对象。
复制代码
一个实用的例子pyppeteer的例子感受下
import asyncio
import pyppeteer
from collections import namedtuple
Response = namedtuple(“rs”, “title url html cookies headers history status”)
async def get_html(url, timeout=30):
# 默认30s
browser = await pyppeteer.launch(headless=True, args=[‘–no-sandbox’])
page = await browser.newPage()
res = await page.goto(url, options={‘timeout’: int(timeout * 1000)})
data = await page.content()
title = await page.title()
resp_cookies = await page.cookies()
resp_headers = res.headers
resp_history = None
resp_status = res.status
response = Response(title=title, url=url,
html=data,
cookies=resp_cookies,
headers=resp_headers,
history=resp_history,
status=resp_status)
return response
loop = asyncio.get_event_loop()
results = loop.run_until_complete(asyncio.gather(*task))
for res in results:
print(res.title)
复制代码
6 使用枚举让数字变得更易懂。
import enum
枚举
@enum.unique
class Sex(enum.Enum):
man = 12
woman = 13
# 因为加了唯一值的装饰器所以下面添加属性会报错
# boy=12
print(Sex.man.name)
print(Sex.woman.value)
遍历
for item in Sex:
print(item.name)
print(item.value)
print(“-” * 40)
其他使用方式
words = enum.Enum(
value=’item’,
names=(‘a b c d e f’),
)
输出元素c,必须是上面names里含有的值
print(words.c)
print(words.f)
因为names不含有w所以报错
try:
print(words.w)
except AttributeError as e:
print(e.args)
print(“-” * 40)
for word in words:
print(word.name, word.value) # 默认赋值为、从1开始自增。
print(“-” * 40)
如果自定义元素的值啧改为一下元组的形式
words2 = enum.Enum(
value=’item2′,
names=[(‘a’, 23), (‘b’, 56), (“c”, 12), (“d”, 333)]
)
for word2 in words2:
print(word2.name, word2.value)
复制代码
7 链式合并字典chainmap的使用
from collections import ChainMap
ChainMap
d1 = {‘a’: 1, ‘b’: 2}
d2 = {‘a2’: 3, ‘b2’: 4}
d3 = {‘a3’: 5, ‘b3’: 6}
d4 = {‘a4’: 7, ‘b4’: 8}
c = ChainMap(d1, d2, d3, d4) # 多个字典合并为一个
for k, v in c.items():
print(k, v)
print(c.maps) # 要搜索的索引列表
c.maps = list(reversed(c.maps)) # 逆转映射列表
print(c)
因为c和d1-d4对应的索引位置实际是一个所以,修改c的时候会影响到d1到d4其中饿的一个值,同理修改
d1-d4的时候也会影响到c。
所以使用new_child创建一个新的映射。再修改就影响不到底层的数据了。
c2 = c.new_child()
c2[“a4”] = 100
print(c)
print(c2)
输出发现c的值没有发生变化,只要c2变化。
d5 = {“a5”: 34, “b5”: 78}
c2 = c2.new_child(d5) # 可以在原来的映射基础上添加新的映射
print(c2)
复制代码
8 在不打乱列表顺序的基础上插入元素
import bisect
“””
bisect 模块,用于维护有序列表。
bisect 模块实现了一个算法用于插入元素到有序列表。
在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。
Bisect 是二分法的意思,这里使用二分法来排序,它会将一个元素插入到一个有序列表的合适位置,
这使得不需要每次调用 sort 的方式维护有序列表。
“””
values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1]
print(“New Pos Content”)
print(“— — ——-“)
l = []
for i in values:
postion = bisect.bisect(l, i) # 返回插入的位置
bisect.insort(l, i) # 等于insort_right
print(‘{:3}{:3}’.format(i, postion), l)
“””
Bisect模块提供的函数有:
bisect.bisect_left(a,x, lo=0, hi=len(a)) :
查找在有序列表 a 中插入 x 的index。lo 和 hi 用于指定列表的区间,默认是使用整个列表。如果 x 已经存在,在其左边插入。返回值为 index。
bisect.bisect_right(a,x, lo=0, hi=len(a))
bisect.bisect(a, x,lo=0, hi=len(a)) :
这2个函数和 bisect_left 类似,但如果 x 已经存在,在其右边插入。
bisect.insort_left(a,x, lo=0, hi=len(a)) :
在有序列表 a 中插入 x。和 a.insert(bisect.bisect_left(a,x, lo, hi), x) 的效果相同。
bisect.insort_right(a,x, lo=0, hi=len(a))
bisect.insort(a, x,lo=0, hi=len(a)) :
和 insort_left 类似,但如果 x 已经存在,在其右边插入。
Bisect 模块提供的函数可以分两类: bisect* 只用于查找 index, 不进行实际的插入;
而 insort* 则用于实际插入。该模块比较典型的应用是计算分数等级:
“””
复制代码
8 关于字典的逻辑运算你了解多少
使用&操作符查看字典的相同之处
字典键支持常见的集合操作,并集交集差集。
a = {‘x’: 1, ‘y’: 2, ‘z’: 3}
b = {‘w’: 2, ‘z’: 4, ‘x’: 3, ‘z’: 3}
获取相同的键
c = a.keys() & b.keys()
print(c)
获取相同的键值对
d = a.items() & b.items()
print(d)
创建一个新的字典并删除某些键
e = {k: a[k] for k in a.keys() – {‘z’, ‘x’}}
print(e)
复制代码
9 给切片起个名字
a=”safr3.14″
print(a[-4:])
上面可以改为
pie=slice(len(a)-4,len(a))
print(a)
复制代码
10 获取出现频率高的元素
from collections import Counter
text = “abcdfegtehto;grgtgjri” # 可迭代对象
lis = [“a”, “c”, “d”, “t”, “b”]
dic = {“a”: 1, “b”: 4, “c”: 2, “d”: 9} # 字典也可以
c = Counter() # 可以定义空容器然后update
c.update(text)
c2 = Counter()
c2.update(dic)
c3 = Counter(lis) # 也可以直接传入对象
print(c)
print(c2)
print(c3)
使用c.most_comman(n)获取前n出现频率最高的元素,列表元组类型
print(c.most_common(4))
复制代码
python stringstrip方法详解_Python 的技巧和方法你了解多少?相关推荐
- python中index方法详解_Python中的index()方法使用教程
index()方法确定字符串str,如果起始索引beg和结束索引end在末尾给出了找到字符串或字符串的一个子串.这个方法与find()方法一样,只是如果没有找到子符趾会抛出一个异常. 语法 以下是in ...
- python协程详解_python协程详解
原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...
- python 元类 详解_Python 元类详解 __new__、__init__、__call__、__metacalss__
了解元类之前,先了解几个魔术方法: __new__.__init__.__call__ __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪 ...
- python时间函数详解_Python:Numpy库基础分析——详解datetime类型的处理
原标题:Python:Numpy库基础分析--详解datetime类型的处理 Python:Numpy库基础分析--详解datetime类型的处理 关于时间的处理,Python中自带的处理时间的模块就 ...
- python requests库详解_python爬虫之路(一)-----requests库详解
requests库 requests库是python实现的最简单易用的http库. requests库的功能详解. 我们可以自然而然地想到这些方法其实就是http协议对资源的操作. 调用request ...
- python average函数详解_python基础之函数详解
Python基础之函数详解 一.函数的定义 到现在为止,我们已经掌握了Python的基本语法和数据类型等相关基础知识了,以进行一个项目的编写了,这个时候,就会发现,很多代码需要我们进行复制粘贴,这简直 ...
- python scatter参数详解_Python中scatter函数参数及用法详解
最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...
- python pexpect模块详解_python pexpect原理详解及使用说明
pexpect是python中用于实现SSH,FTP,telnet等命令进行自动化交互,从而无需人工干预实现自动化运维的一个第三方扩展模块.理论的描述过于抽象,这里首先设想一下,如果让您设计一个实现自 ...
- python函数练习题详解_Python练习题详解之函数3(小白友好)
Python练习题详解之函数3(小白友好) 你好!欢迎来到Python练习题详解系列.为了让小白(也就是我本人)更好的理解代码,打好编程基础,我决定仔细地解说一些练习题.欢迎阅读!奥利给! 题目1 编 ...
最新文章
- MYSQL 数据库迁移 ***
- 面试官:抛开Spring来说,如何自己实现Spring AOP?
- 为什么 CTO、技术总监、架构师都不写代码,还这么牛?
- php 正则替换style,php正则去除js,class,id,style标签代码
- 不常见但是有用的 Chrome 调试技巧
- 读取带空格字符串小结
- Visual Composer 最好的扩展 wordpress插件
- vs没有添加引用_NBA 季后赛 湖人vs火箭 G2大战谁能防住哈登?
- MATPOWER 修改数据格式和应用
- matlab画折现_用matlab画折线图
- lldp协议代码阅读_LLDP协议、STP协议 笔记
- 大数据教程,大数据实战教程,大数据教程电信信号强度诊断项目实战
- PS怎样去掉图片上的文字
- 深度学习——AI领域会议列表(以备准备和更新论文存储使用)
- 包引入中,在包名前使用下划线“_”
- Debian折腾笔记
- Android 能让你少走弯路的干货整理
- 单片机/树莓派扩展双串口(TTL和RS485)
- mipi传输距离3米_蓝牙网关有效传输距离是多少?
- [分享]敏感内容自动评审类库及辅助工具
热门文章
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截...
- Ubuntu触摸板使用
- fedora网络配置
- gentoo下使能subversion自动补全
- call(),apply(),bind()的用法及举例
- CentOS系统Nginx配置免费https证书
- 25.CSS其他样式
- 玩转SCVMM中的更新基线,实现虚拟平台基础服务器补丁自动更新
- java 子类重写父类的方法的注意事项
- spring cloud集成 consul源码分析