1. 程式人生 > >學習Python基礎--------4

學習Python基礎--------4

繼續 附加 return 內存 cap pick 有一個 三元運算 lte

python裝飾器

定義:本質是函數,(裝飾其他函數)就是為其他函數添加附加功能

原則:1。不能修改被裝飾的函數源代碼

   2.不能修改被裝飾的函數的調用

def test1():
    pass
def test2():
    pass

這是兩個函數想為兩個函數添加打印功能,那就在寫一個打印函數然後再調用

def logger():
    print(logging)

def test1():
    pass
    logger()
def test2():
    pass
    logger()
test1()
test2()

裝飾器通過@裝飾器名來調用

def
timer(func): def warpper(*args,**kwargs): start_time = time - time() func() stop_time=time.time() print(the func run time is%s%(stop_time-start_time) return warpper @timmer #裝飾器的調用方式 def test1(): time.sleep(3) print(in the test1) test()

實現裝飾器的知識:

1.函數即變量(定義一個函數就等於把函數體給了函數名)

2.高階函數

  a.把函數名當做一個實參傳給另外一個函數(不修改被裝飾函數源代碼為函數添加功能)

  b.返回之中包含函數名(不修改函數的調用方式)

3.嵌套函數

高階函數+嵌套函數=裝飾器

列表生成式

列表直接生成以後在賦值給a

a= [i*2 for i in rnge(10)]

[0,2,4,6,8,10,12,14,16,18]

生成器:只有在調用時才會生成相應的數據 ,只有一個__next__()方法

b是內存地址

b=[i*2 for i in range(10)]

for i in b:
    print(i)

實現斐波那契的生成器

def fib(max):
    n,a,b = 0,0,1
    while n<max:
        # print(b)
        yield b
        a,b = b,a+b
        #a= b    a =1,b=2, a=b, a=2
        # b = a+b   b= 2+2 = 4
        n= n+1
    return -----------done---------------

# f=fib(10)
g= fib(6)
print(g.__next__())
print("======star loop=====")
for i in g:
print (i)
#如果數據過大無法知道長度需要異常處理
while True:
try:
x= next(g)
print(‘g:‘,x)
except StopIteration as e:
print(‘Generator return value:‘,e.value)
break

生成器的並行

# Author:Zhiyu Su
import time
def consumer(name):
    print(%s 準備吃孢子啦!%name)
    while True:
        baozi = yield
        print(包子[%s]來了,被[%s]吃了%(baozi,name))


c= consumer(chengronghua)
# c.__next__()
# b1= ‘韭菜餡‘
# c.send(b1)
# c.__next__()


def producer(name):
    c= consumer(A)
    c2 = consumer(B)
    c.__next__()
    c2.__next__()
    print(老子包子做好了)
    for i in range(10):
        time.sleep(1)
        print(做了1個包子分了兩半)
        c.send(i)
        c2.send(i)

producer(alex)

叠代器

可以直接作用於for循環的數據類型有以下幾種:

一類是集合數據類型,如listtupledictsetstr等;

一類是generator,包括生成器和帶yield的generator function。

這些可以直接作用於for循環的對象統稱為可叠代對象:Iterable

可以使用isinstance()判斷一個對象是否是Iterable對象:

>>> from collections import Iterable

>>> isinstance([], Iterable)
True

而生成器不但可以作用於for循環,還可以被next()函數不斷調用並返回下一個值,直到最後拋出StopIteration錯誤表示無法繼續返回下一個值了。

*可以被next()函數調用並不斷返回下一個值的對象稱為叠代器:Iterator

可以使用isinstance()判斷一個對象是否是Iterator對象

生成器都是Iterator對象,但listdictstr雖然是Iterable,卻不是Iterator

listdictstrIterable變成Iterator可以使用iter()函數:

因為Python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。

Iterator甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。

python的內置方法

# Author:Zhiyu Su

#print(all([1,-5,3]))#判斷數據是否為真  是返回True 否者返回fale
# print(any[1])
# a = (ascii([1,2,‘說‘]))  #把內存對象變成可打印字符串模式
# print(type(a))
# print(bin(1))  #把數字十進制轉二進制
# bool(90)#判斷真假

# a = bytes(‘abcde‘,encoding=‘utf-8‘)    #二進制
# b = bytearray(‘abcde‘,encoding=‘utf-8‘)   #可修改的二進制
# print(b[1])

# print(a.capitalize(),a)    #首字母大寫

# def ggg():pass
# print(callable(ggg))    

# print(chr(88))  #把數字對應的acsii表反映出來
# print(ord(‘w‘))  #與chr相反

# code = ‘for i in range(10):print(i)‘  #把字符轉換換代碼
# c=compile(code,‘‘,‘exec‘)
# exec(c)
# exec(code)

# dir(x)#查取方法

# divmod()#底板除
# enumerate
# seasons = [‘Spring‘,‘Sunner‘,‘Fall‘,‘winter‘]
#
# print(list(enumerate(seasons)))
#[(0, ‘Spring‘), (1, ‘Sunner‘), (2, ‘Fall‘), (3, ‘winter‘)]

# eval()#數據字典變字符串

# def sayhi(n):
#     print(n)
#
# sayhi(3)
#
# # lambda n:print(n)(5)
# calc = lambda n:3 if n<4 else n    #匿名函數只能進行三元運算
# print(calc(5))


# res= filter(lambda n:n>5,range(10))  #一組數據過濾出你想要的來
# res = map(lambda n:n*2,range(10))
# res=[lambda i:i*2 for i in range(10)]


# import functools
# res = functools.reduce(lambda  x,y:x+y,range(10))#45
# res = functools.reduce(lambda  x,y:x*y,range(1,10))#362880
#
# print(res)

# a = frozenset([1,3,4,5,64,2,5,23,4])#不可變集合

# print(globals())   #整個文件的變量值
# hash( )
# print(hex(255)) #將數字轉為16進制

# def test():
#     local_var = 333
#     print(locals())
# test()
# print(globals())
# print(globals().get(‘local_var‘))

# oct()#轉八進制

# print(pow(3,5))  #3的5次方
# print(round(1.33555,2)) #保留兩位數字

# a = {6:2,8:0,1:4,-5:6,99:11,4:22}
# # print(sorted(a.items()))
# print(sorted(a.items(),key = lambda x:x[1]))
#
# print(a)

# a= [1,2,3,4]
# b= [‘a‘,‘b‘,‘c‘,‘d‘]
# for i in zip(a,b):
#     print(i)

json和pickle數據序列化:把內存的對象變成字符串

json序列化

# Author:Zhiyu Su
import pickle

def sayhi(name):
    print(hello,name)
info = {
    name:alex,
    age:22,
    func:sayhi
}
f=open(test.text,wb)
f.write(pickle.dumps( info))
# print(json.dumps(info))


f.close()

json反序列化

# Author:Zhiyu Su
import json

def sayhi(name):
    print(hello,name)
f = open(test.text,rb)

# data =eval( f.read())
data = json.loads(f.read())

print(data[age])

pickle序列化

# Author:Zhiyu Su
import pickle


def sayhi(name):
    print(hello, name)


info = {
    name: alex,
    age: 22,
    func: sayhi
}
f = open(test.text, wb)
pickle.dump(info, f)  # 等同於f.write(pickle.dumps(info))
f.close()

pickle反序列化

# Author:Zhiyu Su
import pickle

def sayhi(name):
    print(hello,name)
f = open(test.text,rb)

data = pickle.load(f)  # data = pickle.loads(f.read())
print(data[func](alex))

學習Python基礎--------4