基本 Python 编码
在本课程中,您将学习Python的基本编程,但互联网上也有大量优秀的Python语言参考资料可供免费使用。您可以下载《深入Python》<http://www.diveintopython.org/> 一书,或者在Python网站上有许多 初学者指南 可供选择。请点击以下任一链接:
取决于你当前的编程知识水平。下面的代码部分假设你了解基本的编程原则,并主要关注Python编程中的语法细节。
注意:>>> 表示一个 Python 命令行提示符。
Python中的循环
for 循环
一般格式为:
for variable in sequence:
#some commands
#other commands after for loop
注意,格式(缩进和新行)决定了 for 循环的结束,而循环的开始是冒号 :。
观察下面的循环,它类似于你在课程中将使用的循环。变量 i 遍历字符串列表,依次成为每个字符串。上面的部分是 .py 文件中的代码,下面的部分显示了输出。
#The following code demonstrates a list with strings
ingredientslist = ["Rice","Water","Jelly"]
for i in ingredientslist:
print i
print "No longer in the loop"
给出
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
这里展示了在 if 语句之后也可以使用 “elif”(else if)和 “else”。实际上,”else” 同样可以在循环之后使用。
Python 中的数组类型
列表
列表仅仅是变量的序列组合在一起。range 函数常用于创建整数列表,其一般格式为 range(start, stop, step)。start 的默认值是 0,step 的默认值是 1。
>>> range(3,8)
[3,4,5,6,7]
这是一个列表/序列。列表中不仅可以包含整数,还可以包含字符串,或者整数、浮点数和字符串的混合。它们可以通过循环(如下一节所示)或通过显式创建(如下所示)来创建。注意,print 语句将向用户显示字符串/变量/列表/…
>>> a = [5,8,"pt"]
>>> print a
[5,8,'pt']
>>> print a[0]
5
元组
元组基本上与列表相同,但有一个重要的区别,即一旦创建,它们就无法被修改。它们的赋值方式如下:
>>> x = (4,1,8,"string",[1,0],("j",4,"o"),14)
元组可以包含任何类型的数字、字符串、列表、其他元组、函数和对象。还要注意,元组中的第一个元素编号为元素“零”。访问这些数据的方式如下:
>>> x[0]
4
>>> x[3]
"string"
字典
字典是一组引用键及其关联数据的列表,其中顺序完全不影响字典的操作。在字典中,键不是连续的整数(与列表不同),而是可以是整数、浮点数或字符串。这一点将会变得清晰:
>>> x = {} # creates a new empty dictionary - note the curly brackets denoting the creation of a dictionary
>>> x[4] = "programming" # the string "programming" is added to the dictionary x, with "4" as it's reference
>>> 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)
然后使用这个键调用字典,它会返回存储在该键名下的数据。在本课程中使用 PuLP 建模线性规划时,这种使用字典的 for 循环将非常相关。
列表/元组/字典语法说明
请注意,创建一个:
列表是通过方括号 [] 完成的。
元组使用圆括号和逗号 (,) 来表示;
字典是通过括号{}完成的。
然而,在创建之后,当访问列表/元组/字典中的元素时,操作总是使用方括号进行(即 a[3])。如果 a 是一个列表或元组,这将返回第四个元素。如果 a 是一个字典,它将返回存储在引用键为 3 的数据。
列表推导式
Python 支持列表推导式,这是一种快速且简洁的创建列表的方法,无需使用多行代码。它们在简单的情况下易于理解,并且你将在本课程的代码中使用它们。
>>> 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 中注释
在文件顶部添加注释是通过使用 “”” 开始和结束注释部分。在代码中添加注释是通过在行首使用井号 # 符号。
导入语句
在你打算使用 PuLP 进行建模的所有 Python 代码的顶部,你需要导入语句。这个语句使得另一个模块(程序代码文件)的内容在你当前编写的模块中可用,即在 pulp.py 中定义的函数和值,你将需要调用这些函数和值,它们变得可用。在本课程中,你将使用:
>>> from pulp import *
星号表示你正在从 pulp 模块中导入所有名称。现在可以像在您自己的模块中定义的那样调用 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’。tail 的默认值 ‘end’ 被使用。并且使用了 endmessage 的输入值。注意,end_message 必须指定为关键字参数,因为没有为 tail 提供值。
类
为了演示Python中类的工作方式,请看以下类结构。
类名为 Pattern,它包含几个与 Pattern 类的任何实例(即 Pattern)相关的类变量。这些是函数。
- __init__
创建一个 Pattern 类的实例,并使用 self 分配 name 和 lengthsdict 属性。
- __str__
函数定义了如果类实例被打印时返回的内容。
- 修剪
函数的行为与任何普通函数一样,但与所有类函数一样,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 是一个隐含的输入