1. 程式人生 > >PulP線性優化(三)python編碼

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)]

對於挑戰,您可以嘗試建立

  1. 一個素數列表,最多100個,和
  2. 所有“完美”數字的列表。

更多列表理解示例
維基百科:完美數字

其他重要的語言特性


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是隱式的輸入