一些好玩的Python片段


Python特殊语法:filter、map、reduce、lambda

filter(function, sequence)对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def f(x): return x != ‘a’
>>> filter(f, “abcdef”)
‘bcdef’

map(function, sequence)对sequence中的item依次执行function(item),见执行结果组成一个List返回
>>> def cube(x): return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def cube(x) : return x + x

>>> map(cube , “abcde”)
[‘aa’, ‘bb’, ‘cc’, ‘dd’, ‘ee’]
另外map也支持多个sequence,这就要求function也支持相应数量的参数输入:
>>> def add(x, y): return x+y
>>> map(add, range(8), range(8))
[0, 2, 4, 6, 8, 10, 12, 14]

reduce(function, sequence, starting_value)对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:
>>> def add(x,y): return x + y
>>> reduce(add, range(1, 11))
55 (注:1+2+3+4+5+6+7+8+9+10)
>>> reduce(add, range(1, 11), 20)
75 (注:1+2+3+4+5+6+7+8+9+10+20)

lambda:这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方
>>> g = lambda x: x * 2
>>> g(3)
6
>>> (lambda x: x * 2)(3)
6

参考链接:
python自动给数字前面补0的方法

python中有一个zfill方法用来给字符串前面补0,非常有用

n = "123"
s = n.zfill(5)
assert s == "00123"

zfill()也可以给负数补0

n = "-123"
s = n.zfill(5)
assert s == "-0123"

对于纯数字,我们也可以通过格式化的方式来补0

n = 123
s = "%05d" % n
assert s == "00123"
实际测试效果如下:
>>> n=”123″
>>> n
‘123’
>>> s = n.zfill(5)
>>> s
‘00123’
>>>
>>> p=”-123″
>>> p
‘-123’
>>> q = p.zfill(5)
>>> q
‘-0123’
>>>
>>> x=123
>>> y = “%05d” % x
>>> y
‘00123’


Python中对列表进行排序
1、sort()函数

sort()函数使用固定的排序算法对列表排序。sort()函数对列表排序时改变了原来的列表,从而让其中的元素能按一定的顺序排列,而不是简单的返回一个已排序的列表副本。

注意sort()函数改变原来的列表,函数返回值是空值即None。因此,如果需要一个已排好序的列表副本,同时又要保留原有列表不变的时候,就不能直接简单的使用sort()函数。为了实现上述功能使用sort()的方法是:先获取列表X的副本Y,然后再对Y进行排序。代码如下:

x=[4,6,2,1,7,9,4]
y=x[:]
y.sort()
print x
print y

结果:
[4, 6, 2, 1, 7, 9, 4]
[1, 2, 4, 4, 6, 7, 9]

说明:调用x[:]得到的是包含了x所有元素的分片,这是一种很有效率的复制整个列表的方法。通过y=x简单的将x复制给y是没有用的,因为这样做就让x和y都指向了同一个列表了。

2、sorted()函数

另外一种获取已排序的列表副本的方法是使用sorted()函数。注意,sorted()函数可以用于任何可迭代的对象。

x=[4,6,2,1,7,9,4]
y=sorted(x)
print x
print y
#结果:
[4,6,2,1,7,9,4]
[1,2,4,4,6,7,9]
实际测试结果如下:
>>> x=[4,6,2,1,7,9,4]
>>> y=sorted(x)
>>> print x
[4, 6, 2, 1, 7, 9, 4]
>>> print y
[1, 2, 4, 4, 6, 7, 9]
>>>
>>> x=[4,6,2,1,7,9,4]
>>> y=x[:]
>>> print y
[4, 6, 2, 1, 7, 9, 4]
>>> y.sort()
>>> print x
[4, 6, 2, 1, 7, 9, 4]
>>> print y
[1, 2, 4, 4, 6, 7, 9]
# 生成100个0到100的随机数,并挑出其中大于40小于60的
>>> from random import random
>>> [y for y in [randint(x-x, 100) for x in range(100)] if 40<y<60]
[42, 47, 49, 50, 52, 58, 41, 46, 49, 50, 51, 51, 55, 42, 52, 48, 53, 56]
>>> [y for y in [randint(x-x, 100) for x in range(100)] if 40<y<60]
[56, 52, 45, 52, 42, 54, 42, 50, 55, 48, 57, 53, 44, 46, 42, 53, 48, 44, 50, 49]

