本文根据PuLP文档翻译而来,原文请参考
https://pythonhosted.org/PuLP/main/basic_python_coding.html
在本课程中,您将学习Python中的基本编程,但也可以在Internet上免费获得优秀的Python语言参考资料。您可以下载Dive Into Python这本书, 或者 在Python网站上有许多Python 初学者指南。点击以下链接:
取决于您当前的编程知识水平。下面的代码部分假定了基本编程原理的知识,并主要关注特定于Python编程的语法。
注意:>>>表示Python命令行提示符。
一般格式是:
为 变量 在 序列:
#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
这些类似于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 j in testlist:
# some commands
elif j == 5:
# some commands
else:
# some commands
这里显示“elif”(else if)和“else”也可以在if语句之后使用。事实上,“else”可以在两个循环之后以相同的方式使用。
列表只是一组变量组合在一起。范围函数通常用于创建整数列表,具有范围的一般格式(开始,停止,步骤)。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中的元素时,操作总是用方括号执行(即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)]
对于挑战,您可以尝试创建
更多列表理解示例
维基百科:完美数字。
使用”” “开始并结束评论部分,在文件顶部进行评论。整个代码中的注释是使用行开头的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是隐式的输入