python--基礎知識點梳理(一)

可變數據類型和不可變數據類型有哪些?python

# 可變數據類型:列表、字典、集合
# 不可變數據類型:數字、元祖、字符串

常見數據結構數據結構

# 棧(stack)--先進後出、 隊列(queue)-先進先出、鏈表(LinkedList)

可迭代對象閉包

# 可迭代對象包括:列表、字典、集合、字符串等數據類型。
# 數字類型不可迭代

 

迭代:咱們把python中被for循環取值的操做過程能夠理解爲迭代app

可迭代對象:把能夠被for循環遍歷的對象也叫可迭代對象。一個具備__iter__()方法的對象是可迭代的,具備__next__()方法的對象是迭代器。(__iter__()方法返回本身,__next__()返回for循環的下一個對象,for循環的本質就是不斷調用__next__()方法)函數

迭代器:訪問集合內元素的一種方式。是一個能夠記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。迭代器只能往前不能後退,分步驟的完成某個事情性能

# 迭代器實現斐波那契:                                     
class Fei(object):
    def __init__(self,n):
        self.n=n
        self.num1=0
        self.num2=1
        self.word_index=0
    def __iter__(self):
        return self
    def __next__(self):
        if self.word_index < self.n:
            num=self.num1
            self.num1,self.num2=self.num2,self.num1+self.num2
            self.word_index+=1
            return num
        else:
            raise StopIteration
a=Fei(10)
for i in a:
    print(i,end=" ")            # 0 1 1 2 3 5 8 13 21 34

 

 

判斷是不是可迭代對象ui

#經過isinstance 判斷是不是可迭代對象
from collections import Iterable
def test(name,obj):
#返回布爾值 true 或 false
    flag = isinstance(obj,Iterable)# isinstance 接收兩個參數 第一個是你要判斷的對象 第二個是固定的 Iterable
    print("%s 是不是可迭代對象%s"%(name,flag))
test("字符串","hello")            # True
test("列表",[2,3,5,7,9])           # True
test("數字",10)                  # False
test("range",range(10))          # True

自定義迭代器spa

# 自定義可迭代對象
class Userlist(object):
    def __init__(self):
        self.list_item = []
    def append_item(self,name):
        self.list_item.append(name)
    def func(self):
        #獲取Userlist對象的迭代器
        user_iter = iter(user)
        print(next(user_iter))
        print(next(user_iter))
        print(next(user_iter))
        print(next(user_iter))
        print(next(user_iter))
    # 經過iter 方法返回一個迭代器
    def __iter__(self):
        stu = StuIterable(self.list_item)
        return stu # 返回迭代器
# 自定義迭代器
#一個實現了__iter__方法和__next__方法的對象,就是迭代器。
class StuIterable(object):
    def __init__(self,list_item):
        self.list_item = list_item
        self.current_index = 0    #定義變量,記錄下標位置
    #重寫next 方法返回數據
    def __next__(self):
        if self.current_index<len(self.list_item):
            self.current_index+=1
            return self.list_item[self.current_index-1]
     # 自己是一個迭代器 因此返回本身就好
    def __iter__(self):
        return self
#建立Userlist對象
user = Userlist()
user.append_item("小花")
user.append_item("小明")
user.append_item("小紅")
user.append_item("小麗")
user.append_item("小強")
user.func()

 

生成器:生成器是一個特殊的迭代器,內部封裝了__iter__()方法。在python中一邊循環一邊計算的機制稱爲生成器。好比:列表推導式、yield關鍵字code

# 普通列表推導式
print([i*2 for i in range(10)])        # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 將列表推導式中的方括號改爲小括號就是一個生成器
print((i*2 for i in range(10)))        # <generator object <genexpr> at 0x02D65B30>
# yield生成器實現斐波那契:       沒有yield 他就是個普通的函數,有了yield 就是一個生成器      
def fi(n):
    current_index=0
    num1 = 0
    num2 = 1
    while current_index<n:
        num = num1
        num1,num2 = num2,num1+num2
        print("=======1")
        yield num
        print("=======2")
    return "done"
f = fi(10)
print(next(f))
print(next(f))
print(next(f))

"""
=======1
0
=======2
=======1
1
=======2
=======1
1
"""

yield和return的區別:對象

yield至關於 return 返回一個值,而且記住這個返回的位置,下次迭代時,代碼從yield的下一條語句開始執行。

return會終止當前函數,且不會記住當前位置,下次執行依然從新開始

 

閉包:

首先必須是嵌套函數,外層函數返回內層函數,內層函數應用了外層函數的變量。閉包的應用通常能夠用做裝飾器。

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum        #將定義的函數sum()做爲結果值返回
f = lazy_sum(1, 3, 5, 7, 9)
print(f())          # 25

 

裝飾器:

在不改變被裝飾函數源代碼、被裝飾函數的調用方式的狀況下。爲被裝飾函數增長功能的函數,用@符調用。

 

搜索變量名的優先級:

# LEGB原則:
# 局部做用域local > 嵌套做用域enclosing > 全局做用域global > 內置做用域 built-in

 

函數:是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名便可

python函數的三種傳參方式

# 位置參數(name)
def stu_register(name,age,course):
# 關鍵字參數(指定參數名能夠不按順序傳參)
stu_register(age=22,name='alex',course="python",)
# 非固定參數(*args必須放在**kwargs前面,*args接收列表類型參數,**kwargs接收字典類型參數)
def stu_register(name,age,*args,**kwargs):

python函數的四種類型

# 1. 無參數,無返回值
# 2. 無參數,有返回值
# 3. 有參數,無返回值
# 4. 有參數,有返回值

遞歸:函數在內部調用自身自己,這個函數就是遞歸函數。遞歸的最大層數是998,根據電腦性能CPU決定。

遞歸函數的優勢是定義簡單,邏輯清晰。理論上,全部的遞歸函數均可以寫成循環的方式,但循環的邏輯不如遞歸清晰。 缺點是過深的調用會致使棧溢出

# 遞歸實現斐波那契:
def gui(num):
    if num > 0:
        if num == 1:
            return 0
        elif num == 2:
            return 1
        else:
            return gui(num-1)+gui(num-2)
    else:
        return False
for i in range(1,11):
    print(gui(i),end=" ")           # 0 1 1 2 3 5 8 13 21 34

 

python四大高階函數

 

 lambda匿名函數

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)
相關文章
相關標籤/搜索