调用WindowsAPI锁定计算机;读取zip压缩文件
#!/usr/bin/env python
#-*- coding:cp936 -*-
'''调用WindowAPI锁定计算机'''
import ctypes
dll = ctypes.WinDLL('user32.dll')
dll.LockWorkStation()


import os, sys

#中文字符集
def encodeChinese(msg):
    type = sys.getfilesystemencoding()
    return msg.decode('UTF-8').encode(type)

#检测文件后缀,返回文件后缀
def check_fileMode(fileName):
    fPostfix = os.path.splitext(fileName)[1]
    return fPostfix

#打开一个图片文件
def open_imgFile(fileName):
    im = Image.open(fileName)
    im.load()
    return im

import zipfile
z = zipfile.ZipFile("20140801.zip", "r")
#打印zip文件中的文件列表
for filename in z.namelist():
    print 'File:', filename

#读取zip文件中的第一个文件
first_file_name = z.namelist()[0]
content = z.read(first_file_name)	#读取zip压缩文件中指定文件的内容
print first_file_name
print content


def Fibonacci_s(n):
    Fb = []
    a, b = 0, 1
    while b<n:
        Fb.append(b)
        a, b = b, a+b
    return Fb
print Fibonacci_s(1000)	#打印1000以内的斐波纳挈数列
用Python画心形图像的4种公式/方法
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

'''
'17*x^2 - 16*|x|*y + 17*y^2 = 225'
'''
X = np.arange(-5.0, 5.0, 0.1)
Y = np.arange(-5.0, 5.0, 0.1)
x, y = np.meshgrid(X, Y)
f = 17 * x ** 2 - 16 * np.abs(x) * y + 17 * y ** 2 - 225
fig = plt.figure()
cs = plt.contour(x, y, f, 0, colors = 'r')
plt.show()


'''
'(x^2+y^2+y)^2 = x^2 + y^2'
'''
X = np.arange(-2.0, 2.0, 0.05)
Y = np.arange(-2.0, 2.0, 0.05)
x, y = np.meshgrid(X, Y)
f = (x ** 2 + y ** 2 + y) ** 2 - x ** 2 - y ** 2
fig = plt.figure()
cs = plt.contour(x, y, f, 0, colors = 'r')
plt.show()


'''
'8*x^2 - 9*|x|*y + 8*y^2 = 17'
'''
X = np.arange(-2.5, 2.5, 0.05)
Y = np.arange(-2.5, 2.5, 0.05)
x, y = np.meshgrid(X, Y)
f = 8 * x ** 2 - 9 * np.abs(x) * y + 8 * y ** 2 - 17
fig = plt.figure()
cs = plt.contour(x, y, f, 0, colors = 'r')
plt.show()


'''
'(x^2 + y^2 - 1)^3 - x^2*y^3 = 0'
'''
import math
X = np.arange(-2.0, 2.0, 0.05)
Y = np.arange(-2.0, 2.0, 0.05)
x, y = np.meshgrid(X, Y)
f = (x ** 2 + y ** 2 - 1) ** 2 * (x ** 2 + y ** 2 - 1)- x ** 2 *  y ** 2 * y
fig = plt.figure()
cs = plt.contour(x, y, f, 0, colors = 'r')
plt.show()
用Python统计特定目录下指定文件类型的总行数

程序很简单,主要是先用“os.walk(dir)”获取特定目录下所有的文件,再判断文件类型,最后用“enumerate”统计文件行数,以此循环累加出总行数。代码如下:

