前引:演算法就是高效解決問題的辦法
演算法之二分法
需求:有乙個從小到大順序排列的列表,如何高效的找到其中乙個值
方案一、for迴圈(遍歷效率太低)
for num in nums:
if num == find_num:
print('find it')
break
方案
二、二分法
list1 = [1,4,5,6,7,8,9,10,15,48,98,99,789,10000]
def twocut_serch(find_num,fine_list):
print(fine_list)
if fine_list==:
print("找不到")
return
mid =len(fine_list)//2
half_num = fine_list[mid]
if half_num>find_num:
#查左邊
twocut_serch(find_num,fine_list[:mid])
elif half_num1:])
else:
print("找到了")
twocut_serch(2,list1)
在我們寫**的時候我們從何入手,不同的思想會讓我們有不同的著重點。
面向過程和函式式便是眾多程式設計思想中的兩個流派
強調:不同的正規化應用於不同場景他們本身沒有好壞之分
面向過程的重點就是過程,做一件事要先做什麼,後做什麼,類似於流水線
優點:講複雜的問題流程化,簡單化
缺點:程式的可擴充套件性差,因為一套流程通常是死的,我們通常不能用a流程去完成b事物
應用場景:面向過程的程式設計一般用於那些功能一旦實現之後就很少需要改變的場景, 如果你只是寫一些簡單的指令碼,去做一些一次性任務,用面向過程去實現是極好的,但如果你要處理的任務是複雜的,且需要不斷迭代和維護, 那還是用物件導向最為方便。
函式式程式設計並非用函式程式設計這麼簡單,而是將計算機的運算視為數學意義上的運算,比起面向過程,函式式更加注重的是執行結果而非執行的過程,代表語言有:haskell、erlang。而python並不是一門函式式程式語言,但是仍為我們提供了很多函式式程式設計好的特性,如lambda,map,reduce,filter
1 .def定義有名函式
#func是存放函式的記憶體位址的名字
def func(x):
return x
2 .lambda
#匿名函式定義
#lambda 引數1,引數2...:返回值
lambda x,y:x+y
def func(x,y):
return x+y
#函式呼叫
res = (lambda x,y:x+y)(1,2)
#匿名函式由於沒有名字的特性,所以如果不繫結名字的話,在函式定義結束後就被當做垃圾**了,
#所以通常情況下都是直接在定義時執行函式,通常用做其他函式連用
func(1,2)
3.匿名函式和內建函式的應用
需求:定義乙個字典,取出其中value最大的key和value最小的key
dict1 =
#max,min的工作原理都是迭代器
#取出其中value最大的key
#max的第乙個值(需要找最大值的可迭代物件,如果是字典,找最大key)
res = max(dict1 key=lambda k:dict1[k])
#取出其中value最大的key
res = min(dict1 key=lambda k:dict1[k])
#補充 sorted排序
sorted(dict1)#預設給key排序,得到乙個列表
map,reduce,filter(了解知識)
map
#map = 對映
#把乙個可迭代物件的每乙個值拿出來當做函式的引數執行一次
l = [1,2,3,4]
res = map(lambda x:x**2,l)
#res是乙個迭代器,它裡面存放著l的每乙個元素的平方
reduce
#reduce函式可以接收三個引數,乙個是函式,第二個是可迭代物件,第三個是初始值
from functools import reduce
l = [1,2,3,4]
res = reduce(lambda x,y:x+y,l)
print(res)
>>>10
#1 沒有初始值,reduce函式會先迭代一次array得到的值作為初始值,作為第乙個值數傳給x,
#然後繼續迭代一次l得到的值作為第二個值傳給y,運算的結果為3
#2 將上一次reduce運算的結果作為第乙個值傳給x,然後迭代一次l得到的結果作為第二個值傳給y,
#依次類推,知道迭代完l的所有元素,得到最終的結果10
filter
#過濾列表l
l = [1,2,3,4]
res = filter(lambda x:x>3,l)
#filter會迭代列表l把得到的值傳給匿名函式,如果得到結果為真,則過濾出該元素,得到乙個迭代器
res >>> 4
模組就是一系列功能的集合體,分為三大類
內建模組
第三方模組
自定義模組(乙個py檔案本身就是乙個模組,檔名:m.py,模組名:m)
ps:模組有四種形式
1 使用python編寫的.py檔案
2 已被編譯為共享庫或dll的c或c++擴充套件
3 把一系列模組組織到一起的資料夾(注:資料夾下有乙個__init__.py檔案,該資料夾稱之為包)
4 使用c編寫並鏈結到python直譯器的內建模組
原因一、內建和第三方模組拿來就用,無需定義,這種拿來主義,可以極大的提公升自己的開發效率
原因二、自定義模組
好處是減少了**冗餘
3.1第一次匯入模組會發生3件事情:
產生該模組的的命名空間,將foo.py執行過程中產生的名字傳給foo的命名空間中
執行foo.py
在當前檔案內產生乙個名字foo,把名字指向1中的命名空間
ps:重複匯入不會重複執行**
3.2引用:
引用foo內的變數:foo.x
引用foo內的函式:foo.get()
ps:此處對foo.py引用的名字不會和當前命名空間衝突
ps:可以用分隔符同行匯入多個模組(不建議使用)
3.3匯入模組的規範:
前:python內建模組
中:第三方模組
後:程式設計師自定義模組
模組和面向過程程式設計
一 模組介紹 一 可以被當作指令碼去執行 二 可以被當作模組匯入 1,什麼是模組 模組是一系列功能的集合體 常見的模組形式 自定義模組,第三方模組,內建模組 1 乙個module.py檔案就是乙個模組,檔名是module.py,而模組名是module 2 乙個包含有 init py檔案的資料夾也是模...
面向過程程式設計與模組
1 面向過程程式設計 核心是過程二字,過程是指解決問題的步驟,即先幹什麼,然後幹什麼 基於該思想編寫程式就好比在設計一條流水線,是一種機械式的思維方式 優點 複雜的問題流程化,進而簡單化 缺點 擴充套件性極差 2 模組的使用 1 什麼是模組?模組是一些列功能的集合體,常見的模組形式 自定義模組,第三...
面向過程程式設計,模組簡介
面向過程 核心是過程二字,即先幹什麼,在幹什麼,最後幹什麼 eg 把大象放冰箱分幾步?1.開啟冰箱門 2.把大象塞進去 3.把冰箱門關上 面向過程不是一門技術,是一種做事的思想 註冊使用者的功能 1.獲取使用者名稱和密碼 2.驗證引數 3.儲存資料 面向過程的缺點 擴充套件性很差 面向過程的優點 複...