python7、8章

第七章 用户输入和while循环

7.1 函数input()的工作原理

函数input()会让程序暂停一会,等待用户输入一些文本。获取用户输入的文本后,python将其存储在一个变量中,以方便我们使用。

image-20210119141419921

函数input()接收一个参数:即要向用户显示的提示或说明,让用户知道如何做。输入变量存储在message。

7.1.1 编写清晰的程序

image-20210119141838661

可以在冒号后面空格,让用户清除从哪开始的。

image-20210119142216885

上面的图演示了一种创建多行字符串的方式。第一行将消息的前半部分存储在变量nn中;在第二行,运算符+=在存储在nn中的字符串末尾附加字符串(自己理解感觉像C语言的+=。就是nn=前半部分+后半部分我们输入的)

7.1.2 使用int()来获取数值输入
分析:

使用函数input()时,python将用户的输入解读为字符串。

image-20210119142707996

我们输入21,python提供值时,返回的时‘21’,但如果按照之前的判断,应该出现false,但是却报错,因为python无法将字符串和整数进行比较,所以字符‘21’不能和19比较

结果:

所以我们可以使用int()函数,他会让python输入的为数值。

函数int()将数字的字符串转化为数值表示。

image-20210119143206940

image-20210119143606146

把它运用到现实生活中。。。

7.1.3 求模运算符

处理数值信息,求模运算符(%)是好用的工具。就是相除返回余数

image-20210119143841346

制作一个求模的方案:

image-20210119144318318

输入的时候忘记了“+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循环

image-20210119145241196

不解释。。。

7.2.2 让用户选择何时退出

image-20210119160034392

只有输入quit才可以退出,不然就一直循环

我们创建了一个变量--message,让python首次执行while代码行时有可检查的东西。python首次执行while语句时,需要将message的值与‘quit’比较。

进一步修改美化,让quit消息不打印出来。

image-20210120121821869

而是直接退出。

7.2.3 使用标志

在要求很多条件都满足才能继续运行的程序中,可定义一个变量,用于判断整个程序是否处于活动状态。这个变量被称为标志

它可以控制程序是否可以进行。

image-20210120122458997

用active作为标志,(ture,false首字母必须大写,别能小写,不然会报错。)如果用户输入‘quit’,我们就将变量active设置为False,这就会导致while循环不再执行。

7.2.4 使用break退出循环

要立即退出while循环,不再运行循环中余下的代码,不管条件测试结果如何,可使用break。

image-20210120123252581

以while Ture开头的循环,只有遇到break才会停。

在这个程序中,只有输入quit才可以终止当前的循环。以至于python退出循环。


brwak语句也可以用来退出遍历列表或字典的for循环。

7.2.5 在循环中使用continue

要返回到循环开头,并根据条件测试结果决定是否继续执行循环。

不像break直接跳出循环,它是跳过,类似C语言的continue

1到10的奇数:

image-20210120123902252

不解释。。。

7.2.6 避免无线循环

x=1

while x <5 :

print(x)

如果在正在循环中,可以用ctrl+c,也可以关闭显示程序输出的终端窗口

image-20210120133624159

这是一道习题,之前一直都是用msg变量,不变,就会出现上一回的输入值在下一循环中,所以要用两个变量。。

7.3 使用while循环来处理列表和字典

通过将while循环同列表、字典结合在一起,可收集、存储并组织大量输入,以供以后查看和显示。

7.3.1 在列表之间移动元素

image-20210120141322508

不解释。。。

7.3.2 删除包含特定值的所有列表元素

在第三章,用方法remove()删除特定值,要删除列表中的所有包含特定值的元素需要---

用while循环再附加方法remove()

image-20210120141852686

直到列表中不再次出现remove的值,就停止循环。

7.3.3 使用用户输入来填充字典

image-20210120144310980

结果

image-20210120144325751

看着这一题,有点迷惑,在问过大佬之后,明白了。

在responses[name]中,我们只添加了变量name的输入值给字典,为啥会在倒数第二行有name和response的用法,这里我迷了,因为字典的不熟悉掌握,在重新看一遍后,知道了,键-值对。。。。。。。。。。。。。。。。。。。。

第八章 函数

函数就是带名字的代码块,用于完成具体的工作。

最喜欢这一章了,感觉很有意思,哈哈哈哈,呜呜呜呜

C4EA56C61519D2913C0B9D7B4D29C956

8.1 定义函数

image-20210121113008398

这是一个简单的函数结构,第一行的代码使用关键字def告诉python你需要定义一个函数。然后向python指出了函数名。在这儿,函数名为greet(),它不需要任何信息就能完成其工作,因为kuohaoshikongde(即便是这样,也不能少括号),最后,定义以冒号结尾

感觉类似C语言的定义宏那样

紧跟在def gret():后面的缩进成了函数体,greet()只工作一项:打印cao。。。。。。

要使用这个函数,首先我们需要调用它。

要调用函数,必须依次指定函数名和括号括起来的信息。

8.1.1 向函数传递信息

image-20210121113832474

在括号里面添加name,就可以让函数接受你给的name指定的任何值。现在,这个函数要求我们调用它是给name指定一个值。

调用greet()时,可以将一个名字传递给他。就像上面的一样。

代码greet('youxiu')调用函数greet(),并向他提供执行print语句所需要的信息。

调用时无论传输什么名字,都会生成相对应的输出。

8.1.2 实参和形参

在上面的距举例中,变量name是一个形参--函数完成其工作所需一项信息。

在代码greet('youxiu')中,'youxiu'是一个实参。

实参是调用函数是传递给函数的信息。