#!/usr/bin/env python
#coding=utf-8
import os

dir = "E:/test"	#要统计的指定目录
file_types = ('.php', '.py')	#要统计的文件类型

def linecount(filepath):
	count = -1	#最后一般有空行
	for count, line in enumerate(open(filepath, 'rU')):
		pass
	count += 1
	return count

def scan_dir(dir):
	num = 0
	for roots, dirs, files in os.walk(dir):
		for file in files:
			name, type = os.path.splitext(file)
			if type in file_types:
				filepath = os.path.join(roots, file)
				num += linecount(filepath)
	print num

if __name__ == '__main__':
    scan_dir(dir)

参考链接:
http://dhq.me/python-count-file-line

Python用筛法生成素数
#!/usr/bin/env python
# coding=utf-8
from time import time
LIMIT=10**7
t0=time()

def primes(n):
	p = [1] * (n/2)
	for i in xrange(3, int(n**0.5)+1, 2):
		if p[i/2]:
			p[i*i/2::i] = [0] * ((n-i*i-1)/(2*i)+1)
	return [2] + [2*i+1 for i in xrange(1,n/2) if p[i]]

def allPrime(maxNum):
	aList = range(0, maxNum)
	def _do(aPrime):
		for i in xrange(aPrime, maxNum, aPrime):
			aList[i] = 0
		return aPrime
	return map( _do, (i for i in xrange(2, maxNum) if aList[i]) )

print len( primes(LIMIT) )
print (time()-t0)

t1=time()
print len( allPrime(LIMIT) )
print (time()-t1)
打开浏览器访问URL
#!/usr/bin/env python
# coding=utf-8
import webbrowser as web
import re
import urllib
import time
import os
def spider(url, urlpattern):
	urls=getURLs(url, urlpattern)
	for url in urls:
		visitURL(url)
def visitURL(url):
	print(url)
	web.open(url, 1, False)
	time.sleep(5)
def getURLs(url, urlpattern):
	urls=[]
	response=urllib.urlopen(url)
	html=response.read()
	pattern=re.compile(urlpattern)
	urls=pattern.findall(html)
	urls=list(set(urls))
	return urls

if __name__=="__main__":
	urls={
		"http://ixyzero.com/blog/":r'http://ixyzero.com/blog/archives/d{1,3}.html'
		}
	for i in range(1, 10):
		for url, urlpattern in urls.items():
			print url, urlpattern
			spider(url, urlpattern)
		print("Blogs has been refreshed for ", i, " times")
		os.system("taskkill /F /IM chrome.exe")	#这里假设系统的浏览器默认为Chrome,但实际情况可能不是
倒计时功能示例
#!/usr/bin/env python
#coding=utf-8
import time, sys
count = 0
while (count < 10):
	ncount = 10 - count
	sys.stdout.write("r%2d" % ncount)
	sys.stdout.flush()
	time.sleep(1)
	count += 1
用qrcode生成二维码
import qrcode
qr = qrcode.QRCode(
	version=2,
	error_correction=qrcode.constants.ERROR_CORRECT_L,
	box_size=10,
	border=1
)
qr.add_data("http://ixyzero.com/")
qr.make(fit=True)
img = qr.make_image()
img.save("crazyofme_qrcode.png")
Python获取当前计算机的cpu数量
from multiprocessing import cpu_count
print(cpu_count())
Python删除一个非空文件夹
import shutil
shutil.rmtree('c:\test')
print 'ok'
Python list 判空

判断一个 list 是否为空–传统的方式:

if len(mylist):
    # Do something with my list
else:
    # The list is empty

由于一个空 list 本身等同于 False,所以可以直接:

if mylist:
    # Do something with my list
else:
    # The list is empty

参考http://blog.csdn.net/yelbosh/article/details/7558981

Python一句代码实现全排列
from itertools import permutations
print(list(permutations([1, 2, 3])))

 

,

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注