python高級編程和算法

import copy
#a = ("a","b","c")
#a = ["a","b","c"]
a = {"a","b","c"}
b  =a
c = copy.copy(a)
d = copy.deepcopy(a)

# print(b)
# print(c)
# print(d)
# print(id(b))
# print(id(c))
# print(id(d))
"""
考點:
    1.可變對象:列表和字典
    2.不可變對象:一旦建立就不可修改的對象:元組,字符串,數字
"""
class Person: #類對象
    x = 5
    y = 6
    def __init__(self,x,y):
        self.x = x
        self.y = y
        print(self.x)
        print(self.y)
    def add(self):
        return self.x +self.y
#實例對象
p = Person(1,2)
p.z = 9 # 實例變量
# print(p.z)
# #p1 = Person(3,4)
# print(Person.add(Person(3,4)))
# print(p.add())
# print("-------------------------")
# print(p.z)
# print(p.x) #實例變量
# print(p.y) #實例變量
# print("************************************")
# print(Person.x) # 類變量
# print(p.add())
"""
考點: 
    1.類對象和實例對象
    2.類變量和實例變量
"""

# a *args **kwargs
def function(a,*args,**kwargs):
    print(type(a))
    print(type(args))
    print(type(kwargs))
    print(a)
    print(args)
    print(kwargs)
# function(1,1,1)
# function(6,7,8,9,b=2,c=3,d=4)

"""
考點:
    1.位置必須是必定的a,*args,**kwargs
    2.類型分別是int,tuple,dict
"""

import time
def runtime(function):
    def get_now_time():
        print(time.time())
        function()
    return get_now_time
@runtime
def run():
    print("run")

def runtime1(function):
    def get_now_time(*args):
        print(time.time())
        function(*args)
    return get_now_time
@runtime1
def run1(i):
    print(i)
#run()
#run1(1)
# print("___________________________________")

def runtime3(function):
    def get_now_time(**kwargs):
        print(time.time())
        function(**kwargs)
    return get_now_time
@runtime3
def run3(**kwargs):
    print(kwargs)
#run3(a="aaa")

def runtime4(function):
    def get_now_time(name,**kwargs):
        print(time.time())
        function(name,**kwargs)
    return get_now_time

@runtime4   
def run4(name,**kwargs):
    print("名字==",name)
    print(kwargs)


#run4("jiyanjiao",a="haha")

"""
考點:
    1.裝飾器寫法
    2.不帶參數裝飾器
    3.帶參數的裝飾器
"""

def func1():
    for i in range(1,5):
        return i

def func2():
    for i in range(1,5):
        yield i
# print(func1())
# print(func2())

# yi = func2()
# for i in yi:
#     print(i)

# print("**************************")

re =func2()
# for i in re:
#     print(i)

"""
考點:
    1.yield 與 return區別
    2.yield:生成器類型
"""

# 題目:根據一個列表,建立一個新的列表,用一行代碼
# lambada表達式 推導式

list1 = [1,2,3,4]
result = map(lambda x: x*x,list1)
# print(list(result))
# print("&&&&&&&&&&&&&&&&&&&&&&&&&&")
# 用推導式來解決,列表推導式
list2 = [i*i for i in list1]
#print(list2)

list3 = [i*i for i in list1 if i>2]
#print(list3)

# 集合的推導式    打印結果無序,由於集合是無序的
list1 = {1,2,3,4}
list4 = {i*i for i in list1}
#print(list4)

#字典的推導式
dict1 = {
    "key1":"value1",
    "key2":"value2"
}
keys = [key for key ,value in dict1.items()]
#print(keys)

key_value = {key:value for key,value in dict1.items()}
#print(key_value)

key_value_if = {key:value for key,value in dict1.items() if key=="key1"}
#print(key_value_if)
"""
考點:
    1.推導式 [表達式,for循環,條件]
"""

'''
常見排序方式:
    插入排序,希爾排序,直接排序,堆排序
    冒泡排序,快速排序,歸併排序,基數排序
'''
# 給定一個列表,將這個列表進行排序,要求:時間複雜度要小於o(n^2)

'''
複雜度:
    1.時間複雜度:指算法在計算的過程當中所須要的計算工做量
    2.空間複雜度:指算法在計算過程當中所須要的內存空間
常見的時間複雜度:
    常數階O(1),對數階O(log2n),線性階O(n)
    線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3)
    隨着問題的規模n,不斷的增大,上述的時間複雜度就不斷的增大,意味着算法的執行效率越低
'''

#冒泡排序的實現
# 相鄰的兩個數字進行比較,大的向下沉,最後一個元素時最大的
# 時間複雜度O(n^2)

def bublle_sort(blist):
    count = len(blist)
    for i in range(0,count):
        for j in range(i+1,count):
            if blist[i] > blist[j]:
                blist[i],blist[j] = blist[j],blist[i]
    return blist

blist = [8,5,90,31,1]
s = bublle_sort(blist)
#print(s)

"""
快速排序:
    思想:遞歸
    列表中取出第一個元素做爲標準,把比第一個元素小的都放在左側,把比第一個元素大的都放在右側
    最小的在左邊,最大的在右邊,遞歸完成即排序結束
時間複雜度:O(nlog2n)                          
"""
# 使用遞歸+推導式寫快速排序

def quick_sort(quick_list):
    if quick_list==[]:
        return []
    else:
        first  = quick_list[0]
        less = quick_sort([l for l in quick_list[1:] if l < first])
        more = quick_sort([m for m in quick_list[1:] if m >=first])
        return less + [first] + more
quick_list = [8,5,90,31,1]
print(quick_sort(quick_list))
相關文章
相關標籤/搜索