python7、8章
第七章 用户输入和while循环
7.1 函数input()的工作原理
函数input()会让程序暂停一会,等待用户输入一些文本。获取用户输入的文本后,python将其存储在一个变量中,以方便我们使用。
函数input()接收一个参数:即要向用户显示的提示或说明,让用户知道如何做。输入变量存储在message。
7.1.1 编写清晰的程序
可以在冒号后面空格,让用户清除从哪开始的。
上面的图演示了一种创建多行字符串的方式。第一行将消息的前半部分存储在变量nn中;在第二行,运算符+=在存储在nn中的字符串末尾附加字符串(自己理解感觉像C语言的+=。就是nn=前半部分+后半部分我们输入的)
7.1.2 使用int()来获取数值输入
分析:
使用函数input()时,python将用户的输入解读为字符串。
我们输入21,python提供值时,返回的时‘21’,但如果按照之前的判断,应该出现false,但是却报错,因为python无法将字符串和整数进行比较,所以字符‘21’不能和19比较
结果:
所以我们可以使用int()函数,他会让python输入的为数值。
函数int()将数字的字符串转化为数值表示。
把它运用到现实生活中。。。
7.1.3 求模运算符
处理数值信息,求模运算符(%)是好用的工具。就是相除返回余数
制作一个求模的方案:
输入的时候忘记了“+str(shu)+”。。。。。
msg = input("请输入您要租赁的汽车名称:")
print("Let me see if I can find you a " + msg)
感觉这样的不用加也行在末尾。。感觉好简便,打脸了。。。。
7.1.4 在python2.7中获取输入
不是用input(),使用函数raw_input()来提示用户输入。并且与python3的一样,将输入解读为字符串。
7.2 while循环简介
for循环用于针对集合的每个元素的一个代码块,而while循环不断地运行,知道不满足。
7.2.1 使用while循环
不解释。。。
7.2.2 让用户选择何时退出
只有输入quit才可以退出,不然就一直循环
我们创建了一个变量--message,让python首次执行while代码行时有可检查的东西。python首次执行while语句时,需要将message的值与‘quit’比较。
进一步修改美化,让quit消息不打印出来。
而是直接退出。
7.2.3 使用标志
在要求很多条件都满足才能继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量被称为标志
它可以控制程序是否可以进行。
用active作为标志,(ture,false首字母必须大写,别能小写,不然会报错。)如果用户输入‘quit’,我们就将变量active设置为False,这就会导致while循环不再执行。
7.2.4 使用break退出循环
要立即退出while循环,不再运行循环中余下的代码,不管条件测试结果如何,可使用break。
以while Ture开头的循环,只有遇到break才会停。
在这个程序中,只有输入quit才可以终止当前的循环。以至于python退出循环。
brwak语句也可以用来退出遍历列表或字典的for循环。
7.2.5 在循环中使用continue
要返回到循环开头,并根据条件测试结果决定是否继续执行循环。
不像break直接跳出循环,它是跳过,类似C语言的continue
1到10的奇数:
不解释。。。
7.2.6 避免无线循环
x=1
while x <5 :
print(x)
如果在正在循环中,可以用ctrl+c,也可以关闭显示程序输出的终端窗口
这是一道习题,之前一直都是用msg变量,不变,就会出现上一回的输入值在下一循环中,所以要用两个变量。。
7.3 使用while循环来处理列表和字典
通过将while循环同列表、字典结合在一起,可收集、存储并组织大量输入,以供以后查看和显示。
7.3.1 在列表之间移动元素
不解释。。。
7.3.2 删除包含特定值的所有列表元素
在第三章,用方法remove()删除特定值,要删除列表中的所有包含特定值的元素需要---
用while循环再附加方法remove()
直到列表中不再次出现remove的值,就停止循环。
7.3.3 使用用户输入来填充字典
结果
看着这一题,有点迷惑,在问过大佬之后,明白了。
在responses[name]中,我们只添加了变量name的输入值给字典,为啥会在倒数第二行有name和response的用法,这里我迷了,因为字典的不熟悉掌握,在重新看一遍后,知道了,键-值对。。。。。。。。。。。。。。。。。。。。
第八章 函数
函数就是带名字的代码块,用于完成具体的工作。
最喜欢这一章了,感觉很有意思,哈哈哈哈,呜呜呜呜
8.1 定义函数
这是一个简单的函数结构,第一行的代码使用关键字def告诉python你需要定义一个函数。然后向python指出了函数名。在这儿,函数名为greet(),它不需要任何信息就能完成其工作,因为kuohaoshikongde(即便是这样,也不能少括号),最后,定义以冒号结尾。
感觉类似C语言的定义宏那样
紧跟在def gret():后面的缩进成了函数体,greet()只工作一项:打印cao。。。。。。
要使用这个函数,首先我们需要调用它。
要调用函数,必须依次指定函数名和括号括起来的信息。
8.1.1 向函数传递信息
在括号里面添加name,就可以让函数接受你给的name指定的任何值。现在,这个函数要求我们调用它是给name指定一个值。
调用greet()时,可以将一个名字传递给他。就像上面的一样。
代码greet('youxiu')调用函数greet(),并向他提供执行print语句所需要的信息。
调用时无论传输什么名字,都会生成相对应的输出。
8.1.2 实参和形参
在上面的距举例中,变量name是一个形参--函数完成其工作所需一项信息。
在代码greet('youxiu')中,'youxiu'是一个实参。
实参是调用函数是传递给函数的信息。
原理:我们调用函数,将要让函数使用的信息存放在括号内。在greet('youxiu')中,将实参'youxiu'传递给函数greet(),这个值被存储在形参name中。
也可以在def那里,定义两个形参
8.2 传递实参
8.2.1 位置实参
位置实参
调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参,因此,最简单的关联方式是基于实参的顺序。
容易出错的地方:忘记def末尾后的:冒号
实参的引号
1.调用函数多次
在下一行接着按照最后一行的这样的格式输入就行
在函数中,可根据需要使用任意数量的位置实参,python将按照顺序将函数调用中的实参关联到函数定义中的相应的形参。
2.位置实参的顺序很重要
确认函数调用中实参的顺序与函数定义中的形参的顺序一样。
8.2.2 关键字实参
关键字实参:
是传递给函数的名称-值对。可以直接在实参中将名称与值关联起来,因此向函数传递实参时不会混淆。
关键字实参的顺序无关紧要,因为python知道各个值该存储到那个形参中。所以是等效的在上面的图中。
务必要准确的指出函数定义的形参名
8.2.3 默认值
编写函数时,可以给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则,将使用形参的默认值。
调用这个函数,如果没有给它指定值,python就把这个形参设置为beibei
想上面的我们只用了一个实参的dog,在没有特殊声明的情况下,都是按照顺序来实参对应形参,所以name的形参就是默认值。
8.2.4 等效的函数调用
使用哪种都一样,符合自己的习惯就行,我感觉当形参少时,用简约的’‘,多的话就用形参名子的那个。
8.2.5 避免实参错误
当提供的实参多或者少于函数完成其工作所需的信息时,将出现实参不匹配。
python发现该函数调用缺少必要的信息,而traceback指出了这一点
第二行指出问题所在地
第三行指出函数调用出现了问题
第四行说我们少了两个实参,并指出了相应的形参的名称。
8.3 返回值
函数并不是直接显示输出,有时,它可以处理一些数据,返回一个、组的值。函数返回的值称为返回值。。。
8.3.1 返回简单值
这个输出Chen Youxiu
在需要分别存储大量名和姓的程序中,像这样的函数灰常好用,
8.3.2 让实参变成可选的
有时只提供了now,last,没有提供lasted,他将会不能正常的运行。通过等于lasted=’ ‘来让其变成可选,可给其值提供一个默认值,空字符串,并在用户不输入的时候使用这个实参。
可选值让函数能够处理各种不同情况的同时,确保函数尽可能地调用
8.3.3 返回字典
person()接受now和last,并将这些值封装到字典中。存储在now时,使用键’now‘。。最后原来的两项文本信息存储在一个字典中
8.3.4 结合使用函数和while循环
对这个代码的解释:可以把前三行当成一个代码块,就是把下面输入的实参变成首字母大写,并加起来。
下面用了一个无限循环,当输入q才会停止。前三行的结果给了全名,然后打印
编写一个名为make_album() 的函数, 它创建一个描述音乐专辑的字典。
# 这个函数应接受歌手的名字和专辑名, 并返回一个包含这两项信息的字典。 使用这个函数创建三个表示不同专辑的字典,
# 并打印每个返回的值, 以核实字典正确地存储了专辑的信息。给函数make_album() 添加一个可选形参,
# 以便能够存储专辑包含的歌曲数。 如果调用这个函数时指定了歌曲数, 就将这个值添加到表示专辑的字典中。 调用这个
# 函数, 并至少在一次调用中指定专辑包含的歌曲数。
def make_album(singer_name,album_name,song_number = ''):
if song_number:
s_a = {'singer_name':singer_name,'album_name':album_name,'song_number' : song_number}
else:
s_a = {'singer_name':singer_name,'album_name':album_name}
return s_a
a = make_album('HanHong','QingZangGaoYuan','5')
b = make_album('AndiLiu','WangQingShui')
c = make_album('LiuHuan','YouAndMe','7')
print(a)
print(b)
print(c)
# 8-8 用户的专辑 : 在为完成练习8-7编写的程序中, 编写一个while 循环, 让用户输入一个专辑的歌手和名称。
# 获取这些信息后, 使用它们来调用函数make_album() , 并将创建的字典打印出来。 在这个while 循环中, 务必要提供退出途径。
def make_album(singer_name,album_name,song_number = ''):
if song_number:
s_a = {'singer_name':singer_name,'album_name':album_name,'song_number' : song_number}
else:
s_a = {'singer_name':singer_name,'album_name':album_name}
return s_a
s_n_inp = '请输入歌手名:(输入’quit‘后退出)'
a_n_inp = '请输入专辑名:(输入’quit‘后退出)'
ac = True
while ac:
a = input(s_n_inp)
b = input(a_n_inp)
if a == 'quit' or b == 'quit' :#前面感觉也可以用,忘了用了。。。。。。
break#或者ac=False也可以。。
else:
c = make_album(a,b)
print(c)
8.4 传递列表
将列表传递给函数后,函数就能直接访问其内容。
我们将greet()定义成接收的列表,并将其存储在names中。这个函数遍历收到的列表,并对其中的每一位用户都打印一条问候语。
出错点:关键字def最后面忘记加:
for缩进
8.4.1 在函数中修改列表
讲的就是分步函数,即每个函数都对应负责一项具体的工作。有两个,这样优于使用一个函数来完成工作。并且类似C语言指针的调用,这有助于键更复杂的任务划分成一系列的步骤。
8.4.2 进制禁止函数修改列表
有时候,需要禁止函数修改列表。可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,丝毫不影响原件。
要将列表的副本传给函数
function_name(list_name[:])
切片表示法[:]创建列表的副本。
这一节有点迷。。。
迷归来了,虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由传递副本,否则还是应该将原始列表传递给函数,因为让函数实现现成列表可以避免花费时间和创建副本。
# 8-10 了不起的魔术师 : 在你为完成练习8-9而编写的程序中, 编写一个名为make_great() 的函数,
# 对魔术师列表进行修改, 在每个魔术师的名字中都加入字样“theGreat”。 调用函数show_magicians() , 确认魔术师列表确实变了。
name_list = ['mag1','mag2','mag3']
name_change = []
def make_great(name_list,name_change):
while name_list:
cur = name_list.pop()
cur = 'thegreat' + cur
name_change.append(cur)#上面是对name——list和name——change的转移
def show_magicians(name_change):
for name in name_change:
print(name) #这个开始打印
make_great(name_list,name_change)
show_magicians(name_change)
# 8-11 不变的魔术师 : 修改你为完成练习8-10而编写的程序, 在调用函数make_great() 时, 向它传递魔术师列表的副本。
# 由于不想修改原始列表, 请返回修改后的列表, 并将其存储到另一个列表中。 分别使用这两个列表来调用show_magicians() ,
# 确认一个列表包含的是原来的魔术师名字, 而另一个列表包含的是添加了字样“the Great”的魔术师名字。
name_list = ['mag1','mag2','mag3']
name_change = []
def make_great(name_list,name_change):
while name_list:
cur = name_list.pop()
cur = 'great' + cur
name_change.append(cur)#上面是对name——list和name——change的转移
def show_magicians(name_change):
for name in name_change:
print(name) #这个开始打印
make_great(name_list[:],name_change)
show_magicians(name_change)
show_magicians(name_list)
8.5 传递任意数量的实参
形参名*cai中的星号让python创建一个名为cai的空元组,并将收到的所有值都封装到这个元组中。输出证明:python能够处理使用一个值调用函数的情形,也能处理三个值来调用的情形。
8.5.1 结合使用位置实参和任意数量实参
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都收集到最后的一个形参中。
8.5.2 使用任意数量的关键字实参
有时候,需要接受任意数量的实参,但不知道传递给函数的是什么样的信息。我们可以用函数编写成能够接受任意数量的键-值对---调用语句提供了多少就接受多少。
形参**user是把除了对first,last之外的形参都放里面封装,并且该代码是遍历字典的中的键-值对,并将每个键-值对都加入字典profile中。最后字典返回给函数行调用。
# 8-12 三明治 : 编写一个函数, 它接受顾客要在三明治中添加的一系列食材。 这个函数只有一个形参(它收集函数调用中提供的所有食材) ,
# 并打印一条消息, 对顾客点的三明治进行概述。 调用这个函数三次, 每次都提供不同数量的实参。
def sand_make(*ingredients):
print( '添加的食材有:')
for i in ingredients:
print('--' + i)
sand_make('1','2','3','4')
sand_make('0')
sand_make('1','2')
任意数量的实参。。
# 8-13 用户简介 : 复制前面的程序user_profile.py, 在其中调用build_profile() 来创建有关你的简介;
# 调用这个函数时, 指定你的名和姓, 以及三个描述你的键-值对。
def profile(name,location,**user):
profile={}
profile['name']=name
profile['location']=location
for key,value in user.items():
profile[key]=value
return profile
my=profile('mayun','aliba',company='zhejiang',xueli='bigger')
print(my)
mht=profile('mahuateng','tencent',company='shenzhen',xueli='bigger')
print(mht)
使用的是任意数量的关键字实参。
8.6 将函数存储在模块中
函数的优点之一:他们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序更容易理解的多。
还可以,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。
import语句允许在当前运行的程序文件中使用模块中的代码。
8.6.1 导入整个模块
首先需要创建模块。模块的拓展名为.py,包含要导入到程序的代码。
我的notepad++我不会导,这一节就过了,后期用pycharm再补过来
8.6.2 导入特定函数
from model import fuction
如果有多个功能,在后面用逗号分开添加。
jiafa.py
def jia(a,b):
print(a+b)
不使用导入特定函数,就得在调用中输入
import jiafa
jiafa.jia(1,3)
如果使用了,就会有
from jiafa import jia
jia(1,2)
由于我们在import语句中显示的导入了函数jia,因此调用它只要指定其名称就行。
8.6.3 使用as给函数指定别名
如果要导入的函数名称可能与程序中的现有的名称冲突,或者函数名称太长,可指定简短而独一无二的别名--函数的宁一个名称,相当于外号吧。。
接上面的jiafa.py的例子
from jiafa import jia as jiajia
jiajia(1,2)
8.6.4 使用as给模块指定别名
还可以给模块指定别名。。。
接上面的jiafa.py例子
import jiafa as j
j.jia(1,2)
8.6.5 导入模块中的所有函数
使用骂人号*可以让python导入模块的所有函数。
import jiafa import *
jia(1,2)
由于导入了每个函数,可通过名称来调用每个函数,而无须使用句号表示法
8.7 函数编写指南
给形参指定默认值时,等号两边不要有空格(我所有的从来不加空格)
对于函数调用中的关键字实参,也应遵循这种约定
所有的import语句都应放在文件开头