原理:我们调用函数,将要让函数使用的信息存放在括号内。在greet('youxiu')中,将实参'youxiu'传递给函数greet(),这个值被存储在形参name中。

也可以在def那里,定义两个形参

image-20210121125854038

8.2 传递实参

8.2.1 位置实参

位置实参

调用函数时,python必须将函数调用中的每个实参都关联到函数定义中的一个形参,因此,最简单的关联方式是基于实参的顺序。

image-20210121130718870

容易出错的地方:忘记def末尾后的:冒号

实参的引号

1.调用函数多次

在下一行接着按照最后一行的这样的格式输入就行

在函数中,可根据需要使用任意数量的位置实参,python将按照顺序将函数调用中的实参关联到函数定义中的相应的形参。

2.位置实参的顺序很重要

确认函数调用中实参的顺序与函数定义中的形参的顺序一样。

8.2.2 关键字实参

关键字实参:

是传递给函数的名称-值对。可以直接在实参中将名称与值关联起来,因此向函数传递实参时不会混淆。

2948B6D51C46E630EC3CC578603E4C87image-20210121131531859

关键字实参的顺序无关紧要,因为python知道各个值该存储到那个形参中。所以是等效的在上面的图中。

务必要准确的指出函数定义的形参名

8.2.3 默认值

编写函数时,可以给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则,将使用形参的默认值。

image-20210121132120000

调用这个函数,如果没有给它指定值,python就把这个形参设置为beibei

想上面的我们只用了一个实参的dog,在没有特殊声明的情况下,都是按照顺序来实参对应形参,所以name的形参就是默认值。

8.2.4 等效的函数调用

使用哪种都一样,符合自己的习惯就行,我感觉当形参少时,用简约的’‘,多的话就用形参名子的那个。

8.2.5 避免实参错误

当提供的实参多或者少于函数完成其工作所需的信息时,将出现实参不匹配。

image-20210121133036045

python发现该函数调用缺少必要的信息,而traceback指出了这一点

第二行指出问题所在地

第三行指出函数调用出现了问题

第四行说我们少了两个实参,并指出了相应的形参的名称。

8.3 返回值

函数并不是直接显示输出,有时,它可以处理一些数据,返回一个、组的值。函数返回的值称为返回值。。。

BEE244B6F6DEEC0F11D48D8414C0A2B9

8.3.1 返回简单值

image-20210121135109714

这个输出Chen Youxiu

在需要分别存储大量名和姓的程序中,像这样的函数灰常好用,

8.3.2 让实参变成可选的

image-20210121141214952

image-20210121141227279

有时只提供了now,last,没有提供lasted,他将会不能正常的运行。通过等于lasted=’ ‘来让其变成可选,可给其值提供一个默认值,空字符串,并在用户不输入的时候使用这个实参。

可选值让函数能够处理各种不同情况的同时,确保函数尽可能地调用

8.3.3 返回字典

image-20210121142855372

person()接受now和last,并将这些值封装到字典中。存储在now时,使用键’now‘。。最后原来的两项文本信息存储在一个字典中

8.3.4 结合使用函数和while循环

image-20210121144146602

对这个代码的解释:可以把前三行当成一个代码块,就是把下面输入的实参变成首字母大写,并加起来。

下面用了一个无限循环,当输入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 传递列表

将列表传递给函数后,函数就能直接访问其内容。

image-20210122111836744

我们将greet()定义成接收的列表,并将其存储在names中。这个函数遍历收到的列表,并对其中的每一位用户都打印一条问候语。

出错点:关键字def最后面忘记加:

for缩进

8.4.1 在函数中修改列表

讲的就是分步函数,即每个函数都对应负责一项具体的工作。有两个,这样优于使用一个函数来完成工作。并且类似C语言指针的调用,这有助于键更复杂的任务划分成一系列的步骤。

8.4.2 进制禁止函数修改列表

有时候,需要禁止函数修改列表。可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,丝毫不影响原件。

要将列表的副本传给函数

function_name(list_name[:])

切片表示法[:]创建列表的副本。

这一节有点迷。。。

4728609883431DEEAB3A45D31024FA69

迷归来了,虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由传递副本,否则还是应该将原始列表传递给函数,因为让函数实现现成列表可以避免花费时间和创建副本。

# 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)

image-20210122125623388

8.5 传递任意数量的实参

image-20210122125951952

形参名*cai中的星号让python创建一个名为cai的空元组,并将收到的所有值都封装到这个元组中。输出证明:python能够处理使用一个值调用函数的情形,也能处理三个值来调用的情形。

8.5.1 结合使用位置实参和任意数量实参

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都收集到最后的一个形参中。

8.5.2 使用任意数量的关键字实参

有时候,需要接受任意数量的实参,但不知道传递给函数的是什么样的信息。我们可以用函数编写成能够接受任意数量的键-值对---调用语句提供了多少就接受多少。

image-20210122132545171

image-20210122132556745

形参**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')

image-20210122133017697

任意数量的实参。。

# 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)

image-20210122133606053

使用的是任意数量的关键字实参。

8.6 将函数存储在模块中

函数的优点之一:他们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序更容易理解的多。

还可以,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。

import语句允许在当前运行的程序文件中使用模块中的代码。

8.6.1 导入整个模块

首先需要创建模块。模块的拓展名为.py,包含要导入到程序的代码。

image-20210122140437793

image-20210122140530082

image-20210122142207348

我的notepad++我不会导,这一节就过了,后期用pycharm再补过来

6ACB06B229233066A42BCC353AF42DC3

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语句都应放在文件开头

posted @ 2021-01-22 14:43  testadm1n  阅读(253)  评论(0编辑  收藏  举报