遞歸函數
-
什么是遞歸
在函數中調用本身的函數被稱為遞歸函數
遞歸的作用:循環可以做的事情遞歸函數都可以做,
如果循環可以做,就不要用遞歸怎么用遞歸來解決實際問題
第一步:確定臨界值 - 循環結束的條件,在臨界值的位置讓遞歸函數結束
第二步:找關系 - 找當次循環和上次循環的關系
? 找f(n)和f(n-1)的關系
第三步:假設函數f的功能已經實現,通過f(n-1)來實現f(n)的功能-
循環能做的事情不能使用遞歸做
# 1+2+3+4+5+6+···+n def ff_sum(n): # 1.找臨界值 if n == 1: return 1 # 2.找關系 # ff_sum(n):1+2+3+···+n # ff_sum(n-1):1+2+3+···+n-1 return ff_sum(n - 1) + n print(ff_sum(100))
模塊
-
什么是模塊
在python中一個py文件就是一個模塊
a.系統模塊(標準庫) - 系統提供的模塊(安裝解釋器時已經導入到解釋器中,使用的時候在代碼中直接的導入)
random - 提供隨機數
math - 提供數學運算
json庫 - 提供json相關操作
re模塊 - 提供正則表達式相關操作
socket模塊 - 提供python的套接字編程
time模塊 - 時間操作
threading - 提供多線程操作
b.自定義模塊(第三方庫) - 自己創建的py文
自己寫的
別人寫的(第三方庫) - 需要先下載到解釋器中,然后才能在代碼中導入標準庫和第三方庫一般是通過模塊提供變量和類
怎么使用模塊
import 模塊名 --- 直接導入指定的模塊,導入后可以使模塊中所有的全局變量(包含了變量、函數和類)
? 導入后通過哦'模塊名.變量'來使用模塊中的內容
from 模塊名 import 變量1, 變量2, - 在程序中導入指定的模塊,導入后只能使用import后面的變量
? 導入后直接使用變量
from 模塊名 import * -- 導入模塊,并且可以直接使用里面的全局變量,導入模塊的實質
a.無論是那種導入模塊的方法,導入模塊的時候都會執行模塊中所有的代碼
b.python中一個模塊不會重復導入多個模塊,系統會自動檢測當前模塊是否已經導入-
怎么阻止模塊中的內容被其他模塊執行
將不希望被其他模塊執行的代碼放在if語句中
if __ name__ == 'main'
如果希望被其他模塊執行的代碼就放在if語句的外面原理:
每個模塊都有一個屬性__ name__屬性,屬性默認的值是這個py文件的文件名
當當前模塊正在被執行(直接執行)的時候,模塊的屬性__ name__的值就會變成__ main __ -
5.重命名 - 導入模塊的時候可以對模塊或者模塊中的內容重新命名
import 模塊名 as 新模塊名
from 模塊名 import 變量1 as 新變量1, 變量2 as 新變量2, 變量3
通配符不支持重命名
迭代器
什么是迭代器
是python提供的容器型數據類型
獲取迭代器中的元素的時候只能從前往后一個一個的取,而且取了之后這個元素在迭代器中就不存在了-
迭代器的字面量
迭代器沒有指定格式的字面量。迭代器作為容器,里面的元素只能通過將其他序列轉換或者通過生成器生成list1 = [1, 2, 3, 4] # 將字符串轉換成迭代器,迭代器中的元素就是字符串的每個字符 iter1 = iter('hello') # 將列表串轉換成迭代器,迭代器中的元素就是列表中的每個元素 iter2 = iter(list1) iter3 = iter({'name': '小明', 'age': 18}) print(iter1) print(iter2) print(iter3)
-
獲取元素
迭代器中的元素只支持查,不支持增刪改
迭代器是通過next函數獲取單個元素,for-in遍歷一個一個的獲取所有的元素。
不管是那種方式獲取,已經獲取的元素在迭代器中就不存在了next(迭代器) --> 獲取迭代器中最新的數據(最頂層的數據)
# 練習:看打印結果 iter4 = iter([10, True, 'abc', 1, 2]) index = 0 for x in iter4: index += 1 if index == 2: break print(next(iter4)) """ index = 0 x = 10 iter4 = True, 'abc', 1, 2 index = 1 x = True iter4 = 'abc', 1, 2 """
生成器
什么是生成器
生成器就是迭代器,迭代器不一定是生成器-
生成器是怎么產生元素的
調用一個帶有yield的關鍵字函數就能得到一個生成器不帶yield的函數:調用的時候會執行函數體,并且會獲取返回值
帶yield的函數:調用的時候不會執行函數體,也不會獲取返回值,而是產生一個生成器(函數調用表達式就是一個生成器)
? 這個生成器中的元素就是yield關鍵字后面的值def func1(): print('=========') return 100 func1() print(func1()) # ========= # 100 def func2(): print('==========') return 100 yield print(func2()) # <generator object func2 at 0x0000027F9599A830> """ 3.生成器的元素 生成器中的元素也是通過next 或 for in 生成器獲取元素實質就是去執行生成器對應的函數, 每次執行到yield語句為止,并且會將yield后面的值作為當次獲取到的元素 下次獲取元素的時候會接著上次結束的位置往后執行,知道下一個yield···· 以此類推,知道函數結束。如果執行到函數結束,沒有遇到yield,那么就會報錯'Stop異常' """ def func3(): print('``````') yield 100, 200 print('!!!!!!!') yield 300 # gen1 = func3() # gen1就是一個生成器(生成器就是迭代器) # next() # print(gen1) # re = next(gen1) # print(type(re), re) # print('第一次結束') # # re = next(gen1) # print(re, type(re)) # for x in gen1: # print(x) # py1809001 - 80 def create_num(): num = 1 while True: yield 'py1809%d' % num num += 1 num_gen = create_num() for _ in range(10): print(next(num_gen)) print('上課了') print(next(num_gen))