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特殊语法:filter、map、reduce、lambda
- Python’s zip, map, and lambda
- How to use Python’s enumerate and zip to iterate over two lists and their indices.
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’
>>> 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])))