本文根據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是隱式的輸入