python 白领实用_python那些实用且不为人知的技巧

虽然使用python很多年,但是有些方法,还是没有掌握;最近仔细阅读了一本书,发现了一些实用不为人知的方法。

分割:

string 对象的 split() 方法只适应于非常简单的字符串分割情形, 它并不允许有多个分隔符或者是分隔符周围不确定的空格。当你需要更加灵活的切割字符串的时候,最好使用 re.split() 方法:

>>> line = 'asdf fjdk; afed, fjek,asdf, foo'

>>> import re

>>> re.split(r'[;,\s]\s*', line)

['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

开头或结尾匹配:

检查字符串开头或结尾的一个简单方法是使用 str.startswith() 或者是 str.endswith() 方法。

这个方法中必须要输入一个元组作为参数。如果你恰巧有一个 list 或者 set 类型的选择项, 要确保传递参数前先调用 tuple() 将其转换为元组类型。比如:

>>> import os

>>> filenames = os.listdir('.')

>>> filenames

[ 'Makefile', 'foo.c', 'bar.py', 'spam.c', 'spam.h' ]

>>> [name for name in filenames if name.endswith(('.c', '.h')) ]

['foo.c', 'spam.c', 'spam.h'

用Shell通配符匹配字符串

你想使用 Unix Shell 中常用的通配符(比如 .py , Dat[0-9].csv 等)去匹配文本字符串

解决方案

fnmatch 模块提供了两个函数—— fnmatch() 和 fnmatchcase() ,可以用来实现这样的匹配。用法如下

>>> from fnmatch import fnmatch, fnmatchcase

>>> fnmatch('foo.txt', '*.txt')

True

>>> fnmatch('foo.txt', '?oo.txt')

True

>>> fnmatch('Dat45.csv', 'Dat[0-9]*')

True

>>> names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py']

>>> [name for name in names if fnmatch(name, 'Dat*.csv')]

['Dat1.csv', 'Dat2.csv']

你想通过某种对齐方式来格式化字符串

解决方案

对于基本的字符串对齐操作,可以使用字符串的 ljust() , rjust() 和 center() 方法。比如:

>>> text = 'Hello World'

>>> text.ljust(20)

'Hello World '

>>> text.rjust(20)

' Hello World'

>>> text.center(20)

' Hello World '

所有这些方法都能接受一个可选的填充字符。比如:

>>> text.rjust(20,'=')

'=========Hello World'

>>> text.center(20,'*')

'****Hello World*****'

函数 format() 同样可以用来很容易的对齐字符串。你要做的就是使用 或者 ^ 字符后面紧跟一个指定的宽度。比如:

>>> format(text, '>20')

' Hello World'

>>> format(text, '<20')

'Hello World '

>>> format(text, '^20')

' Hello World '

如果你想指定一个非空格的填充字符,将它写到对齐字符的前面即可:

>>> format(text, '=>20s')

'=========Hello World'

>>> format(text, '*^20s')

'****Hello World*****'

问题

怎样从一个集合中获得最大或者最小的 N 个元素列表?

解决方案

heapq 模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题。

portfolio = [

{'name': 'IBM', 'shares': 100, 'price': 91.1},

{'name': 'AAPL', 'shares': 50, 'price': 543.22},

{'name': 'FB', 'shares': 200, 'price': 21.09},

{'name': 'HPQ', 'shares': 35, 'price': 31.75},

{'name': 'YHOO', 'shares': 45, 'price': 16.35},

{'name': 'ACME', 'shares': 75, 'price': 115.65}

]

cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])

expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])

问题

你有一个字典列表,你想根据某个或某几个字典字段来排序这个列表。

解决方案

通过使用 operator 模块的 itemgetter 函数,可以非常容易的排序这样的数据结构。假设你从数据库中检索出来网站会员信息列表,并且以下列的数据结构返回:

{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},

{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},

{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},

{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}

]

根据任意的字典字段来排序输入结果行是很容易实现的,代码示例:

from operator import itemgetter

rows_by_fname = sorted(rows, key=itemgetter('fname'))

rows_by_uid = sorted(rows, key=itemgetter('uid'))

print(rows_by_fname)

print(rows_by_uid)

掌握好这些实用的方法,有时候会事半功倍。

往期文章:

用docker在云上部署一个图片解析接口​mp.weixin.qq.comjmeter参数化并在jenkins上执行​mp.weixin.qq.com快速实现接口自动化​mp.weixin.qq.com利用python自动写docx报告​mp.weixin.qq.com测试人工智能自动语音识别系统之IOS​mp.weixin.qq.com如何在iphone真机上自动化测试​mp.weixin.qq.compycharm的那些技能​mp.weixin.qq.comwin10上搭建appium自动化环境​mp.weixin.qq.com用jsonpath来做接口测试​mp.weixin.qq.comcypress搭建自动化框架​mp.weixin.qq.comPytest实战Web测试框架​mp.weixin.qq.com

更多精彩,请关注 python粉丝团

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值