想象一下,可能随着游戏的进行,有些外星人会变色且移动速度会加快。必要时,我们可以使用for循环和if语句来修改某些外星人的颜色。例如,要将前三个外星人修改为黄色的、速度为中等且值10个点
6.4.2 在字典中存储列表
在下面的示例中,存储了比萨的两方面信息:外皮类型和配料列表。其中的配料列表是一个与键'toppings'相关联的值。要访问该列表,我们使用字典名和键'toppings',就像访问字典中的其他值一样。这将返回一个配料列表,而不是单个值
我们回忆一下,在列表中存储字典是什么情况(即,列表包含字典)?
alien_0={'color':'green','points':5}
alien_1={'color':'yellow','points':10}
alien_2={'color':'red','points':15} #先设置好三个字典,alien_0,alien_1,alien_2
aliens=[alien_0,alien_1,alien_2] #设置列表aliens,将字典名作为列表元素放入列表中
是这种情况
在字典中包含列表是以下情况:
pizza={
'crust':'thick',
'toppings':['mushroom','extra cheese'],
}
#设置字典pizza,其中设置2个不同的键'crust','toppings'
#而键'toppings'的值设置为一个列表,即,这个键有2个值,翻译过来,就是有2个配料
因此,学到这,总结一下,
(1)列表中存储字典:先设置好各个字典,最后将字典名作为列表元素放入列表中
(2)字典中存储列表:有时,在一个字典中,一个键可能对应几个值,那么,将这几个值放入列表中,而此时,列表是包含在字典中的,因此,叫做字典中存储列表。
习题
6-8 宠物:创建多个字典,对于每个字典,都使用一个宠物的名称来给它命名;在每个字典中,包含宠物的类型及其主人的名字。将这些字典存储在一个名为pets的列表中,再遍历该列表,并将宠物的所有信息都打印出来。
6-9喜欢的地方:创建一个名为favorite_places的字典。在这个字典中,将三个人的名字用作键;对于其中的每个人,都存储他喜欢的1~3个地方。为让这个练习更有趣些,可让一些朋友指出他们喜欢的几个地方。遍历这个字典,并将其中每个人的名字及其喜欢的地方打印出来。
第七章 用户输入和while循环
在本章中,你将学习如何接受用户输入,让程序能够对其进行处理。在程序需要一个名字时,你需要提示用户输入该名字;程序需要一个名单时,你需要提示用户输入一系列名字。为此,你需要使用函数input()。 每当你使用函数input()时,都应指定清晰而易于明白的提示,准确地指出你希望用户提供什么样的信息——指出用户该输入任何信息的提示都行
有时候,提示可能超过一行,例如,你可能需要指出获取特定输入的原因。在这种情况下,可将提示存储在一个变量中,再将该变量传递给函数input()。
input():起到提示的作用。提示用户输入信息,用户输入信息后,就print()了。
如图所示,Python将输入解读成了字符串,因此,输出为'21'
但是不能将输入作为数字使用。
为解决这个问题,可使用函数int(),它让Python将输入视为数值
如何在实际程序中使用函数int()呢?
求模运算符(%)是一个很有用的工具,它将两个数相除并返回余数
小结
当number作为比较运算时,例图中,number%2==0这种情况,此时要
number=int(number)
当number被输出时,即在print()里,此时
print(str(number))
如果一个数可被另一个数整除,余数就为0,因此求模运算符将返回0。你可利用这一点来判断一个数是奇数还是偶数:
7-1 汽车租赁:编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息,如“Let me see if I can find you a Subaru”。
7-2 餐馆订位:编写一个程序,询问用户有多少人用餐。如果超过8人,就打印一条消息,指出没有空桌;否则指出有空桌。
7-3 10的整数倍:让用户输入一个数字,并指出这个数字是否是10的整数倍。
7.2 while循环简介
for循环用于针对集合中的每个元素都一个代码块,而while循环不断地运行,直到指定的条件不满足为止。
7.2.2 让用户选择何时退出
我们创建了一个变量——message,用于存储用户输入的值。我们将变量message的初始值设置为空字符串" ",让Python首次执行while代码行时有可供检查的东西。
这个程序很好,唯一美中不足的是,它将单词'quit'也作为一条消息打印了出来。为修复这种问题,只需使用一个简单的if测试:
7.2.3 使用标志
在游戏中,多种事件都可能导致游戏结束,如玩家一艘飞船都没有了或要保护的城市都被摧毁了。如果在一条while语句中检查所有这些条件,将既复杂又困难。在要求很多条件都满足才继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量被称为标志。
你可让程序在标志为True时继续运行,并在任何事件导致标志的值为False时让程序停止运行。这样,在while语句中就只需检查一个条件——标志的当前值是否为True
7.2.4 使用break 退出循环
要立即退出while循环,不再运行循环中余下的代码,可使用break语句。
例如,来看一个让用户指出他到过哪些地方的程序。在这个程序中,我们可以在用户输入'quit'后使用break语句立即退出while循环:
7.2.5 在循环中使用continue
要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句,它不像break语句那样不再执行余下的代码并退出整个循环。
例如,输出1~10中的奇数
7.3 使用while 循环处理列表和字典
要记录大量的用户和信息,需要在while循环中使用列表和字典。 for循环是一种遍历列表的有效方式,但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用while循环。通过将while循环同列表和字典结合起来使用,可收集、存储并组织大量输入,供以后查看和显示。
7.3.1 在列表中移动元素
但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素。要在遍历列表的同时对其进行修改,可使用while循环。就像前面的代码所写的,for 循环是可以让/confirm/ied_users填充进来元素,但是不会在循环时修改列表。可以用while循环里修改列表。
在第3章中,我们使用函数remove()来删除列表中的特定值,这之所以可行,是因为要删除的值在列表中只出现了一次。如果要删除列表中所有包含特定值的元素,该怎么办呢?
假设你有一个宠物列表,其中包含多个值为'cat'的元素。要删除所有这些元素,可不断运行一个while循环,直到列表中不再包含值'cat',如下所示:
7.3.2 删除包含特定值的所有列表元素
假设你有一个宠物列表,其中包含多个值为'cat'的元素。要删除所有这些元素,可不断运行一个while循环,直到列表中不再包含值'cat'
7.3.3 使用用户输入来填充字典
可使用while循环提示用户输入任意数量的信息。下面来创建一个调查程序,其中的循环每次执行时都提示输入被调查者的名字和回答。我们将收集的数据存储在一个字典中,以便将回答同被调查者关联起来
小总结:for 循环和while 循环的区别:
for 循环不能在循环里修改变量,或者说进行修改操作
而,while循环可以在循环里进行修改操作。
7.4 小结
在本章中,你学习了:如何在程序中使用input()来让用户提供信息;如何处理文本和数字输入,以及如何使用while循环让程序按用户的要求不断地运行;多种控制while循环流程的方式:设置活动标志、使用break语句以及使用continue语句;如何使用while循环在列表之间移动元素,以及如何从列表中删除所有包含特定值的元素;如何结合使用while循环和字典。 在第8章中,你将学习函数。函数让你能够将程序分成多个很小的部分,其中每部分都负责完成一项具体任务。你可以根据需要调用同一个函数任意次,还可将函数存储在独立的文件中。使用函数可让你编写的代码效率更高,更容易维护和排除故障,还可在众多不同的程序中重用。
第8章 函数
需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用执行该任务的函数,让Python运行其中的代码。
8.1.2 实参和形参
在函数greet_user()的定义中,变量username是一个形参——函数完成其工作所需的一项信息。在代码greet_user('jesse')中,值'jesse'是一个实参。实参是调用函数时传递给函数的信息。我们调用函数时,将要让函数使用的信息放在括号内。在greet_user('jesse')中,将实参'jesse'传递给了函数greet_user(),这个值被存储在形参username中。
8.2 传递实参
鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多。
8.2.1 位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。
来看一个显示宠物信息的函数。这个函数指出一个宠物属于哪种动物以及它叫什么名字
调用函数多次
~~~~提示:函数可以被调用多次。
调用函数多次是一种效率极高的工作方式。我们只需在函数中编写描述宠物的代码一次,然后每当需要描述新宠物时,都可调用这个函数,并向它提供新宠物的信息。
位置实参的顺序很重要
使用位置实参来调用函数时,如果实参的顺序不正确,结果也会弄反
8.2.2 关键字实参 (使用关键字实参时,务必准确地指定函数定义中的形参名。 )
8.2.3 默认值
编写函数时,可给每个形参指定默认值。
在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。
因此,给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用
8.2.4 等效的函数调用
下面对这个函数的所有调用都可行:
8.2.5 避免实参错误
8.3 返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。
8.3.1 返回简单值
记住:return 和 变量是对应关系(return——变量)
8.3.2 让实参变成可选的
例如,假设我们要扩展函数get_formatted_name(),使其还处理中间名。
然而,并非所有的人都有中间名,为让中间名变成可选的,可给实参middle_name指定一个默认值——空字符串,为让get_formatted_name()在没有提供中间名时依然可行,可给实参middle_name指定一个默认值——空字符串,并将其移到形参列表的末尾
8.3.3 返回字典
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。
8.3.4 结合使用函数和 while 循环
下面将结合使用函数get_formatted_name()和while循环,以更正规的方式问候用户。下面尝试使用名和姓跟用户打招呼。
但这个while循环存在一个问题:没有定义退出条件。请用户提供一系列输入时,该在什么地方提供退出条件呢?我们要让用户能够尽可能容易地退出,因此每次提示用户输入时,都应提供退出途径。每次提示用户输入时,都使用break语句提供了退出循环的简单途径。
8.4 传递列表
将一个名字列表传递给一个名为greet_users()的函数,这个函数问候列表中的每个人。
8.4.1 在函数中修改列表
将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。
来看一家为用户提交的设计制作3D打印模型的公司。需要打印的设计存储在一个列表中,打印后移到另一个列表中。
我们可编写两个函数第一个函数将负责处理打印设计的工作,而第二个将概述打印了哪些设计。
8.4.2 禁止函数修改列表
有时候,需要禁止函数修改列表。。你可能会做出这样的决定:即便打印所有设计后,也要保留原来的未打印的设计列表,以供备案。但由于你将所有的设计都移出了unprinted_designs,这个列表变成了空的,原来的列表没有了。为解决这个问题,可向函数传递列表的副本而不是原件。
切片表示法[:]创建列表的副本。在print_models.py中,如果不想清空未打印的设计列表,
可像下面这样调用print_models():
print_models(unprinted_designs[:], completed_models)
这样函数print_models()依然能够完成其工作,但它使用的是列表unprinted_designs的副本,而不是列表unprinted_designs本身。像以前一样,列表completed_models也将包含打印好的模型的名称,但函数所做的修改不会影响到列表unprinted_designs。
8.5 传递任意数量的实参
下面的函数只有一个形参*toppings,但不管调用语句提供了多少实参,这个形参都将它们统统收入囊中。
形参名*toppings中的星号(*)让Python创建一个名为toppings的空元组,并将收到的所有值都封
装到这个元组中。(因此,别忘了给形参加上*(星号),即形参*toppings)
注意,Python将实参封装到一个元组中
不管收到的是一个值还是三个值,这个函数都能妥善地处理,不管函数收到的实参是多少个,这种语法都管用。
8.5.1 结合使用位置实参和任意数量实参
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。
例如,如果前面的函数还需要一个表示比萨尺寸的实参,必须将该形参放在形参*toppings的前面
8.5.2 使用任意数量的关键字实参
8.6 将函数存储在模块中
8.6.1 导入整个模块
函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。
第九章 类
使用面向对象编程可模拟现实情景,其逼真程度达到了令你惊讶的地步。
9.1 创建和使用类
使用类可以模拟事物,比如创建一个表示小狗的类。对于大多数宠物狗来说,有年龄和名字,会蹲下和打滚。
9.1.1 创建 Dog 类
根据约定,在Python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。
方法__init__():类中的函数称为方法。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。我们将通过实参向Dog()传递名字和年龄;self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。
9.1.2 根据类创建实例
9.2 使用类和实例
你可以使用类来模拟现实世界中的很多情景。类编写好后,你的大部分时间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性。你可以直接修改实例的属性,也可以编写方法以特定的方式进行修改。
9.2.1 Car 类
9.2.2 给属性指定默认值
9.2.3 修改属性的值
9.3 继承
9.3.1 子类的方法__init__()
9.3.2 Python 2.7 中的继承
9.3.3 给子类定义属性和方法
9.3.4 重写父类的方法
9.3.5 将实例用作属性
9.3.6 模拟实物
9.4 导入类
9.4.1 导入单个类
9.4.2 在一个模块中存储多个类
9.4.3 从一个模块中导入多个类
9.4.4 导入整个模块
9.4.5 导入模块中的所有类
9.4.6 在一个模块中导入另一个模块
9.4.7 自定义工作流程
9.5 Python 标准库



