有用的python代码片段

打印菱形

  • 法1:
n = 4
for i in range(2*n-1):
    if i < n:
        number = 2 * i +1
    else:
       number = 2*(2*n-1-i)-1
    print(('*' * number).center(2*n-1, " "))
  • 法2(装逼用的):
n = 4
_max = 2 * n - 1
a = [("*"*e).center(_max," ")for e in [2*i - 1 if i<=n else 4*n-2*i-1 for i in range(1, _max+1)]]
for each in a:
    print(each)

获取一个目录下最新的文件

import os
filelist = os.listdir(path)
filelist.sort(key = lambda fn: os.path.getmtime(os.path.join(path, fn)))
filelist[-1]   #path目录下最新的文件名

同时遍历list元素和下标

myList = ["one", "two", "three"]

for i,v in enumerate(myList):
    print(i, v)

发送各种类型邮件

import smtplib
import sys

_user = "[email protected]"
_pwd = "xxxxxx"


# jpg类型附件
part = MIMEApplication(open('foo.jpg', 'rb').read())
part.add_header('Content-Disposition', 'attachment', filename="foo.jpg")
msg.attach(part)
# pdf类型附件
part = MIMEApplication(open('foo.pdf', 'rb').read())
part.add_header('Content-Disposition', 'attachment', filename="foo.pdf")
msg.attach(part)
# mp3类型附件
part = MIMEApplication(open('foo.mp3', 'rb').read())
part.add_header('Content-Disposition', 'attachment', filename="foo.mp3")
msg.attach(part)

def sendEmail(sender, receiver, msg):
    s = smtplib.SMTP("smtp.ym.163.com", 25, timeout=30)  # 连接smtp邮件服务器,端口默认是25
    s.login(_user, _pwd)  # 登陆服务器
    s.sendmail(sender, receiver, msg.as_string())  # 发送邮件
    s.close()

日志配置

import logging

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

筛选列表中的数据

  • 列表解析
from random import randint

data = [randint(-10,10) for _ in range(10)]
data_after=[x for x in data if x > 0]
  • filter函数
from random import randint

data = [randint(-10,10) for _ in range(10)]
data_after=list(filter(lambda x:x > 0, data))

筛选字典中的数据

  • 字典解析
from random import randint

d = {x: randint(60,100) for x in range(1,21)}
d_after = {k:v for k,v in d.items() if v > 90}

列表去重

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))

使用命名元组为每个元素命名

from collections import namedtuple
Student = namedtuple('Student', ['name', 'age', 'sex'])
s = Student('aaa',18,"male")
s2= Student(name='bbb', age=12, sex="female")

if s.name == "aaa":
    pass

统计一个list中各个元素出现的次数

  • 方法1,使用字典
from random import randint
data = [randint(1,10) for _ in rang(10)]
# 把data里的数据作为key来创建一个字典,且value初始化为0
dic = dict.fromkeys(data, 0)
for x in data:
   dic[x] += 1   
#dic 中key为元素,value为该元素出现次数
  • 方法2,使用Counter()
from collections import Counter()

data = [randint(1,10) for _ in range(10)]
# 得到的dic2和方法1的dic一样,一条代码解决问题!
dic2 = Counter(data)
# 并且还可以使用most_common(n)方法来直接统计出出现频率最高的n个元素
dic2.most_common(2)
# 输出一个list ,其中的元素为(key,value)的键值对,类似[(6, 4), (3, 2)]这样

对字典排序

#以上一例子的dic作为排序对象
dic = {0: 1, 2: 2, 4: 4, 6: 1, 7: 1, -6: 1}
dic_after = sorted(dic.items(), key=lambda x:x[1])
# 如果想按key来排序则sorted(dic.items(), key=lambda x:x[0])
# dic_after为一个列表: [(0, 1), (6, 1), (7, 1), (-6, 1), (2, 2), (4, 4)]

使用正则表达式分割文本

import re
with open("file.txt") as f
    text = f.read()
# 分割为所有单词组成的list, \W匹配非字母数字及下划线
result = re.split('\W+', text)

使用正则表达式提取文本

import re
#用(?P...)括住一个群,并命名为year
m = re.search("output_(?P\d{4})", "output_1986.txt")
print(m.group("year") #输出1986

启动一个简单的目录服务

$ cd ~/tmp
$ python -m SimpleHTTPServer  [port]
or
$ python3 -m http.server  [port]

字符串转换为JSON

$ echo '{"job": "developer", "name": "lmx", "sex": "male"}' | python -m json.tool
    {
        "job": "developer",
        "name": "lmx",
        "sex": "male"
    }

检查三方库是否正确安装

$ python -c "import paramiko"

使用Python解压zip压缩包

  • -l 显示zip格式压缩包中的文件列表
  • -c 创建zip格式压缩包
  • -e 提取zip格式压缩包
  • -t 验证文件是一个有效的zip格式压缩包
python -m zipfile -c monty.zip spam.txt eggs.txt
python -m zipfile -e monty.zip target-dir/
python -m zipfile -l monty.zip

使用pickle存储对象

  • 使用pickle的dumps()方法可以将对象转换成字符串形式,随后用字节文本形式存储对象到文件
import pickle

class Bird(object):
    have_feather = True
    
summer = Bird()
pickle_string = pickle.dumps(summer)

with open("summer.pkl", "wb") as f:
    f.write(pickle_string)

也可以使用dump方法一步到位

import pickle

class Bird(object):
    have_feather = True
    
summer = Bird()
with open("summer.pkl", "w") as f:
    pickle.dump(summer, f)

使用装饰器计算函数运行时间

def decorator_timer(foo):
        def wrapper(*arg, **karg):
            t1 = time.time()
            result = foo(*arg, **karg)
            t2 = time.time()
            print(pre+"time:", t2 - t1)
            return result
        return wrapper
        
@decorator_timer("@_@")
def my_power(a, b):
    return a**b
    
print(my_power(2,3))
#输出:
#time: 0.0
#5

使用groupby将列表元素分类

from itertools import groupby

def height_class(h):
    if h> 180:
        return "tall"
    elif h<160:
        return "short"
    else:
        return "middle"
    
friends = [191,144,142,170,177,188,293]
friends = sorted(friends, key = height_class)
for m, n in itertools.groupby(friends, key=height_class):
    print(m)
    print(list(n))
#middle
#[170, 177]
#short
#[144, 142]
#tall
#[191, 188, 293]

使用sets计算交集和差集

set1 = {1,2,3,4}
set2 = {3,4,5,6}

set1.intersection(set2)#交集
set1.difference(set2)#差集

确保python3中不会使用过期的python2内置功能

python2中有12个内置功能在Python3中已经被移除了。要确保在Python2代码中不要出现这些功能来保证对Python3的兼容。这有一个强制让你放弃12内置功能的方法:

from future.builtins.disabled import *

使用正则多个分隔符分割字符串

import re
s = "ab,wer.wer,wer|wer||,wwer wer,wer3"
re.split(r"[,.|]+", s)
Out[6]: ['ab', 'wer', 'wer', 'wer', 'wer', 'wwer wer', 'wer3']

正则 调整文本格式

import re
s = "1991-02-28"
re.sub(r"(\d{4})-(\d{2})-(\d{2})", r'\1/\2/\3')
Out[6]: '1991/02/28'

你可能感兴趣的:(有用的python代码片段)