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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章