Python 常見(jiàn)用法(一)
-
一:列表推導(dǎo)
顧名思義就是通過(guò)一個(gè)列表推導(dǎo)出另外一個(gè)
#-*- coding:utf-8 -*-
import time
__author__ = 'Administrator'
#"常用列表賦值"
number = range(100000000)
evens = []
i = 0;
begin = time.time()
while i < len(number):
if i % 2 == 0:
evens.append(i)
i = i + 1;
end = time.time()
print("耗時(shí)為",end-begin)
#"推導(dǎo)公式賦值"
begin = time.time()
evens = [i for i in range(100000000) if i % 2 ==0]
end = time.time()
print("耗時(shí)為",end-begin)
#"結(jié)果分別為: 耗時(shí)為 35.95461106300354"
#" 耗時(shí)為 13.877903461456299"
#還有一種常見(jiàn)的情況 enumerate內(nèi)建函數(shù)函數(shù)
i = 0
seq = ["one","two","three","four"]
for element in seq:
seq[i] = '%d:%s' %(i,seq[i])
seq = ["one","two","three","four"]
for i,element in enumerate(seq):
seq[i] = '%d:%s' %(i,seq[i])
第一種在其他語(yǔ)言中使用這樣賦值會(huì)比較常見(jiàn),但是Python使用這種賦值語(yǔ)句執(zhí)行速度會(huì)比較慢,因?yàn)橥ㄟ^(guò)這種方式解釋程序必須通過(guò)一個(gè)計(jì)數(shù)器跟蹤列處理列表的修改,第二種效率更高同時(shí)更加簡(jiǎn)練涉及到的變量更少,缺陷自然減少。
-
二: 迭代器
1 . 通過(guò) iter() 內(nèi)建函數(shù)構(gòu)建
2 . __next__() 函數(shù)取值(python2 使用的是 next()函數(shù))
line = "helloworld"
itertable = iter(line)
num = 0;
while True:
try:
#num = num+1; 放這里num輸出 11
print(itertable.__next__())
num = num+1; #這里num輸出 10
except StopIteration:
break
print(num)
itertool 是一個(gè)用C語(yǔ)言寫(xiě)的迭代器模塊,據(jù)說(shuō)是最高效的迭代器。
-
三: 生成器
1 . 基于 yield 返回的也是一個(gè)迭代器 (個(gè)人理解yield相當(dāng)于一個(gè)列表緩沖區(qū)暫存數(shù)據(jù),處理完之后返回結(jié)果) 常用在 將返回一個(gè)序列作為循環(huán)時(shí)
def function():
a,b = 0,1
while b < 100:
yield b
a,b = b,a+b
fib = function()
while True:
try:
print(fib.__next__())
num = num+1;
except StopIteration:
break
[print(function.)]
print(num)
iter = (x**2 for x in range(10) if x % 2 ==0 )
# "這種方式生成的也是一個(gè)迭代器"
-
四:裝飾器
- 裝飾函數(shù)
裝飾器使得函數(shù)和方法的封裝(接收一個(gè)函數(shù)返回另一個(gè)功能強(qiáng)大的函數(shù))
def mydecorator(args): #裝飾器函數(shù)的參數(shù) 可以不要
def mydecorator(func): #裝飾器自身實(shí)現(xiàn) 必須要的
def _mydecorator(*arg,**kwargs): ##處理參數(shù),相當(dāng)于再嵌套一層參數(shù)傳遞的函數(shù) 這是固定結(jié)構(gòu)
def wrapper(): #包裝器
## 在調(diào)用時(shí)實(shí)際數(shù)是做一些填充工作 常常用來(lái)檢測(cè)一個(gè)函數(shù)的執(zhí)行時(shí)間
print(func.__name__+" 函數(shù) begin 時(shí)間為:" + str(time.time())+"mydecorator 的參數(shù) " + args)
func(*arg,**kwargs)
print(func.__name__+" 函數(shù)end 時(shí)間為: " + str(time.time()) +"mydecorator 的參數(shù) " + args)
return func
wrapper()
return _mydecorator
return mydecorator
@mydecorator("mycanshu") ## 這是一種比較實(shí)用的方式不改變函數(shù)的內(nèi)在結(jié)構(gòu)把功能加上去 等價(jià)于 myfun = mydecorator(myfun) 其中 mycanshu 是裝飾器的參數(shù)
def myfunc(x,y):
time.sleep(3)
print(1+2+x+y)
myfunc(3,4)
輸出
# "myfunc 函數(shù) begin 時(shí)間為:1501228594.8052733mydecorator 的參數(shù) mycanshu"
# "10"
# "myfunc 函數(shù)end 時(shí)間為: 1501228597.8063107mydecorator 的參數(shù) mycanshu"
- 裝飾類(lèi)
類(lèi)裝飾和函數(shù)裝飾類(lèi)似
class test_deco:
def __init__(self):
print("調(diào)用構(gòu)造函數(shù)")
@staticmethod ##靜態(tài)方法
def show_function():
print("這是靜態(tài)的請(qǐng)求方法")
@staticmethod
def out__function():
print("這是靜態(tài)的解鎖方法")
def mydecorator(cls,myfun_arg):
print(cls.__name__,myfun_arg) #這里輸出的是test_deco myfun_arg
def __mydecorator(func):
print(func.__name__) #這里輸出的是myfun
def __mydecorator(*arg,**kwargs):
print(arg) 這里輸出的時(shí)(1,2)
def wrapper():
print("這里")
print(func.__name__+" 函數(shù) begin 時(shí)間為:" + str(time.time())+" mydecorator 的參數(shù) " + myfun_arg )
cls.show_function()
func(*arg,**kwargs)
cls.show_function()
print(func.__name__+" 函數(shù)end 時(shí)間為: " + str(time.time()) +"mydecorator 的參數(shù) " + myfun_arg)
wrapper()
#分別輸出
'''
這里
myfun 函數(shù) begin 時(shí)間為:1501230826.2434075 mydecorator 的參數(shù) myfun_arg
這是靜態(tài)的請(qǐng)求方法
myfun() show 2
這是靜態(tài)的請(qǐng)求方法
myfun 函數(shù)end 時(shí)間為: 1501230829.2444615mydecorator 的參數(shù) myfun_arg
'''
return __mydecorator
return __mydecorator
@mydecorator(test_deco,"myfun_arg")
def myfun(x,y):
time.sleep(3)
print("myfun() show",x*y)
myfun(1,2)