PulP線性優化(三)python編碼
本文根據PuLP文件翻譯而來,原文請參考
https://pythonhosted.org/PuLP/main/basic_python_coding.html
基本的Python編碼
在本課程中,您將學習Python中的基本程式設計,但也可以在Internet上免費獲得優秀的Python語言參考資料。您可以下載Dive Into Python這本書, 或者 在Python網站上有許多Python 初學者指南。點選以下連結:
取決於您當前的程式設計知識水平。下面的程式碼部分假定了基本程式設計原理的知識,並主要關注特定於Python程式設計的語法。
注意:>>>表示Python命令列提示符。
Python中的迴圈
for迴圈
一般格式是:
為 變數 在 序列:
#some命令
#other for迴圈之後的命令
請注意,格式(縮排和新行)控制for迴圈的結束,而迴圈的開頭是冒號:。
觀察下面的迴圈,這類似於您將在課程中使用的迴圈。變數i通過字串列表依次變為每個字串。頂部是.py檔案中的程式碼,底部顯示輸出
#以下程式碼演示了一個列表,其中包含字串
ingredientslist = [ “Rice” ,“Water” ,“Jelly” ]
for i in ingredientslist :
print i
print “不再在迴圈中”
輸出
Rice
Water
Jelly
No longer in the loop
while迴圈
這些類似於for迴圈,除了它們繼續迴圈,直到指定的條件不再為真。沒有告訴while迴圈通過任何特定的序列。
i = 3
while i <= 15:
# some commands
i = i + 1 # a command that will eventually end the loop is naturally
required
# other commands after while loop
對於這個特定的簡單while迴圈,最好做一個for迴圈,但它演示了語法。如果迴圈之前的迭代次數需要結束,while迴圈是有用的,是未知的。
if語句
這與上面的迴圈非常相似。鍵識別符號是冒號:啟動語句和縮排結束以結束它。
if j in testlist:
# some commands
elif j == 5:
# some commands
else:
# some commands
這裡顯示“elif”(else if)和“else”也可以在if語句之後使用。事實上,“else”可以在兩個迴圈之後以相同的方式使用。
python中的陣列型別
列表
列表只是一組變數組合在一起。範圍函式通常用於建立整數列表,具有範圍的一般格式(開始,停止,步驟)。start的預設值為0,步驟的預設值為1。
>>> range(3,8)
[3,4,5,6,7]
這是一個列表/序列。除了整數之外,列表中還可以包含字串或整數,浮點數和字串。它們可以通過迴圈(如下一節所示)或通過顯式建立(如下所示)建立。請注意,print語句將向用戶顯示字串/變數/ list / ….
>>> a = [5,8,"pt"]
>>> print a
[5,8,'pt']
>>> print a[0]
5
元組
元組與列表基本相同,但重要的區別在於它們一旦建立就無法修改。它們由以下人員分配:
>>> X = (4 ,1 ,8 ,“字串” ,[ 1 ,0 ],(“J” ,4 ,“○” ),14 )
元組可以在其中包含任何型別的數字,字串,列表,其他元組,函式和物件。另請注意,元組中的第一個元素編號為元素“零”。訪問此資料的方法是:
>>> x[0]
4
>>> x[3]
“string”
字典
字典是每個具有關聯資料的引用鍵列表,其中該順序根本不影響字典的操作。對於字典,鍵不是連續的整數(與列表不同),而是可以是整數,浮點數或字串。這將變得清晰:
>>> x = {} #建立一個新的空字典 - 注意花括號表示建立字典
>>> x [4] = "programming" #字串“programming”被新增到字典x中,"4"作為key
>>> x["games"] = 12
>>> print x["games"]
12
在字典中,引用鍵和儲存的值可以是任何型別的輸入。新詞典元素在建立時新增(使用列表,您無法訪問或寫入列表中超出最初定義的列表維度的位置)。
costs = {"CHICKEN": 1.3, "BEEF": 0.8, "MUTTON": 12}
print "Cost of Meats"
for i in costs:
print i
print costs[i]
costs["LAMB"] = 5
print "Updated Costs of Meats"
for i in costs:
print i
print costs[i]
輸出
Cost of Meats
CHICKEN
1.3
MUTTON
12
BEEF
0.8
Updated Costs of Meats
LAMB
5
CHICKEN
1.3
MUTTON
12
BEEF
0.8
在上面的示例中,使用大括號和冒號建立字典以表示將資料分配給字典鍵。變數i依次分配給每個鍵(與列表中的變數相同)
>>> for i in range(1,10)
然後使用此鍵呼叫字典,並返回儲存在該鍵名下的資料。使用詞典的這些型別的for迴圈與使用PuLP在本課程中對LP進行建模高度相關。
List / Tuple / Dictionary語法
建立方法:
- 列表用方括號[];
- 元組用圓括號和逗號(,)完成;
- 字典是用括號{}完成的。
但是,在建立之後,當訪問list / tuple / dictionary中的元素時,操作總是用方括號執行(即a [3]?)。如果a是列表或元組,則返回第四個元素。如果a是字典,它將返回使用引用鍵3儲存的資料。
列表生成式
Python支援List Comprehensions,這是一種快速而簡潔的方法,可以在不使用多行的情況下建立列表。在簡單的情況下,它們很容易理解,並且您將在本課程的程式碼中使用它們。
>>> a = [i for i in range(5)]
>>> a
[0, 1, 2, 3, 4]
上面的語句將建立列表[0,1,2,3,4]並將其分配給變數“a”。
>>> odds = [i for i in range(25) if i%2==1]
>>> odds
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23]
上面的語句使用if語句和模數運算子(%),因此列表中只包含奇數:[1,3,5,…,19,21,23]。(注意:模數運算子從整數除法計算餘數。)
>>> fifths = [i for i in range(25) if i%5==0]
>>> fifths
[0, 5, 10, 15, 20]
這將建立一個列表,其中包含每個第五個值[0,5,10,15,20]。現有列表也可用於建立以下新列表:
>>> a = [i for i in range(25) if (i in odds and i not in fifths)]
請注意,這也可以從頭開始一步完成:
>>> a = [i for i in range(25) if (i%2==1 and i%5==0)]
對於挑戰,您可以嘗試建立
- 一個素數列表,最多100個,和
- 所有“完美”數字的列表。
其他重要的語言特性
Python的註釋
使用”” “開始並結束評論部分,在檔案頂部進行評論。整個程式碼中的註釋是使用行開頭的hash#符號完成的。
匯入語句
在您打算使用PuLP進行建模的所有Python編碼的頂部,您將需要import語句。此語句使您當前正在編寫的模組中的另一個模組(程式程式碼檔案)的內容可用,即您將需要呼叫的pulp.py中定義的函式和值可用。在本課程中,您將使用:
>>> from pulp import *
星號表示您正在從紙漿模組中匯入所有名稱。現在可以呼叫在pulp.py中定義的函式,就好像它們是在您自己的模組中定義的那樣。
函式
Python中的函式定義如下:(def是define的縮寫)
def name(inputparameter1, inputparameter2, . . .):
#function body
對於一個真實的例子,請注意,如果在函式定義中為輸入分配了一個值,這是預設值,並且僅在沒有傳入其他值時才使用。輸入引數的順序(在定義中)不無論如何,只要呼叫該函式,就會以相應的順序輸入位置引數。如果使用關鍵字,引數的順序根本不重要:
def string_appender(head='begin', tail='end', end_message='EOL'):
result = head + tail + end_message
return result
>>> string_appender('newbegin', end_message = 'StringOver')
newbeginendStringOver
在上面的示例中,將列印函式呼叫的輸出。head的預設值是’begin’,但是使用了’newbegin’的輸入。使用了’end’尾部的預設值。並使用endmessage的輸入值。請注意,必須將end_message指定為關鍵字引數,因為沒有給出tail的值
類
要演示類在Python中的工作方式,請檢視以下類結構。
類名是Pattern,它包含幾個與Pattern類的任何例項(即Pattern)相關的類變數。功能是
init
函式,它建立Pattern類的例項,並使用self分配name和lengthsdict的屬性。
str
函式定義了列印類例項時要返回的內容。
trim
函式就像任何普通函式一樣,除了所有類函式之外,self必須在輸入括號中。
class Pattern:
"""
Information on a specific pattern in the SpongeRoll Problem
"""
cost = 1
trimValue = 0.04
totalRollLength = 20
lenOpts = [5, 7, 9]
def __init__(self,name,lengths = None):
self.name = name
self.lengthsdict = dict(zip(self.lenOpts,lengths))
def __str__(self):
return self.name
def trim(self):
return Pattern.totalRollLength - sum([int(i)*self.lengthsdict[i] for i in self.lengthsdict])
這個類可以這樣使用:
>>> Pattern.cost # The class attributes can be accessed without making an instance of the class
1
>>> a = Pattern("PatternA",[1,0,1])
>>> a.cost # a is now an instance of the Pattern class and is associated with Pattern class variables
1
>>> print a # This calls the Pattern.__str__() function
"PatternA"
>>> a.trim() # This calls the Pattern.trim() function. Note that no input is required.
函式定義中的self是隱式的輸入