有用的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 = "xxxxx@xxxx.cn"
_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>...)括住一个群,并命名为year
m = re.search("output_(?P<year>\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 <zipfile> 显示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'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容